This commit is contained in:
2026-11-02 01:23:50 +03:00
parent f74d52d39d
commit 9d74d06ce3
29 changed files with 2347 additions and 381 deletions
@@ -9,7 +9,7 @@ from dataclasses import asdict, dataclass, field
from pathlib import Path
from typing import Dict, List, Optional
from config import N, POLL_PERIOD_S, STALE_PERIODS
from config import DEFAULT_REPORT_INTERVAL_MIN, N, STALE_PERIODS
from protocol import BATT_UNKNOWN, DIST_NO_TARGET
log = logging.getLogger("collector.registry")
@@ -128,9 +128,15 @@ class Registry:
self.by_addr.pop(addr, None)
sensor.state = "lost"
def reevaluate(self, now: Optional[float] = None, period_s: float = POLL_PERIOD_S) -> bool:
def reevaluate(
self,
now: Optional[float] = None,
period_s: Optional[float] = None,
) -> bool:
"""Update stale/lost. Returns True if any slot freed or state changed."""
now = time.time() if now is None else now
if period_s is None:
period_s = float(DEFAULT_REPORT_INTERVAL_MIN * 60)
stale_after = period_s * STALE_PERIODS
lost_after = period_s * STALE_PERIODS * 2
changed = False
@@ -186,7 +192,14 @@ class Registry:
reports.append(pack_report(s.battery, s.flags, s.dist))
return bitmap, reports
def status_dict(self) -> dict:
def status_dict(
self,
names: Optional[Dict[str, str]] = None,
report_interval_min: int = DEFAULT_REPORT_INTERVAL_MIN,
) -> dict:
names = names or {}
now = time.time()
period_s = max(1, int(report_interval_min) * 60)
slots_out = []
for i in range(self.n):
s = self.slots[i]
@@ -197,13 +210,16 @@ class Registry:
d["slot"] = i
d["empty"] = False
d["reading"] = None if s.dist == DIST_NO_TARGET else s.dist
d["name"] = names.get(s.addr, "")
d["age_s"] = max(0, int(now - s.last_seen)) if s.last_seen else None
slots_out.append(d)
return {
"n": self.n,
"pool_full": self.pool_full(),
"period_s": POLL_PERIOD_S,
"period_s": period_s,
"report_interval_min": int(report_interval_min),
"slots": slots_out,
"ts": time.time(),
"ts": now,
}
def save(self) -> None: