fix: support registryless opening entities

Issue: #117
User-Visible: yes
This commit is contained in:
Sergey Matyunin
2026-08-19 02:12:37 +03:00
parent 9baf533c90
commit 01fe48de00
14 changed files with 283 additions and 32 deletions
+5 -2
View File
@@ -519,8 +519,11 @@ double click → properties dialog. In markup mode the "Opening" tool handles cl
Contact and lock are exact HA references owned by the opening, not aliases of
standalone markers. Their candidate/action path follows HA binding status while
their render path follows the frozen active-registry projection; neither path
consults marker tombstones. Plan-level consumers keep the tombstone policy
described above.
consults marker tombstones. For that projection, the presence of an exact state
is sufficient: registry-less YAML entities have no row, while explicit
disabled/orphan rows have already been stripped together with their states.
The render helper must never receive raw live hass. Plan-level consumers keep
the tombstone policy described above.
For a wall with thickness, one `OpeningWallIndex` resolves the atomic wall
interval and adjacent room on each side of the centreline. Opening symbols,
+6
View File
@@ -69,6 +69,12 @@
([#166](https://github.com/Matysh/houseplan-card/issues/166)).
- Small fixes and improvements.
- Door, window and gate contacts and locks now keep working when they are live
YAML entities without a `unique_id` and therefore have no Entity Registry
row. The picker, View animation, lock badge and opening info card now follow
the same exact reference, while disabled, orphaned and missing entities
remain unavailable ([#117](https://github.com/Matysh/houseplan-card/issues/117)).
## v1.64.0-beta.3 — 2026-08-14
- Large plans no longer recompute an unused physical-wall union on every floor
+7
View File
@@ -80,6 +80,13 @@
([#166](https://github.com/Matysh/houseplan-card/issues/166)).
- Мелкие исправления и улучшения.
- Датчики и замки дверей, окон и ворот теперь работают и для живых
YAML-сущностей без `unique_id`, у которых поэтому нет строки в Entity
Registry. Список выбора, анимация в Просмотре, значок замка и карточка проёма
используют одну точную ссылку; отключённые, потерянные и отсутствующие
сущности по-прежнему недоступны
([#117](https://github.com/Matysh/houseplan-card/issues/117)).
## v1.64.0-beta.3 — 2026-08-14
- Большие планы больше не пересчитывают неиспользуемое объединение физических
+7
View File
@@ -1095,6 +1095,13 @@ separately promised workflows:
locked / Lock when unlocked; button calls the lock service; disabled while
locking/unlocking; hidden when unavailable; plan-icon tap still never
toggles a lock [auto: smoke_gear_tabs / smoke_gs_always]
- [ ] Registry-less opening binding (#117): a live YAML contact/lock without
`unique_id` is offered by the picker and drives the frozen View frame,
badge and info card; marker tombstones do not block it, an HA tick swaps
the frame without rebuilding geometry/config, and explicit disabled rows
with stale states remain hidden. Only the confirmed info-card lock action
may call a service [auto: ha-binding-status, render-device-snapshot,
smoke_registryless_opening, mutation-gate]
- [ ] New-device flag (v1.29.0): a device added to HA after install gets a big red
dot top-right of its icon (all clients); opening its editor clears it
everywhere; upgrade/first-run seeds the baseline silently — no dot flood [auto: smoke_new_device]
+4 -1
View File
@@ -472,7 +472,10 @@ Glow и солнечные лучи, но при Resize комнаты оста
датчика анимирует створку/полотно. Инверсия нужна, если интеграция отдаёт
противоположную логику. Контактный датчик и замок — самостоятельные точные
привязки проёма: удаление отдельного маркера той же сущности с плана не убирает
её из этих списков и не выключает уже сохранённую связь.
её из этих списков и не выключает уже сохранённую связь. Можно выбрать живую
YAML-сущность без `unique_id` и строки в Entity Registry: пока Home Assistant
передаёт её точное состояние, она так же управляет проёмом и значком замка в
Просмотре. Явно отключённая, потерянная или отсутствующая сущность не работает.
### Поведение в разных режимах
+11 -11
View File
@@ -1,7 +1,7 @@
{
"version": 1,
"fixture": "synthetic-only",
"sourceFingerprint": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceFingerprint": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"captureScriptSha256": "34f2219790d46efd8250e7a1bd829cb8fc0b0547e1260635fefa52407551b41b",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -13,7 +13,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "d36b6f9f8139f31ef73a780c6511a640a26055efd9d7a24c24fd48b1d8379bf0"
},
"view-touch": {
@@ -24,7 +24,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "358e25ff9984d0fb0c03cfbb848df40c425fdfe64cd5f4f613b1e754ca9d4249"
},
"space-create": {
@@ -35,7 +35,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "c53db2e5c642a5549c13f3c93a5b359fed69bdb2621bf71a243a877ffcb95e6b"
},
"room-contour-close": {
@@ -46,7 +46,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "5ca7f24642926072ccbc5bf48341c5310329918631b147c116f9c29e20e4927e"
},
"plan-context-tray": {
@@ -57,7 +57,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "164b79fd9075a1425cffe3c85c88b689dfda90b79856bb4ed6655507b166b3e0"
},
"device-editor": {
@@ -68,7 +68,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "7a22a81e2abedf5a520bd36b7509d953cbfa9962b48c0ffbc233666a6215c04b"
},
"device-display-preview": {
@@ -79,7 +79,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "f6014caed7b7d28790b8548996ba09d806a4e4d51fbb7e8d3fb3c582ebe49167"
},
"background-editor": {
@@ -90,7 +90,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "d7cfe70551d9260169df8efd832e32ed7df99c7f60b55d1fd4a8322bd4c47175"
},
"room-card": {
@@ -101,7 +101,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "176abba71d41cfb045a33f82a794d9fbb2a5d3c48e6df66e6ec3a8e448311b11"
},
"device-info": {
@@ -112,7 +112,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "3523bebdb36912c484e50c1a31b37bcc12aec09a6eff8d9dd3558a6f037de4a0",
"sourceSha256": "2b4a6de3340e1c264c45724b79f9e618cda943509b8d4cb746f8ecace57d2bc5",
"imageSha256": "2199ed88b215bf2bff63bf665028f78b2aa6a92c3032b803931790f2ef071893"
}
}