Beta of the internal rewrite. This release gets updated in place while it soaks. Same events, services, entity ids and default polling as 2.10. If you install it and something regresses, open an issue with the log.
Requirements
- Home Assistant 2025.6 or newer. The code already needed APIs newer than the 2023.8 we advertised.
- meshcore 2.3.11 or newer.
What changed
Radio
- The integration owns the radio session now. No SDK auto reconnect, our own backoff, and subscriptions survive a reconnect. Going deaf after a link drop until you reload is gone.
- Every command goes through one gate. Remote requests match their own reply by node prefix + tag, so two commands in flight can't take each other's response.
connectedgoes false when the link actually drops, not ~100s later.- Login checks
LOGIN_FAILED, wrong password fails fast. Neighbour paging is bounded.
Traffic
- New
traffic_policyoption in Global Settings.legacy(default) is exactly the old polling and retry numbers.governedis a flat per radio budget split into flood / direct / message lanes, deferral instead of failure, persisted across restarts. Rates show on the rate limiter sensor and in the log.
Config
- Edits apply in place. Only connection identity and the
cli_console_enabled/self_diagnostics_enabledtoggles reload the entry. Add/remove/edit a tracked node, change intervals, brokers, discovery, or press the firmware button and the radio session stays up. - Entries get a
unique_id. Adding the same radio twice is refused.messages_intervalis in Global Settings now. - Entry migrates v3 → v4 on load. Downgrade still works, the old data is kept.
Events and services
- Every
meshcore_*event hasentry_idanddevice_id. - Private key and channel secrets are redacted on the bus and raw MQTT.
expose_secretsturns that off. - DMs fire
meshcore_message_sentright away and a terminalmeshcore_delivery_update. Channel sends firemeshcore_messageat t=0, the repeater count arrives onmeshcore_delivery_update. Newmeshcore_message_send_failed. Unknown sender DMs are published withsender_name: nullinstead of dropped. execute_commandrefuses factory reset, key import and raw frames.add_selected_contact/remove_selected_contactare admin.send_messagewith no recipient errors cleanly.tracetakes 6 char prefixes.cleanup_unavailable_contactsonly touches contact sensors of that entry. Prefix args resolve forsend_login_syncand the other sync helpers, and SDK errors come back as an error dict instead of a 500.
Entities
- Telemetry entities for LPP types that never got any: accelerometer, colour, gyro per axis, barometer, altitude, frequency, percentage, load, concentration, distance, energy, direction, time, switch.
- Radio identity sensors (tx power, lat/lon, freq, bw, sf) populate at startup.
select.meshcore_contactdefaults to the placeholder, so a renamed or removed target can't redirect a drafted message.- Adverts no longer write the whole contact store per packet or reschedule the tick. MQTT uploader starts in the background instead of blocking setup.
Notes
- Architecture diagram lives in
docs/architecture/.