MeshCore for Home Assistant
Integration BetaMeshCore HA
Custom Home Assistant integration for monitoring and controlling MeshCore nodes over USB, BLE or TCP, with sensors, services, diagnostics and optional map upload support.
- Maintainers
- meshcore-dev ↗· Alex Wolden ↗
- Kind
- Integrations
- Maturity
- Beta
- Language
- Python
- Licensing
- Open source
- Latest version
- 2.9.0 · 2026-07-22
- License
- MIT
- Platforms
- Home Assistant
Capabilities
Interfaces
- ✓ GUI
- ✓ API
Connections
- ✓ BLE
- ✓ Serial
- ✓ USB
- ✓ TCP
- ✓ MQTT
Capabilities
- ✓ Messaging
- ✓ Contacts
- ✓ Node configuration
- ✓ Monitoring
- ✓ Telemetry
- ✓ Mapping
- ✓ Automation
Install
Releases
from GitHub · updated 2026-07-22v2.9.0 # Latest 17 days ago · 2026-07-22 04:37 UTC
Features
- CLI Console (#295, @drewmccal) — an opt-in dashboard console for the local companion radio. Enable it in Configure → Global Settings:
execute_command/execute_command_uigain arecord_to_consoleboolean; when set, the command and its response are recorded to a rolling transcript and ameshcore_cli_responseevent fires for automations.- New
sensor.*_cli_consoletranscript entity (last 50 command/response pairs, pre-rendered for a markdown card), plus compact CLI Run Command / CLI Clear Console button entities and ameshcore.cli_console_clearservice. - The transcript is excluded from the recorder database, and the sensor state is a neutral command counter, so command text (which can include credentials) is never written to history.
- Failed contact lookups in
execute_commandnow return structured errors (pubkey_prefix_too_short,contact_not_found,not_connected) instead of a silent no-op. - New CLI Command Reference docs page and dashboard examples.
Fixes
- Outgoing DM lost when
send_messageis called withentry_id(#293) — the message was delivered but never recorded: no conversation entity update, no logbook entry, nomeshcore_message_sentevent. Now recorded the same as sends withoutentry_id. - Entity-less devices can be removed (#297) — follow-up to #247: a device whose last entity was already removed can now be deleted from the HA UI even while the contact is live, and the telemetry dedup map is evicted on entity removal so re-added contacts recreate sensors cleanly.
- Slovak translation quoting (#301).
Improvements
- Repeater login uses
send_login_sync(#269) — login and path discovery now use the SDK sync helpers with hop-aware timeouts, making logins to distant repeaters more reliable.
Notes
- No config migration in this release.
- Minimum Home Assistant version remains
2023.8.0;meshcore-pyfloor unchanged (>=2.3.7). - Internal: CI now runs lint, unit, and integration test tiers on every PR (#270, #280, #281).
- CLI Console (#295, @drewmccal) — an opt-in dashboard console for the local companion radio. Enable it in Configure → Global Settings:
v2.8.0 # 2 months ago · 2026-06-18 01:55 UTC
Features
Unified Contact Discovery Mode (#261) — the two overlapping contact-discovery flags (
disable_contact_discoveryand the never-shippedlarge_mesh_mode) are collapsed into a single Contact Discovery Mode select with three choices:- Entity per contact (default) — one diagnostic binary_sensor per discovered contact, same as before.
- Data only — discovered (un-added) contacts are tracked as data with no per-contact entity, while added/curated contacts keep theirs. On dense meshes this avoids hundreds of low-utility entities and the entity-registry churn they drive. The dropdown, services, chat panel, an aggregate summary sensor, and
meshcore.get_discovered_contactall keep working. - Disabled — no discovered-contact processing at all.
Set it at install time or in Configure → Global Settings.
Fixes
- Telemetry/GPS AttributeError from untracked nodes (#266) —
_get_node_infoassumed a dict-shapedpublic_key; a TELEMETRY/GPS event from a node that wasn't a tracked repeater/client/root raisedAttributeErroron the string-shaped key and killed the handler. - node_status sensor stuck "Disconnected" (#267) — the status callback set its value but never pushed state, so the header indicator could show disconnected (while actually connected) until the next device event. Now pushes on event and seeds an initial value at setup.
- UTC-aware MQTT timestamps (#259) — status, raw event, and normalized packet payloads now emit offset-aware ISO 8601 timestamps so consumers don't misread local time as UTC. Fixes #258.
- Quiet benign reconnect-race log noise (#268) — the
no_event_receivedresult from theget_msgloops during config re-add / reconnect is downgraded to debug; real errors still log at ERROR. - Flood-scope
*wildcard (#263) — a raw*entry in the flood-scope allowlist is now recognized as the global wildcard and skipped, instead of deriving a junk transport key for a non-existent#*region.
Notes
- Migration on first start: existing installs migrate config entry v2 → v3 automatically.
disable_contact_discovery=truemaps to Disabled; otherwise the mode defaults to Entity per contact, so behavior is unchanged unless you opt into Data only. No reload, no entity-registry churn. - MQTT timestamp format change (#259): the
time/datedisplay fields in MQTT packet payloads now reflect UTC wall-clock rather than local time. If you parse those downstream, note the shift. - Minimum Home Assistant version remains
2023.8.0. Nomeshcore-pyfloor change (still>=2.3.7).
v2.7.0 # 2 months ago · 2026-06-01 02:44 UTC
Features
- Self-diagnostic sensors for the companion node (#251) — opt-in polling of the locally-attached companion's
get_stats_core/get_stats_radio/get_stats_packets, exposed as 13+ new sensors on the main device. Local-transport queries only — no mesh traffic. - Region-scoped channel broadcasts (#250) — new
scopeparameter onmeshcore.send_channel_messagefor TC_FLOOD region-scoped sends. Optionalflood_scopesallowlist in global settings labels incoming scoped messages with their region name. - Remove orphan devices from the UI (#247) — repeater, client, and contact devices that are no longer tracked can now be deleted via the HA device page. Hub and live devices are refused. Closes #229.
- Repeater neighbor count sensor (#228) — per-repeater count of active neighbors derived from the existing neighbor list.
- hop_count + snr on incoming channel messages (#245) — logbook event now carries SNR and hop count for channel traffic, matching the existing DM behavior.
- Conditional recipient type selection (#218) — adapts the message-input UI based on the chosen recipient.
Fixes
- Region-scope (TC_FLOOD) RX_LOG correlation (#246) — fixes a 4-byte transport-code offset that broke RX_LOG correlation for all region-scoped messages and corrects the AES plaintext offset. Closes #237, #242, #198.
- path_hash_size on rx_log correlation entry (#249) — completes #226 by propagating the per-hop hash width to every consumer of
meshcore_message. - execute_command response normalization (#248) —
req_*_synchelpers that return plain dicts, lists, scalars, orNoneare now surfaced correctly instead of being silently dropped or raising a confusing error. - Discovered-contact cleanup post-#236 (#252) — repairs four cleanup paths that the #236 unique_id migration left looking up entities by the old format.
- Recorder cap on discovered-contact select (#254) —
optionsis now excluded from recorder state, dodging the 16 KiB per-state attribute cap that fired warnings on dense meshes. Closes #243. - Removed
hass.helpers.entity_registry.async_get()accessor (#253) — switched toer.async_get(hass)in three contact services. FixesAttributeErroron recent HA core. - MQTT startup wait (#244) — fixes a task that blocked HA boot.
- recv errors as count + measurement (#239) — corrects sensor types.
- multi-entry message_sent fan-out (#235) — filters by entry_id.
- Contact-diagnostic unique_id scoping (#236) — scoped by entry_id with one-time migration.
- TZ-aware UTC timestamp on meshcore_message (#234).
- RX_LOG multi-byte path size parsing (#226).
Docs
- Companion Integration API page (#217)
- ESPHome BLE bridge workaround (#223)
- Discord community channel linked in README + docs site
Notes
- Minimum Home Assistant version remains
2023.8.0. - The
meshcore-pyfloor is>=2.3.7(was bumped in #222). - #236's unique_id migration runs once per install on first start of this release. Entities migrate automatically. Users on the broken cleanup state from earlier #236-only installs will see the Phase 4 orphan sweep clean up stale registry entries (covered by #252).
- #251 self-diagnostics defaults off. Enable in Global Settings if you want the new sensors.
- Self-diagnostic sensors for the companion node (#251) — opt-in polling of the locally-attached companion's
Project signals
popularity 2026-08-08 verification 2026-08-08
- GitHub stars
- 236
- Forks
- 55
- Watchers
- 12
- Open issues
- 61
- Contributors
- 33
- Release downloads
- 0
- Latest downloads
- 0
- Source available
- Yes
- Releases available
- Yes
- Signed releases
- No
- CI builds
- Yes
- Documentation
- Yes
- README labels the integration as work in progress and notes BLE has not been thoroughly tested.