feat(settings): server global brightness and Wi-Fi driver resync
- Serve GET /settings as JSON by removing duplicate HTML route (use /settings/page for the standalone UI). - Save global_brightness via PUT; broadcast to connected drivers; push saved level when outbound WS connects. - Zones UI loads brightness from GET /settings only (no localStorage). - Bump led-driver submodule for settings.save on brightness with save flag. - Extend API doc and endpoint tests for global_brightness. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -84,6 +84,36 @@ def prune_stale_tcp_writers() -> None:
|
||||
_schedule_status_broadcast(ip, False)
|
||||
|
||||
|
||||
def _global_brightness_message_text() -> str | None:
|
||||
"""v1 JSON line for saved zone UI brightness; works with shipping driver firmware (applies ``b`` in RAM)."""
|
||||
global _settings
|
||||
if _settings is None:
|
||||
return None
|
||||
try:
|
||||
b = int(_settings.get("global_brightness", 255))
|
||||
except (TypeError, ValueError):
|
||||
b = 255
|
||||
b = max(0, min(255, b))
|
||||
return json.dumps({"v": "1", "b": b})
|
||||
|
||||
|
||||
async def sync_global_brightness_to_driver(ip: str) -> bool:
|
||||
"""Push Pi-stored global brightness to one Wi-Fi driver over the outbound WebSocket."""
|
||||
text = _global_brightness_message_text()
|
||||
if not text:
|
||||
return False
|
||||
return await send_json_line_to_ip(ip, text)
|
||||
|
||||
|
||||
async def broadcast_global_brightness_to_tcp_drivers() -> None:
|
||||
"""Push saved global brightness to every connected Wi-Fi driver."""
|
||||
text = _global_brightness_message_text()
|
||||
if not text:
|
||||
return
|
||||
for ip in list_connected_ips():
|
||||
await send_json_line_to_ip(ip, text)
|
||||
|
||||
|
||||
def _register_ws(ip: str, ws) -> None:
|
||||
key = normalize_tcp_peer_ip(ip)
|
||||
if not key:
|
||||
@@ -94,6 +124,15 @@ def _register_ws(ip: str, ws) -> None:
|
||||
_send_locks[key] = asyncio.Lock()
|
||||
_schedule_status_broadcast(key, True)
|
||||
print(f"[WS] driver connected {key!r}")
|
||||
try:
|
||||
loop = asyncio.get_running_loop()
|
||||
except RuntimeError:
|
||||
return
|
||||
|
||||
async def _apply_saved_brightness():
|
||||
await sync_global_brightness_to_driver(key)
|
||||
|
||||
loop.create_task(_apply_saved_brightness())
|
||||
|
||||
|
||||
def unregister_tcp_writer(peer_ip: str, ws=None) -> str:
|
||||
|
||||
Reference in New Issue
Block a user