Engineering journal

Build notes, dated and honest

What worked, what fought back, and what it taught us. Newest first. If a claim is here, it happened on real hardware on the date written.

2026–07–21

The town node learns where and when it is

The concentrator HAT carries a u-blox GPS, so the town node now resolves its own position at startup — and falls back to its configured location gracefully when the sky is cold. The fix also disciplines the system clock through gpsd + chrony: online, NTP wins; offline, GPS carries time alone. That second part matters more than it sounds — every message in this mesh has an expiry, and a disaster-mode node with no internet still needs to be right about what time it is.

One trap for fellow travellers: on current Raspberry Pi OS the login console owns the UART by default and spams the GPS with login prompts — the GPS politely answers every one with an “unknown message” complaint. Evict the console before you trust your wiring diagnosis.

2026–07–20

Both directions in one evening

The milestone we’d been building toward: a driver taps Report on the car device, and the frame decodes at the town node’s concentrator — then the town node injects a hazard and it renders on the car’s screen. Both tiers, both directions, over the air at 915 MHz, first try each way once the radio came up.

[rx OK ] Crash 01E1902F/1 hops=0 rssi=-46 snr=9.2 … "your report"
[inject] tx Weather sev2 … ttl=6272s "Heat Advisory"
— a real National Weather Service advisory, riding the mesh

The town node itself is a second-hand LoRaWAN gateway given a new job — a Raspberry Pi with an SX1302 concentrator. Bring-up was a fight worth documenting: the vendor reset script silently no-ops on current OS releases (the legacy GPIO interface is gone), and the reference HAL refuses to start without a temperature sensor this board doesn’t have. Both fixes are small, neither is guessable. They ship in our provisioning script.

Bonus mystery solved: our car radio’s transmissions had looked dead for two weeks. The concentrator heard them instantly, loud and clear — the USB test dongles we’d been listening with silently discard any frame not in their own private on-air format. The transmitter was never broken; the witness was deaf.

2026–07–19

The car device gets ears

The SX1262 radio HAT on the car device now receives cleanly over the air. The unlock was the antenna switch: its two control lines must be driven as complements, and every plausible “both high” or “both low” state is silence by design. One polarity fix took receive strength from barely-coupling to full signal.

Also filed under hard-won: the HAT’s schematic and the dev kit’s header drawing number their pin columns in opposite directions. Two sessions of ghosts, one mirror flip.

2026–07–13

First over-the-air mesh

A hazard reported on a desktop peer appeared on the car device’s map — carried by radio, not by a cable trick. The same geo-ephemeral flooding core that runs in our simulator runs on the device, and the simulator numbers held up on air: in a 150-node simulated town, one report reaches 98.9% of relevant nodes with each node transmitting at most once.

Protocol vitals: 29-byte versioned frames plus an optional short note; one jittered rebroadcast per node, then silence; relevance radius and expiry carried in every frame. Nothing is stored, nothing is routed, nobody is addressed.