<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.scotmesh.net/index.php?action=history&amp;feed=atom&amp;title=MeshCore%2FObservers</id>
	<title>MeshCore/Observers - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.scotmesh.net/index.php?action=history&amp;feed=atom&amp;title=MeshCore%2FObservers"/>
	<link rel="alternate" type="text/html" href="https://wiki.scotmesh.net/index.php?title=MeshCore/Observers&amp;action=history"/>
	<updated>2026-11-03T20:40:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.scotmesh.net/index.php?title=MeshCore/Observers&amp;diff=29&amp;oldid=prev</id>
		<title>Admin: Import MeshCore content from scotmesh-wiki (faithful; freshness pass next)</title>
		<link rel="alternate" type="text/html" href="https://wiki.scotmesh.net/index.php?title=MeshCore/Observers&amp;diff=29&amp;oldid=prev"/>
		<updated>2026-11-03T17:06:24Z</updated>

		<summary type="html">&lt;p&gt;Import MeshCore content from scotmesh-wiki (faithful; freshness pass next)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Observers}}&lt;br /&gt;
&amp;lt;span id=&amp;quot;meshcore-observers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MeshCore Observers ==&lt;br /&gt;
&lt;br /&gt;
Observers are how ScotMesh nodes appear on the live map. An &amp;#039;&amp;#039;&amp;#039;MQTT observer&amp;#039;&amp;#039;&amp;#039; build is a repeater-style MeshCore firmware image that can push mesh traffic up to one or more &amp;#039;&amp;#039;&amp;#039;MQTT&amp;#039;&amp;#039;&amp;#039; brokers — feeding live maps and tools — without replacing the normal RF repeater role. You can also run a receive-only observer at a site that does not repeat on air.&lt;br /&gt;
&lt;br /&gt;
For the full technical detail on the bridge (up to three broker slots, presets, &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, JWT &amp;lt;code&amp;gt;audience&amp;lt;/code&amp;gt;, merged first flash, and more), see the upstream write-up: [https://github.com/agessaman/MeshCore/blob/mqtt-bridge-implementation-flex/MQTT_IMPLEMENTATION.md MQTT_IMPLEMENTATION.md (agessaman fork)].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;firmware&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Firmware ===&lt;br /&gt;
&lt;br /&gt;
Prebuilt &amp;#039;&amp;#039;&amp;#039;repeater observer MQTT&amp;#039;&amp;#039;&amp;#039; binaries are published here:&lt;br /&gt;
&lt;br /&gt;
https://static.loraproject.ie/mqtt/&lt;br /&gt;
&lt;br /&gt;
Pick the file that matches your &amp;#039;&amp;#039;&amp;#039;exact board&amp;#039;&amp;#039;&amp;#039; (Heltec, LilyGo, RAK, Station G2, and others appear in the directory listing).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;*_merged.bin&amp;lt;/code&amp;gt; vs the non-merged &amp;lt;code&amp;gt;.bin&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Files ending in &amp;lt;code&amp;gt;_merged.bin&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; are a &amp;#039;&amp;#039;&amp;#039;full&amp;#039;&amp;#039;&amp;#039; image (bootloader, partition table, and application). Flashing one &amp;#039;&amp;#039;&amp;#039;normally wipes&amp;#039;&amp;#039;&amp;#039; stored repeater settings). Use merged when you &amp;#039;&amp;#039;&amp;#039;need&amp;#039;&amp;#039;&amp;#039; that full layout refresh—for example the &amp;#039;&amp;#039;&amp;#039;first&amp;#039;&amp;#039;&amp;#039; move to observer firmware on a board, or when the observer build’s &amp;#039;&amp;#039;&amp;#039;partition table&amp;#039;&amp;#039;&amp;#039; is new for that hardware (see “Partition Table Changes” in [https://github.com/agessaman/MeshCore/blob/mqtt-bridge-implementation-flex/MQTT_IMPLEMENTATION.md MQTT_IMPLEMENTATION.md]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Files without &amp;lt;code&amp;gt;_merged&amp;lt;/code&amp;gt; in the name&amp;#039;&amp;#039;&amp;#039; update the &amp;#039;&amp;#039;&amp;#039;app&amp;#039;&amp;#039;&amp;#039; only when the &amp;#039;&amp;#039;&amp;#039;partition layout is unchanged&amp;#039;&amp;#039;&amp;#039;. That path is what you want when you &amp;#039;&amp;#039;&amp;#039;already run observer firmware or a repeater&amp;#039;&amp;#039;&amp;#039; on that board and you want to &amp;#039;&amp;#039;&amp;#039;keep&amp;#039;&amp;#039;&amp;#039; your current configuration through an upgrade.&lt;br /&gt;
&lt;br /&gt;
After a merged flash, &amp;#039;&amp;#039;&amp;#039;re-enter&amp;#039;&amp;#039;&amp;#039; RF settings, node name, Wi‑Fi, MQTT, &amp;lt;code&amp;gt;mqtt.iata&amp;lt;/code&amp;gt;, and other stored values. After a non-merged upgrade on the same layout, settings are &amp;#039;&amp;#039;&amp;#039;usually&amp;#039;&amp;#039;&amp;#039; kept—still read release notes. Later updates can use &amp;#039;&amp;#039;&amp;#039;OTA&amp;#039;&amp;#039;&amp;#039; ([[#updates-without-usb-start-ota|&amp;lt;code&amp;gt;start ota&amp;lt;/code&amp;gt;]]) or a non-merged binary when appropriate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;updates-without-usb-start-ota&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Updates without USB: &amp;lt;code&amp;gt;start ota&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
On the repeater &amp;#039;&amp;#039;&amp;#039;serial console&amp;#039;&amp;#039;&amp;#039; (same place you run &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; commands), you can start the &amp;#039;&amp;#039;&amp;#039;over-the-air&amp;#039;&amp;#039;&amp;#039; path that brings up Wi‑Fi for firmware upload, so you do not have to plug in USB for every update. The exact command is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;start ota&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use your build’s normal OTA workflow (browser or tool) once the device is advertising the update Wi‑Fi. Keep power stable during the flash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;observer-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Observer setup ===&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Flash&amp;#039;&amp;#039;&amp;#039; the &amp;lt;code&amp;gt;*repeater_observer_mqtt*&amp;lt;/code&amp;gt; file for your board ([[#firmware|Firmware]] explains &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;_merged.bin&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; vs non-merged).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;If NVS was wiped&amp;#039;&amp;#039;&amp;#039; (typical after &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;_merged.bin&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;; &amp;#039;&amp;#039;&amp;#039;NVS&amp;#039;&amp;#039;&amp;#039; is &amp;#039;&amp;#039;Non-Volatile Storage&amp;#039;&amp;#039;—flash-backed settings such as Wi‑Fi, MQTT, and radio prefs), set &amp;#039;&amp;#039;&amp;#039;RF and node identity&amp;#039;&amp;#039;&amp;#039; first: frequency, bandwidth, SF, CR, TX power, and &amp;#039;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;#039; must match your mesh before the node is useful on air. Use the &amp;#039;&amp;#039;&amp;#039;device web UI&amp;#039;&amp;#039;&amp;#039; or admin screens, or serial, using your coordinator’s values; repeater planning is in [[MeshCore/Regions|Regions]]. &amp;#039;&amp;#039;&amp;#039;Then&amp;#039;&amp;#039;&amp;#039; work through &amp;#039;&amp;#039;&amp;#039;Wi‑Fi&amp;#039;&amp;#039;&amp;#039; → &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;mqtt.iata&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; → (optional &amp;#039;&amp;#039;&amp;#039;receive-only&amp;#039;&amp;#039;&amp;#039;) → &amp;#039;&amp;#039;&amp;#039;MQTT&amp;#039;&amp;#039;&amp;#039; in order below. &amp;#039;&amp;#039;&amp;#039;If you used a non-merged&amp;#039;&amp;#039;&amp;#039; update and kept settings, use &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; and only redo what is wrong—but &amp;#039;&amp;#039;&amp;#039;still check MQTT&amp;#039;&amp;#039;&amp;#039;: stock images often leave &amp;#039;&amp;#039;&amp;#039;LetsMesh Analyzer US&amp;#039;&amp;#039;&amp;#039; on &amp;#039;&amp;#039;&amp;#039;slot 1&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;LetsMesh Analyzer EU&amp;#039;&amp;#039;&amp;#039; on &amp;#039;&amp;#039;&amp;#039;slot 2&amp;#039;&amp;#039;&amp;#039; until you repoint them (for example MayoMesh on slot 1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wifi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wi‑Fi ====&lt;br /&gt;
&lt;br /&gt;
The observer needs LAN or internet path to the broker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set wifi.ssid YourWiFiNetwork&lt;br /&gt;
set wifi.pwd YourWiFiPassword&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;site-code-mqtt.iata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Site code (&amp;lt;code&amp;gt;mqtt.iata&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
A short tag for &amp;#039;&amp;#039;&amp;#039;where the repeater sits&amp;#039;&amp;#039;&amp;#039;. It appears in MQTT topics and on maps—pick something stable (IATA-style codes are common).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code&lt;br /&gt;
! Area&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EDI&amp;lt;/code&amp;gt;&lt;br /&gt;
| Edinburgh&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DND&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dundee&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GLA&amp;lt;/code&amp;gt;&lt;br /&gt;
| Glasgow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set mqtt.iata EDI&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;optional-receive-only-on-rf&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Optional: receive-only on RF ====&lt;br /&gt;
&lt;br /&gt;
If this unit should &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; relay mesh traffic on air:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set repeat off&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;mqtt-mayomesh-on-slot-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== MQTT (MayoMesh on slot 1) ====&lt;br /&gt;
&lt;br /&gt;
ScotMesh uses &amp;#039;&amp;#039;&amp;#039;MayoMesh&amp;#039;&amp;#039;&amp;#039; for the shared observer map and broker (who runs it and links: [[#mayomesh-live-map|MayoMesh live map]]). Observer builds usually ship with &amp;#039;&amp;#039;&amp;#039;LetsMesh Analyzer US&amp;#039;&amp;#039;&amp;#039; on &amp;#039;&amp;#039;&amp;#039;slot 1&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;LetsMesh Analyzer EU&amp;#039;&amp;#039;&amp;#039; on &amp;#039;&amp;#039;&amp;#039;slot 2&amp;#039;&amp;#039;&amp;#039;. Point &amp;#039;&amp;#039;&amp;#039;slot 1&amp;#039;&amp;#039;&amp;#039; at MayoMesh for our map. &amp;#039;&amp;#039;&amp;#039;Apply this whenever &amp;lt;code&amp;gt;get mqtt1.preset&amp;lt;/code&amp;gt; is not already your MayoMesh custom setup&amp;#039;&amp;#039;&amp;#039;—including after a merged flash &amp;#039;&amp;#039;&amp;#039;and&amp;#039;&amp;#039;&amp;#039; after a non-merged upgrade from stock observer images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set mqtt1.preset custom&lt;br /&gt;
set mqtt1.server mqtt.mayomesh.net&lt;br /&gt;
set mqtt1.port 443&lt;br /&gt;
set mqtt1.audience mqtt.mayomesh.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; use MayoMesh and want to free a second TLS slot on low-RAM boards (see upstream notes on PSRAM / two WSS connections):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set mqtt2.preset none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;reboot&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
With &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;audience&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; set, the device uses &amp;#039;&amp;#039;&amp;#039;JWT (Ed25519)&amp;#039;&amp;#039;&amp;#039; sign-in to the broker, same idea as the built-in WSS presets in [https://github.com/agessaman/MeshCore/blob/mqtt-bridge-implementation-flex/MQTT_IMPLEMENTATION.md MQTT_IMPLEMENTATION.md].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;check&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Check ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;get mqtt.status&lt;br /&gt;
get mqtt1.preset&lt;br /&gt;
get mqtt.tx&lt;br /&gt;
get mqtt.rx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Confirm the node shows on [https://meshcore.mayomesh.net/ meshcore.mayomesh.net] after a short wait.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mayomesh-live-map&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== MayoMesh live map ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Who runs it:&amp;#039;&amp;#039;&amp;#039; MayoMesh (the map and &amp;lt;code&amp;gt;mqtt.mayomesh.net&amp;lt;/code&amp;gt; broker) is operated by &amp;#039;&amp;#039;&amp;#039;County Mayo&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Ireland&amp;#039;&amp;#039;&amp;#039;. ScotMesh uses that community’s infrastructure for the shared observer map.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LetsMesh Analyzer:&amp;#039;&amp;#039;&amp;#039; [https://analyzer.letsmesh.net/packets?region=EDI,DND,DUB,BHD,GLA packet view filtered to &amp;lt;code&amp;gt;EDI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DND&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DUB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BHD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GLA&amp;lt;/code&amp;gt;].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MayoMesh live map:&amp;#039;&amp;#039;&amp;#039; [https://meshcore.mayomesh.net/ meshcore.mayomesh.net] — MQTT over WebSocket (for example &amp;lt;code&amp;gt;wss://mqtt.mayomesh.net&amp;lt;/code&amp;gt;, as shown on the site).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Broker commands&amp;#039;&amp;#039;&amp;#039; for your repeater are in [[#observer-setup|Observer setup]] under &amp;#039;&amp;#039;&amp;#039;MQTT (MayoMesh on slot 1)&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Self-hosting the map UI:&amp;#039;&amp;#039;&amp;#039; based on [https://github.com/yellowcooln/meshcore-mqtt-live-map yellowcooln/meshcore-mqtt-live-map]; point your instance at MayoMesh’s broker instead of default LetsMesh-style endpoints.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mqtt-uplink-mqtt.tx-advert-vs-on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== MQTT uplink: &amp;lt;code&amp;gt;mqtt.tx&amp;lt;/code&amp;gt; advert vs &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
These control &amp;#039;&amp;#039;&amp;#039;which of this node’s transmitted packets&amp;#039;&amp;#039;&amp;#039; are sent upstream over MQTT. &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;mqtt.rx&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; is separate (received packets).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting&lt;br /&gt;
! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set mqtt.tx advert&amp;lt;/code&amp;gt;&lt;br /&gt;
| Uplink &amp;#039;&amp;#039;&amp;#039;only this node’s own advert&amp;#039;&amp;#039;&amp;#039; TX packets. Lighter load; usually enough for map presence.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set mqtt.tx on&amp;lt;/code&amp;gt;&lt;br /&gt;
| Uplink &amp;#039;&amp;#039;&amp;#039;all TX&amp;#039;&amp;#039;&amp;#039; from this node. Richer feed, more bandwidth and airtime.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set mqtt.tx off&amp;lt;/code&amp;gt;&lt;br /&gt;
| No TX uplink over MQTT.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For most map feeds, &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;advert&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; is enough:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set mqtt.tx advert&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you need every TX packet this node sends mirrored upstream:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;set mqtt.tx on&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; only when you intend that heavier feed (more bandwidth and airtime).&lt;br /&gt;
## 🔗 See also&lt;br /&gt;
&lt;br /&gt;
* [[MeshCore/Regions|Regions]] — repeater region codes on the Scottish mesh.&lt;br /&gt;
* [[MeshCore|MeshCore]] — hub page for channels, scopes, and related guides.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>