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:
@@ -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 ────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user