Note
AI Generated on behalf of @allangood by Claude Code.
This is a reliability release. Most of these fixes came out of a code review and were then tested on a real RTL2832U / R820T dongle. It fixes a bug that could corrupt your Home Assistant energy statistics, and several problems that left the receiver stuck or the add-on unable to recover. It also adds a watchdog for receivers that keep running but stop decoding.
No configuration changes are required to upgrade.
⚠️ Meter readings could be corrupted
If you use the format option, a reading with more digits than the format has # placeholders lost its last digits. For example, '####.##' with 1234567 came out as 1234.56 instead of 12345.67. With the default state_class: total_increasing, Home Assistant reads that sudden drop as a meter reset, which corrupts long-term statistics. This can happen when a meter rolls over into an extra digit. The whole-number part now grows to fit. (#452)
🐕 New: watchdog for receivers that stop decoding
A dongle or rtl_tcp can get wedged and stay running while decoding nothing. Until now nothing noticed, because recovery only happened when rtlamr exited. The new watchdog_timeout option restarts rtl_tcp and rtlamr after that many seconds without a decoded message, resetting the USB dongle when it's local:
general:
watchdog_timeout: 1800 # seconds; 0 = disabled (default)It's off by default. rtlamr runs with -unique=true, so it stays silent while a reading doesn't change. Set the timeout well above your meters' longest quiet period. (#457)
📡 A more reliable receiver
- rtl_tcp could freeze. Its output was never read after startup, so a long-running instance could fill the pipe and block. From the outside, that looks exactly like a stuck receiver. Stopping a process also leaked a file descriptor every time. (#453)
- rtl_tcp was SIGKILLed on every stop: every sleep cycle, every recovery and every shutdown. rtl_tcp ignores SIGTERM for about 5 seconds after its client disconnects, and we always stopped it right after rtlamr. It now gets a longer grace period and exits cleanly, so the dongle is closed properly. (#458)
- A custom rtl_tcp port now works. With
rtltcp_host: "127.0.0.1:1235", a local rtl_tcp used to keep listening on 1234, so rtlamr could never connect. (#460)
🔁 Restarts and shutdown
- Automatic restarts actually happen. After an unrecoverable error the add-on used to exit with code 0, so Docker's
restart: on-failureand the Home Assistant watchdog never brought it back. It now exits non-zero, and task errors are logged with a traceback. (#455) - Stopping the add-on is fast. A shutdown used to wait for rtlamr to decode the next meter message, or for a retry backoff of up to about a minute, often past Docker's and the Supervisor's 10 s stop timeout. (#454, #456)
📦 Build and packaging
- The Docker image now builds rtl-sdr from the
v2.0.3tag instead of git HEAD, so builds are reproducible. (#461) - The add-on no longer asks for serial port (
uart) access. The RTL-SDR is a raw USB device, andusbalready covers it. (#462) - The USB reset log line no longer claims every reset came "after rtlamr read timeout". (#459)
Upgrade notes
- Stopping rtl_tcp now takes about 5 s instead of about 2 s, because it now exits on its own instead of being SIGKILLed. Shutdown still finishes well within the 10 s stop timeout.
- After updating the Home Assistant add-on, check that it still sees your dongle (it shouldn't need
uart).
See CHANGELOG.md for the full entry.
What's Changed
- Update pytest requirement from >=9.1.1 to >=9.2.0 by @dependabot[bot] in #450
- Fix format_number dropping digits when reading exceeds format width by @allangood in #452
- Drain rtl_tcp stdout so a full pipe can't block it by @allangood in #453
- Stop waiting on rtlamr output when shutdown is requested by @allangood in #454
- Exit non-zero when shutting down after an unrecoverable error by @allangood in #455
- Stop retrying process starts once shutdown is requested by @allangood in #456
- Add watchdog_timeout to restart a receiver that stops decoding by @allangood in #457
- Let rtl_tcp exit gracefully instead of always being SIGKILLed by @allangood in #458
- Drop the hard-coded reason from the USB reset log message by @allangood in #459
- Start local rtl_tcp on the port given in rtltcp_host by @allangood in #460
- Pin rtl-sdr to v2.0.3 in the Docker build by @allangood in #461
- Stop requesting serial port access for the add-on by @allangood in #462
- Release v2026.11.7 by @allangood in #463
Full Changelog: 2026.10.15...2026.11.7