Put your bots on the air
An observer is the radio your bots speak through: a repeater you already run, with the txmesh plugin. When someone on your mesh sends one of your !commands, this is the radio that hears it and transmits the answer. It carries your scheduled announcements and weather alerts the same way, and everything it hears while doing that lands on the live map. Nothing to flash, no second radio. About twenty minutes if the repeater is already up.
What an observer really is
Your end of a hosted bot service, not a listening post.
A gateway is an openHop repeater running the txmesh plugin. The plugin adds a companion identity to the radio, so the same board keeps repeating for everyone and also has a node of its own. That node is what your bots run through: it hears the trigger, txmesh renders the reply, and the same radio transmits it back over the route the request took.
Built in the Commands tab from helpers like {seen}, {vitals} and {route}. Your bots fire only on traffic your gateways hear and reply only through your gateways.
Anything you want on your mesh at a set time, transmitted from your radio.
Automated NWS watches and warnings and river-gauge flood stages for your area, on the air the moment they are issued.
!path and !mpath answer with a link to the path a message actually took to reach your radio.
Everything the radio hears while doing that lands in the archive behind the live map, the node roster, the topology graph and the route traces. That is why we call it an observer, but the observing is the byproduct: the radio is there to run your bots, and the picture of the mesh is what falls out. The wire contract between the plugin and this site is documented in How it works, if you would rather build your own backend.
What you need
A LoRa board running openHop Repeater, on a host you can log in to. Version 1.1.4 or newer has a Plugins page in its web UI, which is the easy install. Older versions work with the manual install below.
The plugin connects outbound to the collector over TLS on port 443. No inbound ports, no port forwarding.
Tick I'm going to run an observer when you sign up, or press Enable observer access on the Bot setup page later. Either way you get one broker login that every gateway you run shares.
What the mesh will see, so pick one unique to you. It has to match exactly in two places, which is the most common thing to get wrong.
Step by step
The Bot setup page renders both config files below with your login and node name filled in. This page explains what they are and where they go.
No Plugins page, or running it on a separate machine? Install it by hand on the repeater host:
python3 -m venv /opt/openhop_txmesh /opt/openhop_txmesh/bin/pip install openhop-txmesh-plugin /opt/openhop_txmesh/bin/openhop-txmesh --helpThe manual setup guide also has a systemd unit so it starts with the repeater.
openhop-txmesh keygenThen add a companion to the repeater's config.yaml (/etc/openhop_repeater/config.yaml for the systemd install; on Docker it is in the container's config volume), under identities: companions:. Indentation matters in YAML, and a misaligned block stops the repeater from starting.
identities:
companions:
- name: "YOUR-NODE-NAME"
identity_key: "PASTE-IDENTITY-KEY-HERE"
settings:
node_name: "YOUR-NODE-NAME"
tcp_port: 5001
bind_address: "127.0.0.1"
tcp_timeout: 0
Restart the repeater and check its log for the companion frame server coming up:
sudo systemctl restart openhop-repeater sudo journalctl -u openhop-repeater -n 50 | grep -i "companion frame server"
| setting | value |
|---|---|
| node_name | Exactly the name in the companion block above. Same spelling, same case. |
| companion_host / companion_port | 127.0.0.1 and 5001, matching the companion's bind_address and tcp_port. |
| host / port / transport | the collector host, 443, websockets. Use the endpoint Bot setup shows; a different broker address is the usual reason for "connected, but nothing arrives". |
| tls_enabled | true |
| username / password | The broker login from step 1, not your txmesh sign-in. |
| channels | Which channels the node joins, besides Public which is always on. [{"idx": 1, "name": "#bot"}] is the usual start. A #hashtag channel needs nothing else; a private channel also needs its secret as hex. |
Every other setting has a sensible default; the configuration reference lists them all.
If it doesn't show up
What it shares along the way
The adverts, path hashes and channel messages it hears on the channels you joined, plus its own health: battery, uptime, packet counts. It cannot read direct messages or channels it doesn't hold a key for, so those never leave the radio. On the public site, companion positions are coarsened to about a kilometre and position history is held back; signed-in operators see the precise data their own gateways collected.