Run interface poll on the event loop (fix async_dispatcher_send off-thread)
The interface-status poll was registered as a plain lambda, so async_track_time_interval ran it in an executor thread, where its _push_state()->async_dispatcher_send() call tripped HA's thread-safety guard. Make refresh_interface_status a @callback (it only reads fast in-memory interface attributes) and pass it to async_track_time_interval directly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -612,10 +612,13 @@ class ReticulumManager:
|
||||
# ------------------------------------------------------------------
|
||||
# Helpers
|
||||
# ------------------------------------------------------------------
|
||||
def refresh_interface_status(self) -> None:
|
||||
@callback
|
||||
def refresh_interface_status(self, now: Any = None) -> None:
|
||||
"""Recompute interface online status and collect telemetry.
|
||||
|
||||
Called on the event loop from a periodic timer. RX/TX byte counters and
|
||||
Decorated with @callback and used directly as the async_track_time_interval
|
||||
action so it runs on the event loop (only fast in-memory interface
|
||||
attribute reads happen here, no blocking I/O). RX/TX byte counters and
|
||||
bitrate are available for the TCP client interface; RSSI/SNR/quality are
|
||||
only populated when the underlying interface is a physical one (e.g. an
|
||||
RNode/LoRa interface) and stay ``None`` for a plain TCP link.
|
||||
|
||||
Reference in New Issue
Block a user