Loading API metrics...
+
If empty, ensure the server is running and /api/metrics is reachable.
@@ -1838,6 +1839,10 @@
}
if (toggleLedDots) {
toggleLedDots.addEventListener('change', renderLedDots);
+ // Ensure dot mode is rendered on load if enabled by default
+ if (toggleLedDots.checked) {
+ setTimeout(renderLedDots, 200);
+ }
}
// Update stats every 30 seconds
diff --git a/web_interface_v2.py b/web_interface_v2.py
index 00d3b9db..72b2bfe6 100644
--- a/web_interface_v2.py
+++ b/web_interface_v2.py
@@ -62,8 +62,17 @@ class DisplayMonitor:
try:
# Prefer service-provided snapshot if available (works when ledmatrix service is running)
if os.path.exists(snapshot_path):
- with open(snapshot_path, 'rb') as f:
- img_bytes = f.read()
+ # Read atomically by reopening; ignore partials by retrying once
+ img_bytes = None
+ for _ in range(2):
+ try:
+ with open(snapshot_path, 'rb') as f:
+ img_bytes = f.read()
+ break
+ except Exception:
+ socketio.sleep(0.02)
+ if not img_bytes:
+ raise RuntimeError('Snapshot read failed')
img_str = base64.b64encode(img_bytes).decode()
# If we can infer dimensions from display_manager, include them; else leave 0
width = display_manager.width if display_manager else 0