A radio up the hill, a 27-inch kiosk, and 1,000 amp-hours

Three things are on the truck this week, and they are not related except that
they are all the same project.

Three builds in flight

1. Getting water-tank data down a wooded hill

The tanks sit a few hundred yards up a hill, in trees. At the bottom you can
catch a wisp of Wi-Fi. At the top, nothing usable. No hard wire — it is over
a hundred yards of ground I am not trenching.

The instinct is to push harder at Wi-Fi. That is the wrong direction.
The answer is to go lower in frequency.

LoRa versus Wi-Fi link budget through trees

Same distance, same trees, same antennas. The difference is physics: leaves are
full of water, and water eats 2.4 GHz. At 915 MHz it walks through. And
LoRa’s receiver hears down to −137 dBm, roughly 5,000
times fainter than Wi-Fi can manage, because it trades bandwidth for sensitivity.

That trade is free here. I need about ten bytes an hour. I could
almost send it by banging on a pan.

So: a pair of 915 MHz LoRa nodes, an ultrasonic sensor looking down at the
water, a small solar panel and a battery. No inverter — a typical inverter
idles at 5–20 W, which is a hundred times what the radio draws.
It would have been the largest load in the system by an order of magnitude, powering
nothing but itself.

2. A 27-inch touchscreen at the house

A kiosk. Home screen with everything worth seeing at a glance; tap anything and
it opens the deeper view. Inverters, battery, tank level, temperature and humidity,
heat and cooling control, settings.

One data pipe, many faces

The important part is the left side of that diagram, not the right. Every source
lands in one table, and the screens are just windows onto it. The
touchscreen and the phone app read the same pipe, so they cannot disagree with each
other.

And it is wired to the hardware — RS485 to the inverters,
Ethernet to the Victron — not scraped out of a vendor cloud. That matters
because the clouds are slow and lossy: Victron’s HTTP endpoint hands you a reading
about every 105 seconds no matter how nicely you ask, and the inverter portal answers
a date query with today’s numbers regardless of the date. Both of those cost me a
correction on this blog already.

3. 1,000 amp-hours

The battery expansion hardware has landed: a 400 A DC breaker, 2/0 welding
cable, copper lugs. Ten 100 Ah modules, 200 A fusing each, a 900 A
busbar, four 2/0 runs back to the inverters.

The unglamorous thing I found while writing this

I went to check what history the database had, so the kiosk would have months of
graphs to draw. Here is the whole of it:

samples        1,456 rows   2026-09-10  ->  2026-09-12
samples_1min     110 rows   2026-09-12  ->  2026-09-12
samples_1hour     40 rows   2026-09-12  ->  2026-09-12

The logger died on September 12 and nobody noticed for fifteen days.

The database is fine. The schema is genuinely good — a hypertable with
rollups at one minute and one hour, which is what makes a ninety-day query cheap.
Postgres and Grafana both run as proper Windows services and have been up the whole
time.

The thing that actually writes the samples was never installed as a
service. It was run by hand once, and it died with the window it was running in.

So I am about to build a beautiful dashboard for data I am not collecting. That
is the funny version. The real version is worse: history only accumulates
forward.
Every day that collector stays down is a day of resolution that
cannot be recovered, at any price, ever. You cannot backfill a battery’s behaviour
at 3 a.m. on a night that has already happened.

Which makes the priority order obvious, and it is not the touchscreen.

O N W A R D


Link budget computed from free-space path loss at 400 m plus published
foliage attenuation figures, not measured — the real numbers get posted once
the radios are on the hill. Everything else here is hardware that exists and is
either delivered or on a truck.