View this page on MeshCore Docs.
# Telemetry decoder The decoder runs on the documentation website. GitHub's Markdown preview shows the instructions but cannot run the decoder's buttons or JavaScript. Paste raw hexadecimal packet data copied from the [Let's Mesh packet analyzer](https://analyzer.letsmesh.net/packets) to decode a repeater's temperature, battery-voltage, external I2C-voltage, or radio noise-floor snapshot. The decoder also accepts the payload hex without its MeshCore packet header and the Base64 pages returned by repeater or room-server CLI commands. Decoding happens entirely in this browser; pasted data is not uploaded or sent anywhere. The **Source ID** in a raw-packet result is the first eight bytes of the sending repeater's public key. Match that 16-character hex value against the public-key prefix recorded for your repeaters. It comes from the telemetry payload itself, so it is available even when only the payload was copied. ## Send raw telemetry packets From an administrator CLI session, first configure a direct route to the MQTT observer that will receive and upload the raw packets. Use `direct` when the observer is a zero-hop neighbor: ```text set data.tx path direct send telemetry.tx now ``` For a routed observer, provide its comma-separated hop hashes instead: ```text set data.tx path A1B2,C3D4 send telemetry.tx now ``` Telemetry with a non-empty hop path uses the existing direct-message echo retries, following `direct.retry`, `direct.retry.count`, `direct.retry.heard`, and the direct-retry coding-rate policy. Retries stop when a matching downstream forwarding echo is heard. The default zero-hop `direct` route does not use echo retries. Updated relays can retry their own forwarding hop; stock relays remain compatible and their forwarding can provide the echo. This adds no packet format or ACK: an echo confirms forwarding, not final delivery to the observer. A queue failure still retries only the packet that failed to queue, after 30 minutes. The shared route does not enable telemetry. Automatic telemetry is off on a fresh install; to explicitly keep the route manual-only before sending: ```text set telemetry.tx schedule off send telemetry.tx now ``` The `send telemetry.tx now` command queues one `TTB1` temperature packet, one `TVB1` battery-voltage packet, and `IVB1` chunks for every connected I2C voltage channel. `TTB1` and `TVB1` carry up to 165 samples. Each `IVB1` carries 64, so a full 192-point/four-day channel takes three packets. Channels whose retained history is entirely zero are treated as disconnected and are not sent. The command requires at least one collected base sample and works even when the automatic schedule is off. It also queues a `N1B1` noise-floor packet once the main radio has completed a 15-minute history bucket. With radio2 enabled, it queues a separate `N2B1` packet for that profile once it has a completed bucket. Each holds the latest 255 positions: up to 63 hours 45 minutes at 15-minute resolution. A position can be Missing; failed measurements do not silently shorten the timeline. The existing automatic transmission cadence is unchanged. Recording a new noise-floor position every 15 minutes does not transmit a packet every 15 minutes. Use `get telemetry.tx` to see the source ID, path, and `last=30s`, `last=30m`, or `last=2h` for the age of this node's latest completed telemetry transmission. The age includes completed retries and manual sends while the schedule is off, but excludes queue acceptance and relayed packets; it does not confirm observer receipt. It shows `last=never` until the first completed send after each reboot. The age uses uptime rather than the clock, and durations of a day or more remain in hours, such as `last=48h`. Schedule changes are saved transactionally; a failed write does not truncate the previous preferences. A legacy route must be successfully migrated into `data.tx` before its schedule can run. Corrupt, unreadable, or ambiguously committed preferences stop automatic and pending sends. `get telemetry.tx` shows `fault=prefs`, and manual sends return an error instead of acknowledging work that cannot run. Such a storage fault must be repaired before settings can be changed; the firmware does not overwrite an unmigrated legacy file. ## Find telemetry packets [Open the two-day telemetry view in CascadiaMesh Analyzer](https://analyzer.cascadiamesh.org/#/packets?timeWindow=2880&filter=type%20%3D%3D%20RAW_CUSTOM%20%26%26%20age%20%3C%202d%20%26%26%20%28payload.raw%20starts_with%20%2254544231%22%20%7C%7C%20payload.raw%20starts_with%20%2254564231%22%20%7C%7C%20payload.raw%20starts_with%20%2249564231%22%20%7C%7C%20payload.raw%20starts_with%20%224E314231%22%20%7C%7C%20payload.raw%20starts_with%20%224E324231%22%29). The link selects RAW_CUSTOM packets whose data starts with any of the five telemetry prefixes below. To use the filter box directly, paste this as one line: ```text type == RAW_CUSTOM && age < 2d && (payload.raw starts_with "54544231" || payload.raw starts_with "54564231" || payload.raw starts_with "49564231" || payload.raw starts_with "4E314231" || payload.raw starts_with "4E324231") ``` | Data | Payload tag | Hex prefix | |---|---|---| | Temperature | `TTB1` | `54544231` | | Battery voltage | `TVB1` | `54564231` | | External I2C voltage | `IVB1` | `49564231` | | Main-radio noise floor | `N1B1` | `4E314231` | | Radio2 noise floor | `N2B1` | `4E324231` | `&&` requires every condition; `||` accepts any listed prefix. `payload.raw` starts at the application data, after the routing bytes. The URL uses `timeWindow=2880` (two days in minutes). The explicit `age < 2d` condition preserves that cutoff when refreshing, since the analyzer's time dropdown only offers fixed windows up to 24 hours. Packet retention and loading limits still apply: the current server returns at most 10,000 packets, and mobile clients load at most 1,000, so a busy network may show less than two days. ## Decode a packet If you are reading this on GitHub, [open the working decoder on the documentation website](https://mikecarper.github.io/MeshCore/telemetry_decoder/#decode-a-packet) to paste a packet, load an example, or download CSV.Enable JavaScript on the documentation website to use the decoder.