Home Assistant Integration via MQTT
Overview
Integrating Meshtastic into Home Assistant unlocks powerful home automation possibilities: track family members on a mesh map, get alerts when a node goes offline, and trigger smart-home actions based on mesh events. The integration uses MQTT as the transport layer, with Mosquitto as the local broker.
Step 1: Install and Configure Mosquitto
In Home Assistant, navigate to Settings → Add-ons → Add-on Store and install the Mosquitto broker add-on. After installation, open its configuration tab and add a user:
logins:
- username: meshuser
password: yourpassword
Start the add-on and enable Start on boot. Note your Home Assistant host IP -— your Meshtastic node will connect to this address.
Step 2: Configure Your Meshtastic Node for MQTT
Open the Meshtastic app,app, go to Radio Configuration → MQTT and set:
- MQTT Server Address: your HA host IP (e.g.
192.168.1.100) - Username / Password: the credentials you set above
- Root Topic:
msh/US(or your region) - Uplink / Downlink Enabled: on
Also ensure your node has WiFi configured under Radio Configuration → Network.
Step 3: MQTT Sensor YAML in Home Assistant
Add the following to your configuration.yaml (adjust node IDs as needed):
mqtt:
sensor:
- name: "Node !a1b2c3d4 Battery"
state_topic: "msh/US/2/json/telemetry/!a1b2c3d4"
value_template: "{{ value_json.payload.device_metrics.battery_level }}"
unit_of_measurement: "%"
device_class: battery
- name: "Node !a1b2c3d4 Latitude"
state_topic: "msh/US/2/json/position/!a1b2c3d4"
value_template: "{{ value_json.payload.latitude_i | float / 1e7 }}"
- name: "Node !a1b2c3d4 Longitude"
state_topic: "msh/US/2/json/position/!a1b2c3d4"
value_template: "{{ value_json.payload.longitude_i | float / 1e7 }}"
Reload your YAML configuration after saving.
Step 4: Automations
Alert when a node hasn't been heard in 30 minutes:
automation:
- alias: "Mesh node offline alert"
trigger:
platform: state
entity_id: sensor.node_a1b2c3d4_battery
to: unavailable
for: "00:30:00"
action:
service: notify.mobile_app_your_phone
data:
message: "Node !a1b2c3d4 has not reported in 30 minutes"
Notify on critical battery:
- alias: "Mesh node low battery"
trigger:
platform: numeric_state
entity_id: sensor.node_a1b2c3d4_battery
below: 15
action:
service: notify.mobile_app_your_phone
data:
message: "Node !a1b2c3d4 battery critical: {{ states('sensor.node_a1b2c3d4_battery') }}%"
Trigger lights when a family member arrives home via mesh position:
- alias: "Welcome home via mesh"
trigger:
platform: zone
entity_id: device_tracker.mesh_family_member
zone: zone.home
event: enter
action:
service: light.turn_on
target:
entity_id: light.porch
To use zone-based presence, create a device_tracker that updates from the latitude/longitude sensors using a template or the MQTT device tracker integration.
Step 5: Lovelace Dashboard
For a mesh map view, install the Map card in Lovelace. Add a card of type map and reference your device tracker entities. You can also use the auto-entities HACS card to dynamically list all mesh node sensors. For richer visualization, some community members use Grafana with the InfluxDB integration to feed in MQTT telemetry.