Configure a MeshCore observer node to uplink packet data to the Palouse Mesh analytics network.
Not recommended for first-time users β set up a companion or repeater first.
This guide configures your node to connect to the Palouse Mesh private MQTT broker β infrastructure maintained for the PUW region (Palouse, Clearwater, and surrounding southeast Washington / north-central Idaho). If you're outside this region, please do not follow this guide β the broker at mqtt.jordanfstop.com is not open to the public and capacity is limited.
If you're already running a room server or observer node β especially one pointing to LetsMesh β replace it with this setup. This is the current recommended configuration for PUW region observers.
We strongly encourage migrating to this setup. LetsMesh has been effectively unmaintained β the developer has been AWOL and the service may go offline without warning. Nodes pointing only to LetsMesh are one outage away from going dark.
This guide sets up your node to feed MeshMapper and the Palouse Mesh broker (Beacon + CoreScope) β locally maintained infrastructure that isn't going anywhere.
This firmware is community-maintained. The observer and room server roles are stable and well-suited for telemetry deployments. However, the repeater functionality is experimental β if your node is a high-traffic or critical repeater, stock MeshCore firmware is the safer choice. For nodes where observing is the primary purpose, this firmware is the right tool.
Both are observer nodes β both uplink to MQTT and use the same radio settings. The Repeater Observer also rebroadcasts packets to extend mesh range. The Room Server Observer instead stores message history so companions can sync missed messages when they reconnect. Choose based on what you need the node to do beyond observing.
Rebroadcasts packets to extend mesh range while simultaneously observing and uplinking to MQTT. Note: repeater functionality in this firmware is experimental β see above.
Stores message history so companions can sync missed messages. Requires stable power and more flash/RAM.
Each step builds on the last β especially the region hierarchy commands, which must be entered in the exact sequence shown. Skipping or reordering steps will result in a misconfigured node.
Go to observer.gessaman.com, find your specific hardware (e.g. Heltec V3, Heltec V4, LilyGo T-LoRa), and select the repeater_observer_mqtt or room_server_observer_mqtt variant matching your role above. Follow the on-screen steps to flash.
Once flashed, connect to the console via the Console button at meshcore.io/flasher. The remaining steps below are entered as commands there.
Frequency, bandwidth, and spreading factor must match exactly across all nodes on the network β these define the physical-layer channel and a mismatch means nodes cannot hear each other at all.
# US/Canada LoRa preset β 910.525 MHz, BW62.5, SF7, CR5
set radio 910.525,62.5,7,5
set tx 22
Set the timezone before configuring anything else to ensure accurate timestamps in message history and telemetry logs.
set timezone America/Los_Angeles
Set the node name and IATA code for telemetry routing.
set name [LOCATION-SITE-OWNER]
set mqtt.iata PUW
If replacing or upgrading an existing node and want to preserve its network footprint β packet history, known contacts, map position β inject the private key from the old device before rebooting.
set prv.key [128-character hex key from old node]
set guest.password [CHANGE]
Setting coordinates places your node on the network map and improves routing telemetry. The easiest way is through the observer.gessaman.com β Repeater Setup interface β connect your device and look for the location / coordinates fields. Alternatively, set them directly via the console:
set lat [decimal latitude] set lon [decimal longitude]
For residential deployments, consider offsetting your coordinates by a block or two for privacy.
Provide your local Wi-Fi credentials. This is the backhaul that carries RF traffic to the MQTT brokers. Do not use quotes around values.
set wifi.ssid [your network name] set wifi.pwd [your password]
If deployed as a receive-only observer (PCB antenna, dense RF environment, or coverage-only role), disable forwarding to prevent unnecessary airtime congestion.
set repeat off
mqtt1 for MeshMapper and mqtt2 for the Palouse Mesh broker instead of slots 3 and 4 shown below. All other commands are identical.
Uses the built-in meshmapper preset to feed MeshMapper β a public LoRa mesh analytics network. No server address needed; the preset has it baked in.
set mqtt3.preset meshmapper
Bridges to mqtt.jordanfstop.com over secure WebSockets. This feeds Beacon and CoreScope β the local Palouse Mesh analytics dashboards.
set mqtt4.preset custom set mqtt4.server wss://mqtt.jordanfstop.com set mqtt4.port 443
Controls how many bytes are used to represent each hop in a packet's path. The firmware value is zero-indexed β so set path.hash.mode 1 selects 2-byte hashing, not 1-byte.
| Command value | Bytes per hop | Unique values | Notes |
|---|---|---|---|
| mode 0 | 1 byte | 256 | Default β collisions on any real network |
| mode 1 β | 2 bytes | 65,536 | Recommended for PUW region |
| mode 2 | 3 bytes | 16,777,216 | Higher overhead, large networks only |
set path.hash.mode 1
Tells the mesh where this node sits geographically, so traffic can be scoped appropriately. Requires firmware v1.16.0+. This follows the proposed PNW region scope practice.
region def west pnw wa e-wa puw|e-wa geg region save
When someone sends a message scoped to puw, only repeaters that explicitly carry puw will forward it. There is no automatic inheritance β a node carrying wa but not puw will not forward puw-scoped traffic. Every ancestor in the chain must be listed so this node participates at each level of scope.
Why each tag is included
| west | Root of the tree β Western US and SW Canada. Lets this node forward mesh-wide announcements. Without it, west-scoped traffic won't pass through. |
| pnw | Pacific Northwest (WA, OR, ID, MT, BC). Lets this node forward cross-state regional traffic. Without it, pnw-scoped messages β emergencies, nets, region-wide announcements β stop here. |
| wa | Washington state. Lets this node forward statewide traffic. Carrying pnw alone is not enough β wa-scoped messages need wa explicitly. |
| e-wa | Eastern Washington β this side of the Cascades. Lets this node forward traffic scoped to the eastern half of the state without it reaching the Seattle side. |
| puw|e-wa | PullmanβMoscow / Palouse area (PUW = PullmanβMoscow Regional Airport). The primary local scope β this is the tag most messages on Palouse Mesh will use. The |e-wa sets its parent; geg follows as a second child of the same parent. |
| geg | Spokane metro (GEG = Spokane International Airport). High-site nodes on the Palouse have line-of-sight into the Spokane area, so carrying geg lets them serve both communities. Included while region scoping adoption is still early β will be revisited once the broader network is more consistent. |
| region save | Commits the tree to persistent memory. Without this, the entire hierarchy is lost on reboot. |
region def is not available. Use region put <tag> <parent> for each level instead, and after each one run region allowf <tag> to add it to the flood list. On v1.15.0+, region put enables flooding by default so allowf is not needed. On v1.16.0+, use region def as shown above.
region def hierarchy above is being adopted at this time.
A full restart is required to initialize the radio and network stack with the committed configuration.
reboot
After reboot, verify the configuration is active before moving on:
get wifi.ssid β confirms uplink credentials loadedget mqtt.iata β should return PUWget bridge.enabled β should be onget mqtt3.preset β should return meshmapperget mqtt4.preset β should return customget mqtt.status β slots 3 and 4 should show (ok)Send an advertisement to announce your node and trigger it to appear in dashboards. This can be done from the serial console, meshmonitor web UI, or any connected interface:
advert
Then confirm your node is live in three places:
mqtt.jordanfstop.com β appearing here confirms slot 4 is delivering data to the Palouse Mesh broker.
mqtt.jordanfstop.com broker β either CoreScope or Beacon appearing is sufficient to confirm slot 4 is live.
The LM badge next to your node reflects slots 1 & 2 (LetsMesh presets). If you didn't configure those slots, it will show disconnected or stale β that's expected and fine. The M badge is the one to verify.