Skip to content

Commit 8c3c9a2

Browse files
committed
Fix LED toggle status update in web interface
- Fixed _toggle_led() to use LED{num}on (logical status) instead of statusLED{num} (visual blinking state) - Added _broadcast_web_status() to trigger immediate WebSocket status updates - led_logic() now broadcasts WebSocket status immediately after LED changes - Updated DOKUWIKI/api documentation to include TOGGLE for LED1-4, AIR1, AIR2 and AIR4
1 parent d309636 commit 8c3c9a2

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

start.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -684,11 +684,11 @@ def toggle_led4(self) -> None:
684684
self._toggle_led(4)
685685

686686
def _toggle_led(self, led_num: int) -> None:
687-
"""Generic method to toggle LED using set_led"""
688-
status_attr = f'statusLED{led_num}'
689-
current_state = getattr(self, status_attr, False)
690-
set_led_method = getattr(self, f'set_led{led_num}')
691-
set_led_method(not current_state)
687+
"""Generic method to toggle LED using led_logic"""
688+
# Use LED{num}on for logical status, not statusLED{num} which is the visual blinking state
689+
led_on_attr = f'LED{led_num}on'
690+
current_state = getattr(self, led_on_attr, False)
691+
self.led_logic(led_num, not current_state)
692692

693693
def toggle_air1(self) -> None:
694694
"""Toggle AIR1"""
@@ -795,6 +795,9 @@ def led_logic(self, led: int, state: bool) -> None:
795795

796796
# Publish MQTT status immediately after LED change
797797
self._publish_mqtt_status(f"led{led}")
798+
799+
# Broadcast WebSocket status immediately after LED change
800+
self._broadcast_web_status()
798801

799802
def set_station_color(self, newcolor: QColor) -> None:
800803
"""
@@ -1165,6 +1168,31 @@ def _publish_mqtt_status(self, specific_item: str | None = None) -> None:
11651168
)
11661169
log_exception(logger, error, use_exc_info=False)
11671170
pass
1171+
1172+
def _broadcast_web_status(self) -> None:
1173+
"""
1174+
Broadcast WebSocket status immediately after status change
1175+
1176+
Triggers immediate status update to all connected WebSocket clients
1177+
instead of waiting for the periodic broadcast.
1178+
"""
1179+
try:
1180+
wsd = getattr(self, 'wsd', None)
1181+
if wsd:
1182+
try:
1183+
wsd.broadcast_status()
1184+
except Exception as e:
1185+
logger.warning(f"Failed to broadcast WebSocket status: {e}")
1186+
except (RuntimeError, AttributeError) as e:
1187+
# Ignore errors when object is not fully initialized (e.g., in tests)
1188+
# Log but don't raise - this is expected in test scenarios
1189+
error = WidgetAccessError(
1190+
f"Error accessing WebSocket daemon (object may not be initialized): {e}",
1191+
widget_name="wsd",
1192+
attribute="broadcast_status"
1193+
)
1194+
log_exception(logger, error, use_exc_info=False)
1195+
pass
11681196

11691197
def _set_text(self, widget_name: str, text: str) -> None:
11701198
"""

0 commit comments

Comments
 (0)