Features
- Firmware update entities. Each companion and each tracked repeater or room server gets an
updateentity that compares the firmware the node reported with the newest stable MeshCore release for its role. They show in Settings > Updates with the release notes and a link to the release. The integration checks GitHub every 12 hours, one check for all entries, and uses no mesh airtime. There is no install action; nodes are flashed over USB or the web flasher. A repeater that has not reported a version shows no update until you press Refresh firmware version. See Firmware updates. Thanks @TheOriginal92. (#409) - Six MQTT brokers instead of four. This also fixes the uploader loading only slots 1 to 4, so a stored slot 5 or 6 was silently skipped. Thanks @beaugunderson. (#402)
- WebSocket Path per MQTT broker. LetsMesh and MeshMapper serve MQTT at
/, which was hardcoded; Mosquitto, EMQX and meshview.dk use/mqtt. The new field defaults to/, so existing brokers are unchanged. Thanks @bplein for the original PR and @Fywqdk for the meshview.dk report. (#400, #307, #399)
Fixes
- Governed policy: a tracked node that advertises is polled again. A node that had failed a few polls kept doubling its backoff, up to 24 hours and across restarts, even after the companion heard it advertise. Hearing it now makes its next poll due at once and clears the failure counters, as already happened for auto-disabled nodes. A manual
req_status_syncthat gets a status now also marks the node online instead of leaving the Online sensorunknownuntil the next scheduled poll. Thanks @prusuino. (#401, #390) - An MQTT broker whose first connect fails now retries. A connect that failed with anything but a timeout, for example a refused WebSocket handshake at startup, left the broker disconnected until the entry reloaded. Thanks @michalsiman. (#410, #408)
- Neighbor SNR sensors no longer write a state every few seconds. Their
secs_agoandlast_seenattributes were computed from the clock, so every coordinator update stored a new state and attribute row for every neighbor, 1.8 GB in 10 days on one install. Both attributes are removed.last_updatedis a fixed timestamp with the same information; in a template,now() - last_updatedis the age. Thanks @michalsiman. (#410, #407)
Notes
- If you read
secs_agoorlast_seenfrom a neighbor sensor in a template or card, switch tolast_updated. - The recorder stores every
meshcore_raw_eventby default. Events shows how to exclude them if you do not use them. - Validation: 489 integration tests on the pinned harness (HA 2026.2.3) and on current Home Assistant with Python 3.14, 396 unit tests, ruff clean.
Full changelog: v3.0.4...v3.0.5