Imagine controlling your entire smart home—closing blinds, turning off lights, checking room temperatures, or arming security systems—from miles away, without cellular coverage, internet access, or grid dependencies.
By combining Meshtastic (an open-source, decentralized LoRa mesh network) with Home Assistant (the ultimate local home automation hub), you can build a secure, long-range, off-grid control link that works strictly over sub-GHz radio waves.
Here is a comprehensive guide to how this setup works, how to configure it, and how to bridge incoming LoRa messages to Home Assistant’s local voice assistant (Assist) to control your devices.
1. The Architecture: How It Works
The system operates via a local radio bridge connected to your Home Assistant server, routing messages to and from your mobile device:
![]()
The Mobile Node (vg-5ee8): A pocket-sized tracker or radio (such as a SenseCAP T1000-E) that you carry with you.
The Gateway Node (vg-2456): A matching radio connected via USB directly to the Home Assistant server.
The USB Link: Packets received by the gateway radio are sent via a USB serial link (/dev/ttyACM0) to a custom Home Assistant Meshtastic component.
The Automation Bridge: When a text message packet is decrypted, HA fires a meshtastic_api_text_message event. An automation intercepts the text, passes it to the HA Assist NLU (Natural Language Understanding) pipeline, and uses the meshtastic.send_text service to transmit the confirmation reply back over the air.
2. Setting Up the Hardware & Docker Serial Pass-Through
To run a gateway node connected to a dockerized Home Assistant container, you must map the USB serial device inside the container.
Exposing the Serial Port
Identify the USB serial port on the host machine (usually /dev/ttyACM0 or /dev/ttyUSB0) and update your Home Assistant container run configuration or docker-compose.yml to run in privileged mode or pass the device path:
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
network_mode: host
privileged: true
devices:
- /dev/ttyACM0:/dev/ttyACM0
volumes:
- /home/gvoina/homeassistant:/config
3. Syncing the LoRa Channels and Encryption Keys
For custom communications to work, your gateway and mobile nodes must match configurations exactly. If they do not, the gateway will receive the packets but log a Packet could not be decoded warning, ignoring the message.
Regional Preset & Channel Setup
- Region: Configure all devices to your local regulation preset (e.g.,
EU_868for Europe). - Modem Preset: Set to
LONG_FASTfor optimal range-to-bandwidth ratio. - Symmetric Encryption (PSK): Standard public broadcasts are sent on the default
LongFastchannel (which uses a default public keyAQ==). For secure device control, create a custom primary channel (e.g.,voina) with a private, unique symmetric Pre-Shared Key (PSK). - Key Synchronization: You must generate the channel URL on your gateway and import it on your phone:
https://meshtastic.org/e/#CjXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4. The Home Assistant Automation Bridge
The magic lies in bridging the incoming serial packet to the local AI engine. With Home Assistant’s built-in conversation domain, you can pass incoming text directly to the default Assist voice pipeline.
Write the following automation to your Home Assistant automations.yaml file:
- id: 'meshtastic_assist_bridge'
alias: Meshtastic Assist Bridge
description: Bridge Meshtastic private channel messages to Home Assistant Assist
trigger:
- platform: event
event_type: meshtastic_api_text_message
condition:
# Security filter: Respond only to commands sent by your private node IDs
- condition: template
value_template: '{{ trigger.event.data.data.from in [426270440, 4046709879] }}'
action:
# 1. Forward the LoRa command text to the Assist engine
- service: conversation.process
data:
text: '{{ trigger.event.data.data.message }}'
response_variable: agent_response
# 2. Extract the Assist text response and transmit it back to the sender
- service: meshtastic.send_text
data:
text: '{{ agent_response.response.speech.plain.speech }}'
to: '!{{ "%08x" | format(trigger.event.data.data.from) }}'
channel: '0' # Primary secure channel (Index 0)
5. Control Syntax and Device Naming
Home Assistant Assist relies on matching words to Friendly Names of entities.
- Exact Suffix Match: If you have a shutter named
Living Fix 1, a command like"Close Living Fix 1"works instantly. Suffixing it with generic words like “blind” (e.g."Close Living Fix 1 blind") will confuse Assist unless defined as an alias. - Resolving Duplicates via Areas: If you have multiple devices named
"Window", Assist naturally allows you to specify the area/room in the sentence.
Commands in Action:
- Unique device control:
📱 You (on phone):
Close Bucatarie
📡 HA Gateway (LoRa reply):Closed Bucatarie
- Handling duplicate names (Windows):
📱 You (on phone):Close Window in Sopor Office
📡 HA Gateway (LoRa reply):Closed Window- Checking/Activating System States:
📱 You (on phone):Turn on NightMode
📡 HA Gateway (LoRa reply):Turned on NightMode
6. Going Further: Upgrading to LLMs (Gemini / GPT)
For a conversational interface, you can replace the default local parsing engine with a large language model. By integrating the Google Generative AI (Gemini) integration into Home Assistant and assigning it as the default Assist agent, you can chat with a natural AI over LoRa radio waves.
You can ask:
- “Are all my windows closed?”
- “What is the temperature in the living room and the car?”
- “Set the office valve to 21 degrees.”
The model will convert your conversational sentences into structured API calls to control your entities and write a friendly text response back to you over the radio link.
7. Conclusion
By bridging Meshtastic mesh nodes to Home Assistant’s local Assist engine, you establish a resilient, secure, and entirely localized voice and control loop. Whether you are out in the woods, experiencing a severe power outage, or simply valuing absolute local control of your telemetry, LoRa + HA provides a robust utility that bridges physical radio meshes with smart home logic.