diff --git a/gauge.py b/gauge.py index b24808a..f382b78 100644 --- a/gauge.py +++ b/gauge.py @@ -756,6 +756,10 @@ def connect_mqtt(): _mqtt_check_interval_ms = 30000 _last_mqtt_check = 0 +_discovery_phases = () +_discovery_phase_idx = 0 +_last_discovery_ms = 0 +_DISCOVERY_INTERVAL_MS = 500 def check_mqtt(): @@ -791,7 +795,7 @@ def check_mqtt(): client_ref.connect() _mqtt_connected = True info("MQTT reconnected!") - publish_discovery(client_ref) + schedule_discovery() _subscribe_all(client_ref) publish_online(client_ref) publish_state(client_ref) @@ -1020,6 +1024,47 @@ def publish_discovery(client): _publish_backlight_status_discovery(client, _dev_ref) +def schedule_discovery(): + global _discovery_phases, _discovery_phase_idx, _last_discovery_ms + _dev_ref = _DEVICE + _discovery_phases = ( + lambda client: _clear_legacy_discovery(client), + lambda client: _publish_gauge_discovery(client, _dev_ref), + lambda client: _publish_speed_discovery(client, _dev_ref), + lambda client: _publish_acceleration_discovery(client, _dev_ref), + lambda client: _publish_indicator_led_discovery(client, _dev_ref), + lambda client: _publish_backlight_status_discovery(client, _dev_ref), + ) + _discovery_phase_idx = 0 + _last_discovery_ms = 0 + + +def _clear_legacy_discovery(client): + for i in range(num_gauges): + for old_t in [ + f"homeassistant/switch/{MQTT_CLIENT_ID}_g{i}_red/config", + f"homeassistant/switch/{MQTT_CLIENT_ID}_g{i}_green/config", + f"homeassistant/switch/{MQTT_CLIENT_ID}_g{i}_status_red/config", + f"homeassistant/switch/{MQTT_CLIENT_ID}_g{i}_status_green/config", + ]: + client.publish(old_t, b"", retain=True) + _discovery_pause(client, count=2, delay_ms=15) + + +def service_discovery(): + global _discovery_phase_idx, _last_discovery_ms + if client_ref is None or _discovery_phase_idx >= len(_discovery_phases): + return + + now = utime.ticks_ms() + if _last_discovery_ms and utime.ticks_diff(now, _last_discovery_ms) < _DISCOVERY_INTERVAL_MS: + return + + _discovery_phases[_discovery_phase_idx](client_ref) + _discovery_phase_idx += 1 + _last_discovery_ms = utime.ticks_ms() + + def publish_online(client): for i in range(num_gauges): client.publish(gauge_topics[i]["status"], b"online", retain=True) @@ -1052,11 +1097,9 @@ def main(): connect_wifi(WIFI_SSID, WIFI_PASSWORD) connect_mqtt() - - info("Publishing discovery...") - publish_discovery(client_ref) - _subscribe_all(client_ref) + schedule_discovery() + apply_motion_defaults() info("Draining initial retained messages...") for _ in range(50): @@ -1099,6 +1142,7 @@ def main(): continue client_ref.check_msg() + service_discovery() arduino_recv() _flush_backlight_state()