Four radios, and where local stops

Four radios carry the devices in this flat, and each is good at something the others are not. This note counts them: what each one actually carries, the devices whose firmware is built in the flat — nine built nodes, two air purifiers and, since September, the reader sitting on the electricity meter — and what measuring a radar taught about what it can and cannot see. It covers how the household’s electricity is measured too — off the utility meter’s own optical port now, with the per-phase clamps demoted to a cross-check — and the written rule against counting the same watt twice. And it is honest about the seam. Several bridges exist only to keep bought hardware useful without the vendor’s cloud, two of them running firmware written here after the manufacturer’s servers went dark. But a lighting bridge still runs its own behaviours on a wall clock beside the hub, and the Amazon Echo units in the flat are cloud devices carrying the household’s actual daily voice traffic. The local speech pipeline really is local. The house as a whole is not. As of 2026-09-08.

A count is not an architecture. Zigbee holds the switches, Thread rides the Zigbee coordinator’s own border router, Matter turns out thinner than the word suggests, and Bluetooth LE only ever seconds a decision another sensor has already made. This note goes through them one by one, then through the devices whose firmware is built in the flat, and ends where keeping a bought product local did not work.

Four radios

In everyday termsFour separate radios in one flat sounds like a mess, but a household already runs several without noticing: the doorbell, the car key, the headphones. Each is built for its own job, and none of them would do the others'.

Zigbee carries the switches, buttons, knobs and metering plugs. It runs natively inside the hub rather than through a separate bridge daemon — a program of its own, running beside the hub. A version-controlled quirks directory covers the devices the upstream library models badly: a metering clamp needed one.

Thread runs on the Zigbee/Thread coordinator’s own border router. No border-router container runs beside it on the host, and the host’s configuration is written to keep it that way.

Matter is thinner here than the word suggests. The lighting bridge is exposed as a Matter node, and the Matter twins of three motion sensors carry battery entities only. Matter is not carrying the house.

Bluetooth LE is one leg of presence. The phone’s own beacon is located room by room across eight receivers — all of them built sensor nodes doing a second job — computed on the LAN, with nothing sent outward.

Firmware built here

In everyday termsFirmware built here is a recipe that names the exact version of every ingredient — because a supplier quietly changing one is how last month’s dish stops working.

Nine nodes run firmware built in the flat, and eight of them are bought hardware running the vendor’s own published firmware package with local overrides: four multi-sensor nodes reading mmWave presence per range gate, carbon dioxide, illuminance and environment, and four air-quality nodes reading carbon dioxide, particulates and environment. A range gate is one distance band out from the radar, and each band is reported separately.

The ninth is hand-written and is not a sensor. It is an ESP32 on the air conditioner’s own RS485 bus, turning two indoor units into ordinary climate entities and publishing the outdoor unit’s power, energy, current, voltage and error code. Its external component is pinned to a commit hash of upstream’s main branch rather than a release tag, because upstream keeps its compatibility fixes there and warns that its own tagged code no longer builds.

Three more devices carry firmware written in the flat rather than merely configured here, and all three exist because a vendor stopped. Two are air purifiers whose manufacturer’s backend went dark; they run a firmware built for them in this household and published under the household’s own name. The third is the reader on the electricity meter — a community project, built here with a set of local fixes, talking to the house broker and to nothing else.

The two dodecahedron lamps in the living room belong on the list as well. Their vendor ships a closed fork whose effects come with no source, so the effects were read back out of the factory image and reimplemented on the stock open firmware; the tour has that story.

None of that proves the binary on a node was built from the file beside it. That gap belongs to the deploy note.

What a sensor can actually see

In everyday termsFootsteps heard through a wall prove somebody is in the building, not which room they are in. So the instrument that can only see its own room is the one allowed to say a person arrived, and the one that hears through walls may only say they have not left.

A radar sees through a wall, and did: people in the hallway were reported as occupants of the next room, while that room’s infrared sensor stayed off and the light lit an empty room. No threshold separates the two cases, because a body close to the sensor saturates several range gates at once. So only the infrared sensor may start presence, and the radar may only sustain it — which is what a motionless occupant needs.

Another radar was dropped from the presence inputs altogether. Its moving channel flapped too often to be trusted as an input.

Room-level Bluetooth is live and deliberately not trusted on its own: it disagrees with the presence sensors often enough that a Bluetooth area may never drive a light without a presence sensor agreeing, and the walk-through that would qualify it is unlogged.

What the house then does with presence — five states derived from a door, a phone and these sensors — is the subject of the house-states note.

What the house measures

In everyday termsIf two meters watch the same washing machine, adding both to the bill does not make the reading better — it makes the house look like it uses twice the electricity it does.

Grid draw is read from the meter the utility bills against. A small radio reader sits on the meter’s optical port. The three current clamps that carried that job until September are a cross-check now, and they earn it by disagreeing: they read a couple of percent over the meter. That is how you find out that a clamp is a clamp and a meter is a meter. The loads worth watching are metered at the plug or the circuit.

The rules written around that dashboard are mostly about not counting a watt twice: never a derived counter beside the native counter it duplicates, never a channel that is the sum of two other channels, and exactly one row for a load two meters can see.

The uninterruptible power supply is the worked example. It reports no wattage, so a derived sensor multiplies its reported load percentage by the nameplate rating, in coarse steps. It is a headroom gauge, not an instrument, and barred from the dashboard because a plug already measures that socket for real. It fails to unavailable rather than zero, because a zero would read as an idle rack. And even deduplicated, the metered rows do not account for all of the grid draw — some of the flat’s load simply sits on no meter at all.

Where local stops

Some bridges exist to keep bought hardware useful without the company behind it. The living-room presence sensor is paired over a local protocol rather than a vendor account. The air conditioner speaks its own bus instead of the manufacturer’s app. Two air purifiers run replacement firmware written here and publish plain integers to the house broker, because the vendor’s backend went dark and there was no other way to keep them — and the configuration admits the cost: one switch runs optimistically, since the firmware never reports that state back. One of the two now stands outside on the balcony and blows through the wall into the bedroom, which makes it the only mechanical air exchange the flat has.

Then the seam. The lighting bridge still runs its own behaviours on a wall clock in two rooms while the hub drives the same lamps — two systems on one set of lamps, which is the one arrangement this house rules out. Retiring them is an operator action inside the vendor’s own app; no configuration change can perform it.

The voice seam is wider than that. The Amazon Echo units standing in the flat are cloud devices: what is spoken to them goes to a company’s servers and the answer comes back. They carry the household’s actual daily voice traffic — the spoken light commands. The local speech pipeline genuinely is local: the speech-to-text and text-to-speech services and the satellite all run in the flat. It is not what the household talks to. The house as a whole is not cloud-free.

What is planned

  • One air-quality channel left unconsumed. A paired comparison found its humidity reading well off a reference. Nothing reads it until it is checked.
  • Retiring the bridge-native lighting behaviours, tied to one pass over every button, dial and pad so the two do not fight.

Where local stops is not a principle here but a position, held device by device. It moves only when someone moves it: which is why the second item waits on a person in a vendor’s app rather than on a merge request.


Radio and node configurations, package files, the energy plan and the component inventory read in the smart-home configuration repository on 2026-09-08; the sensor measurements are recorded there beside the rules they set. Planned items are marked as planned.

Context: the architecture note →