A simple automated messaging service and Web-based terminal for Meshtastic, written as a set of Node-RED flows.
Meshtastic is an open-source, off-grid communication platform that enables long-range messaging between devices using low-cost LoRa radio hardware, creating mesh networks that don't require phones, WiFi, or cellular service.
Node-RED is a visual flow-based programming tool built on Node.js that lets users connect devices, APIs, and services using drag-and-drop “nodes.”
A 'weekend project' that got a bit out of hand!
- Overview
- Features
- What's New in v0.50 beta
- Prerequisites
- Quick Start
- Hardware Setup
- Software Installation
- Configuration
- Testing
- Upgrading
- Troubleshooting
- License
- Disclaimer
MeshBop is an easily extensible trigger/response messaging service for Meshtastic. It includes a web-based dashboard for sending and receiving messages, automated weather alerts, and customizable message triggers.
Message triggers are activated using a short, definable prefix (example: /abcd? for help).
- ? Help page
- i App info page
- n RSS news feeds (various from V0.51 beta onwards)
- s Sea state (v0.50 beta onwards)
- t Local time, sunrise and sunset
- w Local weather
- ws Check for severe weather warnings (v0.51 beta onwards)
- z Inspirational (Zen) message
- Automated Weather Alerts: Checks UK Met Office every hour for severe weather warnings and broadcasts messages
- Live Dashboard: Web-based message send/receive interface with memory and scrollback - you're no longer tied to your phone
- Auto-responses: Responds to ping, /ping, test and /test messages
- Email Notifications: Sends alerts to admin (optional)
- Daily status report from the compute platform (RAM used, disk free etc. v0.52 beta onwards)
- Customizable: All features can be disabled or modified individually
- Rate Limiting: Built-in protection against channel flooding
Not all beta versions will be put up for download - only those with major revisions or bug fixes.
This is a major rewrite. See Upgrading for migration instructions.
- Simplified Configuration: Most variables and messages now in centralized function nodes
- Refactored Message Parsing: Improved conditional handling and streamlined parsing
- Enhanced Dashboard:
- Character count for messages
- Multi-line outbound messages
- Larger history buffer
- Optional display of MeshBop-generated messages
- Better Message Handling:
- Improved chunking for long messages
- Single pipeline to prevent out-of-order chunks
- Automatic URL shortening with TinyURL
- Improved Email System:
- @trigger to email admin
- Config export via email
- Better Rate Limiting: Consistent handling across all functions
- Auto-compiling Help: Help message is automatically compiled and sorted
- More Debug Options: Additional debug nodes throughout
- Fixed message chunk ordering issues
- Improved handling of empty news/weather data
- Removed redundant ident messages after dashboard sends
- Better undefined global variable checking
Required:
- Linux compute device with accessible async serial port (GPIO pins, not USB)
-
- Examples: Raspberry Pi Zero 2W, Orange Pi Zero 3
-
- Meshtastic node with accessible async serial port
-
- Examples: Heltec V3, Seeed Xiao Meshtastic kit (ESP32 or NRF-based)
-
- Both devices must operate at same logic levels (typically 3.3V)
- A second Meshtastic node for sending and receiving test messages
- Node-RED
- Required Node-RED plugins (see installation)
- Meshtastic firmware with TEXTMSG enabled
- WiFi connection for compute device
- Internet access for weather/news feeds
- Email account (optional, for notifications)
- Set up Raspberry Pi OS and connect to WiFi
- Enable async serial port on Pi
- Install Node-RED and required plugins
- Configure Meshtastic node for TEXTMSG
- Wire devices together (powered off!)
- Import MeshBop flows
- Configure settings
- Test in private channel
- Go live
IMPORTANT: Power off both devices before wiring!
NB: The wiring on this diagram was corrected on 29-Oct-2025
If using a Heltec V3 node instead of the Seeed board, the wiring from the Pi is:
Rx on Pi to GPIO47 on Heltec V3
Tx on Pi to GPIO48 on Heltec V3
Note: The RX/TX pins on other devices will vary. Check your specific board documentation. Remember Rx on one board goes to Tx on the other and vice versa.
Connections Summary:
-
GND/0V: Compute device GND ↔ Node GND (must be connected first)
-
Serial (crossover):
Compute device Rx ↔ Node Tx
Compute device Tx ↔ Node Rx
The project used the following:
Development platform:
- Compute: Raspberry Pi Zero 2W
- Node: Seeed Studios XIAO ESP32 + SX1262
Live platform:
- Compute: Orange Pi Zero 3
- Node: Heltec V3
If you are using a different compute board you can follow these instructions in general, adapting them for your setup. Some notes are provided for the Orange Pi Zero 3 board, which was used for the boxed 'live' node.
- Use Raspberry Pi Imager to install Raspberry Pi OS Lite (minimal) on SD card (8GB minimum)
- Boot the Pi with display and keyboard connected
nmcli device wifi list
nmcli device wifi connect "YourSSID" password "YourPassword"NetworkManager creates a connection profile, typically named "YourSSID"
Reference: Jeff Geerling's nmcli guide
sudo nmcli con mod "YourSSID" ipv4.addresses 192.168.1.100/24
sudo nmcli con mod "YourSSID" ipv4.gateway 192.168.1.1
sudo nmcli con mod "YourSSID" ipv4.dns "9.9.9.9"
sudo nmcli con mod "YourSSID" ipv4.method manual
sudo nmcli con down "YourSSID" && sudo nmcli con up "YourSSID"Use IP addresses to suit your network setup.
Reference: RaspberryTips static IP guide
Edit boot config:
sudo nano /boot/firmware/config.txtAdd at the end:
[all]
enable_uart=1
dtoverlay=uart0
dtoverlay=disable-bt
Note: Enabling UART requires disabling Bluetooth, as shown.
OR
This is for an installation using the Armbian distribution (recommended) of Linux for the Orange Pi Zero 3 and not the distribution from the board manufacturer. This distro can be found here: https://www.armbian.com/orange-pi-zero-3/
Edit boot config:
sudo nano /boot/armbianEnv.txtAdd at the end:
overlays=uart5
Then for whichever config change is done, save and Reboot:
sudo rebootIf you use the distribution of Linux provided by the Orange Pi board manufacturer (not recommended), the async port is set up by running orangepi-config and enabling hardware UART5. This creates /dev/ttyS5).
Run the official installation script:
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)When asked about installing the Pi-specific nodes, answer Yes.
Reference: Node-RED Raspberry Pi Guide
sudo systemctl enable nodered.service
sudo systemctl start nodered.servicesudo systemctl status nodered.serviceAccess Node-RED at: http://[pi-ip-address]:1880
Install these plugins via Manage Palette menu:
- @flowfuse/node-red-dashboard
- node-red-contrib-astrodata
- node-red-contrib-buffer-parser
- node-red-contrib-feedparser-simple
- node-red-node-email
- node-red-node-ping
- node-red-node-serialport
Important: Install @flowfuse/node-red-dashboard (Dashboard 2.0), not the legacy dashboard.
Using the Meshtastic mobile app:
- Connect to your node
- Go to Module Configuration → Serial
- Enable Serial Module
- Set mode to TEXTMSG
- Configure serial settings:
- Baud Rate: 19200 (some setups might default to 115200 - either should work)
- TX Pin: Check your board pinout
- RX Pin: Check your board pinout
- DO NOT enable "Override Console Serial Port"
- Save and reboot
If using a Heltec V3 as per the previous wiring diagram, the pins in the phone config are instead:
Rx = 48, Tx = 47
Reference: Meshtastic Serial Module Docs
This is the simplest method for a first time install. Upgrade notes are later.
cd ~/Downloads
wget https://raw.githubusercontent.com/linker3000/MeshBop/main/meshbop-nnnnn.json- Open Node-RED editor (
http://[pi-ip]:1880) - Click ☰ (hamburger menu) → Import
- Select downloaded JSON file or paste content
- Click Import
Note: If you see warnings about unused configuration nodes, these can usually be ignored or deleted. They usually relate to a superfluous async port configuration.
- Locate the Async out node on the first tab
- Double-click to edit
- Set Serial Port:
/dev/ttyAMA0(Raspberry Pi) or/dev/ttyS1(Orange Pi running Armbian*) - Set Baud Rate to match what was set up in the Meshtastic node configuration via the phone app - this is usually either 19200 or 115200, but double check in the app to make sure both speeds match.**
- Deploy
*If you are using the Orange Pi distribution of Linux from the board manufacturer instead of Armbian, the async port will be /dev/ttyS5 if the instructions earlier to set it up have been followed.
**If you later find that messages sent from MeshBop contain incorrect characters, try reducing the node's async speed via the phone app, and match that speed in the Node-RED Async node setup. Typically, 19200 is fine. Some nodes with less powerful CPUs may struggle with 115200.
Defining the serial port via the Async out node also makes it available for Async in. Check that node and verify that it is using this definition too though.
Keep the Async out node DISABLED until all configuration is complete and tested!
On the Main Setup tab, find the large function node labeled "Setup Variables".
Edit the variables in the function using the included notes.
Go through each tab in sequence:
- Read all comment nodes
- Check function nodes for setup instructions
- Customize messages as needed
- Note any region-specific settings (weather, news feeds)
If using email notifications:
- Find the email node on the Rx / Tx tab
- Configure SMTP settings:
- Server
- Port
- Username
- Password
Tip: Use an app-specific password for Gmail accounts.
Before going live, complete these steps:
- All configuration variables set
- Serial Rx, Tx and ground connection between devices
- Private test channel created on Meshtastic
- Private channel set as PRIMARY (channel 0)
- Second device configured for the private channel too
NOTE: TEXTMSG mode sends/receives on the PRIMARY (first) channel only!
- Open Meshtastic app
- Go to Channels
- Create new channel with encryption
- Drag channel to be FIRST in the list
- Save and wait for reboot
Reference: Meshtastic Secondary Channels
- Add the same private channel (can remain secondary)
- Select it for messaging
- Test connection
- Use the inject nodes on the Main Setup tab to test each function
- Check debug output for errors
- Verify message formatting
- Enable the Async Out node
- Deploy changes
- Send test messages from your test device - Examples:
/l3k? (help) /l3kt (time) /l3kz (zen quote) ping test - Verify responses appear on test device
When satisfied with testing:
Option 1: Keep private channel as primary (recommended for personal/group use)
Option 2: Reorder channels to make LongFast (public) primary
- WARNING: All MeshBop messages will then be sent on the public channel!
- Ensure there's no personal information in your messages
For when you already have a set of MeshBop flows in Node-RED.
BACKUP EVERYTHING
These instructions assume MeshBop is the only set of flows in your Node-RED instance. Once the current flows have been backed up, they will be replaced with a new set and any customisations or non-MeshBop tabs will be removed.
- Note all customizations in function nodes - copy the contents of any customised functions into a text editor and save them for future reference
- Screenshot any modified flow wiring too
- Export the current flows:
- Click ☰ → Export → All flows
- Click Download
- Save as
meshbop-backup-[date].json
Disable the Async Out node or switch to a test channel.
ps aux | grep node-red
Note: If Node-RED runs as different user (e.g., nodered), use that user name instead of 'pi' in the commands below:
sudo systemctl stop nodered.serviceThis assumes that the 'pi' user is running Node-RED and so the application is setup below their home folder.
cd /home/pi/.node-red/
mkdir ~/node-red-backup-$(date +%Y%m%d)
cp flows_* settings.js ~/node-red-backup-$(date +%Y%m%d)/Files backed up:
flows.jsonflows_cred.jsonsettings.js
cd ~/Downloads
wget https://raw.githubusercontent.com/linker3000/MeshBop/main/meshbop-nnnnn.jsoncp ~/Downloads/meshbop-nnnnn.json /home/pi/.node-red/flows.jsonsudo chown pi:pi /home/pi/.node-red/flows*.json
sudo chown pi:pi /home/pi/.node-red/settings.jssudo systemctl start nodered.servicesudo systemctl status nodered.serviceOr view logs:
node-red-log- Open Node-RED editor:
http://[pi-ip]:1880 - Review all tabs and comments
- Reapply customizations from your notes
- Test thoroughly before going live
Will be here.
Problem: Serial port stops responding
Solution:
sudo systemctl stop [email protected]
sudo systemctl disable [email protected]
sudo rebootProblem: Garbage data sent when node powers on
Cause: Known Meshtastic firmware issue (not a MeshBop bug)
Workaround: Ignore initial garbage. This clears after first proper message.
Problem: Messages not being sent during testing
Solution: Use the Reset Rate Limiters inject node on Main Setup tab
Problem: Private messages appearing on public channel
Cause: Wrong channel set as primary
Solution: Verify private channel is first in channel list on MeshBop node
Problem: No data returned from feeds
Check:
- Internet connection on Pi
- API keys configured (if required)
- Region-specific service availability
- Debug output for specific error messages
Problem: Dashboard page shows error or blank
Check:
- Correct Dashboard 2.0 plugin installed (@flowfuse/node-red-dashboard)
- Flows deployed after import
- Access correct URL:
http://[pi-ip]:1880/dashboard
"Port not found"
- Check
/dev/ttyAMA0(or the async port on your compute board) exists:ls -la /dev/tty* - Verify serial enabled in
/boot/firmware/config.txt(Raspberry Pi) - Reboot Pi
"Permission denied"
- Fix ownership:
sudo chown pi:pi /dev/ttyAMA0 - Or add user to dialout group:
sudo usermod -a -G dialout pi
"Unused configuration nodes"
- These are usually harmless (old serial port definitions)
- Search for and delete if desired
Here's a few of the MeshBop flows:
- Issues: Use the GitHub Issues tab
- Questions: Check existing issues first
- Bugs: Provide Node-RED version, OS version, and error messages
All support and advice is given on a 'best effort' basis - there's no SLA here!
Contact: linker3000@gmail-dot-thingy (replace -dot-thingy with .com)
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
Author: Linker3000 (Nigel Kendrick)
You are free to:
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material
Under the following terms:
- Attribution — You must give appropriate credit
- NonCommercial — You may not use the material for commercial purposes
- ShareAlike — If you remix, transform, or build upon the material,
you must distribute your contributions under the same license
Full License: https://creativecommons.org/licenses/by-nc-sa/4.0/
Meshtastic is a registered trademark of Meshtastic LLC. This project is not affiliated with, endorsed by, or officially connected with Meshtastic LLC or the Meshtastic brand. The use of the Meshtastic name and trademark is solely for informational purposes and to indicate compatibility with the Meshtastic system.
MeshBop is independent and was developed by Linker3000 (Nigel Kendrick) and its contributors. Any opinions, views, or content shared here are those of the project creators and do not reflect the views or endorsement of Meshtastic LLC.
- Accuracy depends on your setup and third-party services
- Supplied "as is" with no warranties
- Use at your own risk
- No responsibility for consequential loss or errors
- Not an emergency service
- Weather and sea state information is region-based and may need local adjustments
As of October 2025, Meshtastic firmware TEXTMSG mode:
- SENDS to the PRIMARY (first) channel only
- RECEIVES from ANY channel
Implication: A "private" MeshBop setup can receive spoofed messages from other channels, though the responses remain private. Use long, complex trigger patterns to reduce spoofing risk.
For private use: Set your encrypted channel as PRIMARY (channel 0) on the MeshBop node.
Docker: Replace flow files in the container's mapped volume (usually /data)
Custom Installations: Service name/directory may differ. Check with:
sudo systemctl list-units | grep nodeDifferent Usernames: Always confirm ownership with ps aux | grep node-red and adjust paths/permissions accordingly.
MeshBop was written in the UK and uses UK/EU services for news, weather and other information. These services may not be available in your country, or there may be better, local ones to use. If you replace any flows with regional versions, please export them and share here for others to enjoy.
- Use Pi OS Lite to maximize resources for Node-RED
- Consider fixed IP for easier access
- Regular backups recommended
- Monitor system resources during operation
- Ident message: Sent daily at 07:00
- Weather alerts: Checked hourly
- Rate limits: In place to protect the mesh network - please don't bypass
Last Updated: October 2025
Current Version: 0.50 beta









