Skip to main content

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, 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.