Refine built-in web app experience

This commit is contained in:
Artem Kokos
2026-05-21 21:47:33 +07:00
parent 61b21c63ea
commit f55e00bce1
11 changed files with 1320 additions and 456 deletions

View File

@@ -1,4 +1,5 @@
from dataclasses import asdict, dataclass
from datetime import datetime
import logging
from typing import Dict, List
@@ -21,6 +22,18 @@ class DiscoveryApplyResult:
return asdict(self)
@dataclass(frozen=True)
class DiscoverySnapshot:
last_scan_at: str
last_scan_mode: str
summary: DiscoveryApplyResult
def to_dict(self) -> dict:
payload = asdict(self)
payload["summary"] = self.summary.to_dict()
return payload
class StateManager:
def __init__(self):
# Храним устройства как Pydantic объекты
@@ -29,6 +42,7 @@ class StateManager:
self.groups: Dict[str, GroupModel] = {}
# Сколько подряд циклов discovery устройство не видно
self._missing_scan_counts: Dict[str, int] = {}
self.discovery_snapshot: DiscoverySnapshot | None = None
def update_device(self, device_data: dict):
"""Обновляет или добавляет устройство в состояние."""
@@ -92,6 +106,18 @@ class StateManager:
online=len(self.devices),
)
def record_discovery(self, mode: str, result: DiscoveryApplyResult):
self.discovery_snapshot = DiscoverySnapshot(
last_scan_at=datetime.now().isoformat(),
last_scan_mode=mode,
summary=result,
)
def get_discovery_snapshot(self) -> dict | None:
if not self.discovery_snapshot:
return None
return self.discovery_snapshot.to_dict()
def get_group_ips(self, group_id: str) -> List[str]:
"""Возвращает список IP всех ламп, входящих в группу."""
group = self.groups.get(group_id)