feat: background device status check every 240s instead of on page load

- Add online, leds, version, last_check columns to wled_devices table
- Background job checks all WLED devices every 4 minutes
- Initial check on startup
- Devices page reads status from DB (instant page load)
- 'Alle jetzt pruefen' button triggers manual check

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 23:03:12 +02:00
co-authored by Claude Opus 4.6
parent a7efb12d5c
commit e88ab3ab08
4 changed files with 88 additions and 63 deletions
+14 -10
View File
@@ -38,9 +38,13 @@ async def lifespan(application: FastAPI):
# Start background polling
interval = int(database.get_setting("poll_interval", "15"))
bg_scheduler.add_job(scheduler.poll_status, "interval", seconds=interval, id="poll")
bg_scheduler.add_job(scheduler.check_devices, "interval", seconds=240, id="device_check")
bg_scheduler.start()
logger.info("Polling gestartet (Intervall: %ds)", interval)
# Initial device check
scheduler.check_devices()
yield
bg_scheduler.shutdown()
@@ -195,8 +199,13 @@ async def devices_page(request: Request):
devices = conn.execute(
"SELECT * FROM wled_devices ORDER BY name, hostname"
).fetchall()
last_check_row = conn.execute(
"SELECT MAX(last_check) as lc FROM wled_devices WHERE last_check IS NOT NULL"
).fetchone()
conn.close()
return templates.TemplateResponse(*_ctx(request, "devices", devices=devices))
last_check = last_check_row["lc"] if last_check_row and last_check_row["lc"] else None
return templates.TemplateResponse(*_ctx(request, "devices",
devices=devices, last_check=last_check))
@app.post("/api/devices")
@@ -241,15 +250,10 @@ async def delete_device(device_id: int):
return RedirectResponse("/devices", status_code=303)
@app.get("/api/devices/{device_id}/status")
async def device_status(device_id: int):
from wled_client import get_wled_info
conn = database.get_db()
dev = conn.execute("SELECT hostname FROM wled_devices WHERE id=?", (device_id,)).fetchone()
conn.close()
if not dev:
return {"online": False}
return get_wled_info(dev["hostname"])
@app.post("/api/devices/check-all")
async def check_all_devices():
scheduler.check_devices()
return RedirectResponse("/devices", status_code=303)
# ── Assignments ────────────────────────────────────────────────────────────