Repository navigation
v1.2.0
v1.2.0 - 2026-09-30
Baseline v1.0.6. openHop Modems and SPI radio hats join KISS firmware, the MQTT status now uses
the firmware's own names and meanings, and brokers stay connected through outages and token
refreshes.
Config adds the openhop:// and spi:// connections and the spiBoard, modemToken and
dutyCycle settings. nodeType is no longer needed.
Added
- openHop Modems. Connect with
openhop:///dev/ttyUSB0over USB, oropenhop://host:port
over the network withmodemTokenas its password. The modem's radio is set to MeshCore's
settings on every connect, and a dropped link reconnects on its own. - SPI radio hats on a Raspberry Pi. Connect with
spi://and choose the hat by name with
spiBoard, from 15 SX1262 hats, the same list OwlShack has. Atxabove the hat's rating is
refused rather than turned down. To add a hat or correct one, put aboards.jsonin the
directory the bot runs from. - Packets the bot sends appear on MQTT. Each one is published with
"direction": "tx", as
firmware nodes publish theirs. Signal fields are left off, since there is no received signal to
report. - Received packets carry
score,durationandpath.scoreanddurationmatch the
firmware's packet log.pathis the source and destination prefixes, as the firmware prints them,
not the route. - The status reports more of what the firmware does.
mcu_temp_c,last_snr,last_rssi,
rx_air_secs,tx_air_secs,flood_txanddirect_txare new instats, andrepeatis new
at the top level.mcu_temp_cis left out on a board without a temperature sensor. - The status reports transmit and receive faults. New counters in
statsshow packets
retried, dropped or failed, and whether the channel was busy or the bot sent faster than the radio
could keep up. They count everything this process sends and receives, not one bot. - SPI hats and openHop Modems report chip-level errors.
crc_errors,driver_errorsand
recv_recoveriesappear instatswhere the radio can measure them, and are left out on KISS. dutyCyclelimits how much of the time the radio transmits. It is a percentage, like the
firmware'sset dutycycle, and takes fractions such as0.1for EU868 sub-bands. The default is
unchanged, and the duty cycle in use is logged at startup.- Slow message handling is logged and counted. One slow reply holds up every bot's receiving,
so any that takes over half a second is logged and counted instats.handler_slow. - The bot reconnects a radio that is lost. An unplugged modem, a dropped link, or a radio that
stops answering for about 90 seconds is reconnected on its own, with retries up to every 30
seconds, and the bots and MQTT status come back with it. Before, the bot kept running but heard
and sent nothing until it was restarted.
Changed
recv_errorsnow means what it means on a firmware node. It counts packets the radio
failed to receive. It used to count packets that arrived intact but did not decode, which is now
packet_parse_errors. Firmware nodes publishrecv_errorsto the same brokers, so the two now
agree.battery_percentis replaced bystats.battery_mv. The firmware reports millivolts, and the
old percentage showed 100% on boards with no battery.battery_mvis left out when the board has
no battery or has stopped answering.noise_floormoved intostats. It sits with the other radio readings, as the firmware
reports it.stats.packets_receivedis nowstats.recv, withstats.packets_recvbeside it. These are
the names the firmware and CoreScope use.stats.sentis published alongside
stats.packets_sent.SNRandRSSIare left out when a packet arrives without them. They used to read 0, which
looked like a real measurement.- The connection chooses the radio.
nodeTypeis ignored, so an existing config still loads
and it can be deleted.
Fixed
- A broker that is down at startup is retried. It used to be dropped until the bot was
restarted or reloaded. It is now retried with a growing delay, up to 5 minutes. - Startup no longer waits for brokers. Each unreachable broker could hold up startup for 10
seconds. The bot now starts at once and connects in the background. - Shutdown and reload no longer hang on an unresponsive broker. The last status sent on the way
down now gives up after 5 seconds rather than waiting forever. - A failed token refresh no longer leaves a broker disconnected. The broker used to stay
down for 6 minutes or more. It now reconnects straight away. - Refreshing a token no longer makes the connection flap. The old connection is closed before
it can push the new one off. packets_sentandqueue_lenreport real values. Both read 0 on every status since v1.0.6.- Every counter in a status is taken at the same moment. A packet arriving mid-report could
showrecv: 2beside alast_rssiof 0. - Sends that meet a busy radio are retried again. They had been given up on at the first try.
- Long packets at slow radio settings are no longer counted as failed. The bot now waits as
long as the packet takes on air, rather than a fixed time that the largest packets could outlast. - A modem that stops answering no longer shows its last battery and temperature. They are left
out once it has been silent for 45 seconds. - A packet that failed to send no longer appears on MQTT as sent.
- A config mistake on reload keeps the running config. An unknown connection used to stop the
bot. It is now refused when the config loads, as isspi://withoutspiBoard.
Upgrading
- If you read this node's MQTT status, check
recv_errorsfirst. It keeps its name but changes
meaning, and nothing on the wire marks the change. A rate or delta over it will jump at the
upgrade. Usepacket_parse_errorsif you wanted the old count. - Other MQTT fields to check:
battery_percentis gone,noise_floorhas moved intostats,
stats.packets_receivedis nowstats.recv, andSNR,RSSI,battery_mvandmcu_temp_c
can be absent. - Building from source needs Go 1.26.7.
What's Changed
- feat: openHop and SPI radios, firmware-named MQTT status, broker resilience by @tuzzmaniandevil in #20
- chore: CI on PRs into dev, rc tags as pre-releases, maxRetries wording by @tuzzmaniandevil in #21
- feat: reconnect a radio that is lost by @tuzzmaniandevil in #22
- Release v1.2.0 by @tuzzmaniandevil in #23
- v1.2.0 by @tuzzmaniandevil in #24
Full Changelog: v1.0.6...v1.2.0