Refine built-in web app experience
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user