feat: add all-off led action
This commit is contained in:
+32
-2
@@ -69,6 +69,7 @@ async function identify(name){ try{ await api('/api/identify',{name}); toast('Bl
|
||||
async function saveLed(name){ try{ await api('/api/save',{name}); toast('已保存 '+name+',重启后自动恢复'); setTimeout(load,300);}catch(e){toast(e.message,true);} }
|
||||
async function deleteSaved(name){ try{ await api('/api/delete-saved',{name}); toast('已取消持久化 '+name); setTimeout(load,300);}catch(e){toast(e.message,true);} }
|
||||
async function applySaved(){ try{ const r=await api('/api/apply-saved',{}); toast('已应用持久化配置:'+(r.applied||0)+' 个'); setTimeout(load,300);}catch(e){toast(e.message,true);} }
|
||||
async function turnOffAll(){ try{ const r=await api('/api/all-off',{}); const failed=(r.results||[]).filter(x=>!x.ok); toast(failed.length ? ('已关闭 '+(r.changed||0)+' 个,失败 '+failed.length+' 个') : ('已关闭全部 LED:'+(r.changed||0)+' 个'), failed.length>0); setTimeout(load,300);}catch(e){toast(e.message,true);} }
|
||||
function colorOf(n,b){ const s=n.toLowerCase(); if(Number(b)<=0) return '#475569'; if(s.includes('red')) return '#ef4444'; if(s.includes('green')) return '#22c55e'; if(s.includes('blue')) return '#3b82f6'; if(s.includes('wlan')) return '#22c55e'; if(s.includes('wan')) return '#3b82f6'; if(s.includes('power')) return '#ef4444'; if(s.includes('sim')) return '#f59e0b'; return '#5eead4'; }
|
||||
function esc(s){ return String(s).replace(/[&<>'"]/g, c=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[c])); }
|
||||
function attr(s){ return esc(s); }
|
||||
@@ -253,6 +254,32 @@ def apply_saved_config() -> List[Dict[str, object]]:
|
||||
results.append({"name": name, "ok": False, "errors": [str(e)]})
|
||||
return results
|
||||
|
||||
|
||||
def turn_off_all_leds() -> List[Dict[str, object]]:
|
||||
results = []
|
||||
for led in list_leds():
|
||||
name = str(led["name"])
|
||||
result: Dict[str, object] = {"name": name, "ok": True, "errors": []}
|
||||
try:
|
||||
p = led_path(name)
|
||||
if (p / "trigger").exists():
|
||||
try:
|
||||
set_trigger(p, "none")
|
||||
except Exception as e:
|
||||
result["ok"] = False
|
||||
result["errors"].append(f"trigger: {e}")
|
||||
write_text(p / "brightness", "0")
|
||||
try:
|
||||
result["brightness"] = int(read_text(p / "brightness") or 0)
|
||||
except ValueError:
|
||||
result["brightness"] = read_text(p / "brightness")
|
||||
except Exception as e:
|
||||
result["ok"] = False
|
||||
result["errors"].append(str(e))
|
||||
results.append(result)
|
||||
return results
|
||||
|
||||
|
||||
def list_leds() -> List[Dict[str, object]]:
|
||||
leds = []
|
||||
saved_config = load_config()
|
||||
@@ -317,7 +344,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
parsed = urllib.parse.urlparse(self.path)
|
||||
if parsed.path == "/":
|
||||
body = f"""<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>LED Manager</title><style>{CSS}</style></head><body><div class='container'><div class='header'><div><h1>LED Manager Panel</h1><div class='sub'>管理 <code>{html.escape(str(LED_ROOT))}</code> 下的 LED;配置保存到 <code>{html.escape(str(CONFIG_PATH))}</code>;当前 <span id='count'>-</span> 个。页面每 5 秒自动刷新。</div></div><div class='row' style='margin-top:0'><button onclick='applySaved()'>应用已保存配置</button><button onclick='load()'>刷新</button></div></div><div id='root' class='grid'></div></div><div id='toast' class='toast'></div><script>{JS}</script></body></html>"""
|
||||
body = f"""<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>LED Manager</title><style>{CSS}</style></head><body><div class='container'><div class='header'><div><h1>LED Manager Panel</h1><div class='sub'>管理 <code>{html.escape(str(LED_ROOT))}</code> 下的 LED;配置保存到 <code>{html.escape(str(CONFIG_PATH))}</code>;当前 <span id='count'>-</span> 个。页面每 5 秒自动刷新。</div></div><div class='row' style='margin-top:0'><button class='off' onclick='turnOffAll()'>关闭全部灯</button><button onclick='applySaved()'>应用已保存配置</button><button onclick='load()'>刷新</button></div></div><div id='root' class='grid'></div></div><div id='toast' class='toast'></div><script>{JS}</script></body></html>"""
|
||||
data = body.encode("utf-8")
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "text/html; charset=utf-8")
|
||||
@@ -335,7 +362,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
data = self.read_body()
|
||||
name = None
|
||||
p = None
|
||||
if parsed.path not in ("/api/apply-saved",):
|
||||
if parsed.path not in ("/api/apply-saved", "/api/all-off"):
|
||||
name = safe_name(str(data.get("name", "")))
|
||||
p = led_path(name)
|
||||
if parsed.path == "/api/brightness":
|
||||
@@ -380,6 +407,9 @@ class Handler(BaseHTTPRequestHandler):
|
||||
elif parsed.path == "/api/apply-saved":
|
||||
results = apply_saved_config()
|
||||
self.send_json({"ok": True, "applied": sum(1 for r in results if r.get("ok")), "results": results})
|
||||
elif parsed.path == "/api/all-off":
|
||||
results = turn_off_all_leds()
|
||||
self.send_json({"ok": all(r.get("ok") for r in results), "changed": sum(1 for r in results if r.get("brightness") == 0), "results": results})
|
||||
elif parsed.path == "/api/identify":
|
||||
old_trigger = read_text(p / "trigger")
|
||||
old_brightness = read_text(p / "brightness")
|
||||
|
||||
Reference in New Issue
Block a user