mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 06:38:57 +00:00
Validate / hacs (push) Failing after 12s
Validate / hassfest (push) Failing after 13s
Validate / frontend (push) Successful in 3m2s
Validate / golden (push) Failing after 51s
Validate / backend (push) Failing after 6m50s
Validate / smoke (push) Failing after 13m44s
Validate / performance (push) Failing after 24m13s
75 lines
4.0 KiB
Markdown
75 lines
4.0 KiB
Markdown
# ТЗ #54 — Диагностический Zigbee topology overlay
|
||
|
||
- Issue: https://github.com/Matysh/houseplan-card/issues/54
|
||
- Приоритет: P2
|
||
- Статус ТЗ: research + adapter contract; provider APIs проверяются до кода
|
||
|
||
## Цель
|
||
|
||
По явному запросу показать связи ZHA/Zigbee2MQTT между уже размещёнными
|
||
устройствами поверх реальной геометрии, не превращая House Plan в редактор сети.
|
||
|
||
## Stage 0 — capability research
|
||
|
||
На поддерживаемых версиях HA зафиксировать официальные/фактические API:
|
||
|
||
- ZHA topology/neighbour source, permissions, direction и LQI semantics;
|
||
- Zigbee2MQTT networkmap request/response через HA MQTT integration либо
|
||
документированную exposed entity;
|
||
- соответствие IEEE ↔ HA device registry `connections`;
|
||
- timeout/rate limits и поведение sleeping end devices.
|
||
|
||
Неподтверждённые command/topic не hardcode-ятся. Каждый provider имеет fixture
|
||
с обезличенными ids и дату/версию проверенного контракта.
|
||
|
||
## Normalized model
|
||
|
||
```ts
|
||
type ZigbeeTopology = {
|
||
provider: 'zha' | 'z2m'; capturedAt: number;
|
||
nodes: Array<{ key: string; deviceId?: string; role: 'coordinator'|'router'|'end' }>;
|
||
links: Array<{ from: string; to: string; lqi?: number; direction: 'one'|'both'|'unknown' }>;
|
||
warnings: string[];
|
||
};
|
||
```
|
||
|
||
Provider adapters живут backend-side либо в изолированном HA adapter; render
|
||
не знает API. Browser не подключается к MQTT напрямую и не хранит topology в
|
||
House Plan config.
|
||
|
||
## Fetch/cache/security
|
||
|
||
- Overlay off по умолчанию; первый toggle запускает fetch с progress/cancel.
|
||
- Shared per-provider cache TTL 60 s (уточняется Stage 0), in-flight dedupe и
|
||
hard timeout. Toggle off отменяет UI ожидание, но безопасный backend request
|
||
может завершить cache.
|
||
- Refresh только явный или после TTL; HA state ticks не сканируют topology.
|
||
- Read permission проверяется backend. Ошибка/unsupported не ломает plan и
|
||
показывает localized status.
|
||
|
||
## Mapping и визуал
|
||
|
||
Node сопоставляется marker только через device registry/explicit entity owner.
|
||
На plan рисуются links, у которых оба конца имеют видимые live markers текущего
|
||
space. Остальные nodes доступны в summary «Не размещено N», но не рисуются.
|
||
|
||
Edges — pointer-transparent отдельный layer. Цвет/opacity/thickness отражают
|
||
нормализованный LQI только при сопоставимой шкале provider; unknown — нейтральный
|
||
пунктир. Direction optional arrow только при достоверных данных. Coordinator
|
||
и router имеют legend. Geometry стен не интерпретируется как причина сигнала.
|
||
|
||
## Multiple spaces и lifecycle
|
||
|
||
Cross-space link не рисуется как линия через разные планы; endpoints получают
|
||
badge/count и список другого пространства. Hidden/removed/disabled marker не
|
||
рисуется. Rebind refreshes mapping без нового network scan.
|
||
|
||
## Performance и проверки
|
||
|
||
- 20/100/500 nodes, dense mesh; edge cap/viewport culling после Stage 0;
|
||
- provider fixtures, timeout, malformed/cyclic/duplicate links;
|
||
- mapping IEEE/device/entity, cross-space, hidden lifecycle;
|
||
- lazy request/in-flight cache and no fetch on ordinary HA ticks;
|
||
- golden LQI/unknown legend и performance budget;
|
||
- network layer полностью исчезает при toggle off и не меняет config.
|