mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28:31 +00:00
v1.51.0: explicit hide flags, the yellow principle, phone editor gestures, room button
The dev batch since v1.50.4, released as one: - hiding is a per-device checkbox seeded once from the old filter (docs/FILTERING.md); blue ghosts under a local 'Show hidden' toggle - yellow = doing its main job now; TRVs glow by hvac_action, service switches can no longer become a device's primary - pinch/pan gestures in every editor on touch - the room settings button: visual centre (inscribed circle + centroid pull), icon-derived size, zooms with the plan; metrics visible in the plan editor Inventory: 147 frontend / 51 pure / 43 harness / 68 smokes.
This commit is contained in:
@@ -45,7 +45,7 @@ PLAN_ORPHAN_TTL_S = 3600
|
||||
SCHEDULED_GRACE_S = 30 * 24 * 3600
|
||||
FILES_DIR = "houseplan/files"
|
||||
CONF_ADMIN_ONLY = "admin_only"
|
||||
VERSION = "1.50.4"
|
||||
VERSION = "1.51.0"
|
||||
|
||||
DEFAULT_CONFIG: dict = {
|
||||
"spaces": [],
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -16,5 +16,5 @@
|
||||
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
||||
"requirements": [],
|
||||
"single_config_entry": true,
|
||||
"version": "1.50.4"
|
||||
"version": "1.51.0"
|
||||
}
|
||||
|
||||
@@ -2668,4 +2668,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
||||
</button>`}
|
||||
</div>
|
||||
</div>
|
||||
</div>`}}fs.properties={_hdrH:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorTextDialog:{state:!0},_kioskDialog:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},fs.ZOOM_MAX=8,fs.ZOOM_MIN=.4,fs._touchSeen=!1,fs._noHoverMq="undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(hover: none)").matches,fs.styles=Wi,customElements.get("houseplan-card")||customElements.define("houseplan-card",fs),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.50.4 ","background:#3ea6ff;color:#04121f;font-weight:700","");
|
||||
</div>`}}fs.properties={_hdrH:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorTextDialog:{state:!0},_kioskDialog:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},fs.ZOOM_MAX=8,fs.ZOOM_MIN=.4,fs._touchSeen=!1,fs._noHoverMq="undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(hover: none)").matches,fs.styles=Wi,customElements.get("houseplan-card")||customElements.define("houseplan-card",fs),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.51.0 ","background:#3ea6ff;color:#04121f;font-weight:700","");
|
||||
|
||||
Vendored
+1
-1
@@ -2668,4 +2668,4 @@ const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow
|
||||
</button>`}
|
||||
</div>
|
||||
</div>
|
||||
</div>`}}fs.properties={_hdrH:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorTextDialog:{state:!0},_kioskDialog:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},fs.ZOOM_MAX=8,fs.ZOOM_MIN=.4,fs._touchSeen=!1,fs._noHoverMq="undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(hover: none)").matches,fs.styles=Wi,customElements.get("houseplan-card")||customElements.define("houseplan-card",fs),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.50.4 ","background:#3ea6ff;color:#04121f;font-weight:700","");
|
||||
</div>`}}fs.properties={_hdrH:{state:!0},hass:{attribute:!1},_config:{state:!0},_space:{state:!0},_layout:{state:!0},_devices:{state:!0},_tip:{state:!0},_selId:{state:!0},_toast:{state:!0},_serverCfg:{state:!0},_mode:{state:!0},_tool:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorTextDialog:{state:!0},_kioskDialog:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0},_zoom:{state:!0},_view:{state:!0}},fs.ZOOM_MAX=8,fs.ZOOM_MIN=.4,fs._touchSeen=!1,fs._noHoverMq="undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(hover: none)").matches,fs.styles=Wi,customElements.get("houseplan-card")||customElements.define("houseplan-card",fs),window.customCards=window.customCards||[],window.customCards.find(t=>"houseplan-card"===t.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info("%c HOUSEPLAN-CARD %c v1.51.0 ","background:#3ea6ff;color:#04121f;font-weight:700","");
|
||||
|
||||
@@ -1,5 +1,61 @@
|
||||
# Changelog
|
||||
|
||||
## v1.51.0 — 2026-07-29
|
||||
|
||||
**Hiding is an explicit flag now** (docs/FILTERING.md)
|
||||
|
||||
- **Every device dialog — virtual ones included — has a "Hide device from
|
||||
plan" checkbox.** The old on-the-fly filter survives only as the SEEDER of
|
||||
those flags: on first load by an editing client the config is materialised
|
||||
once — non-physical devices (bridges, scenes, service integrations, lamps
|
||||
folded into a light group) get the flag, and from then on the flag belongs
|
||||
to you. Unticking it is final: the seeder never revisits a device you have
|
||||
decided about. New non-physical devices hide silently; physical ones keep
|
||||
the red-dot flow.
|
||||
- **"Show all" became "Show hidden"** — a local tool of the device editor
|
||||
(nothing flips on the wall tablets), showing hidden devices as translucent
|
||||
BLUE dashed ghosts: clearly apart from a grey unavailable icon, and with no
|
||||
live-state paint at all — a ghost is configuration, not status. Click one
|
||||
to untick the box. "Remove from plan" is gone for bound devices (the
|
||||
checkbox is the way); a virtual device's Delete still deletes.
|
||||
- Hidden devices still count toward the room's Zigbee signal, but cast no
|
||||
glow and no light fill — an invisible device casts no visible light. Room
|
||||
climate is unchanged. Old configs behave exactly as before until an
|
||||
editing client materialises them.
|
||||
|
||||
**Yellow means working right now**
|
||||
|
||||
- One principle for the glowing icon: a light is shining, a socket is
|
||||
powering, a fan is spinning, media is playing, a vacuum is cleaning — or a
|
||||
radiator valve is ACTUALLY heating (hvac_action), not merely enabled for
|
||||
the winter. Previously a TRV could glow yellow because its anti-scaling
|
||||
service switch was on while the actually-heating one stayed dark: the
|
||||
primary-entity search let a vendor's config switch outrank the visible
|
||||
climate entity. Fixed — a service entity never beats the device's visible
|
||||
main function (this also fixes tap-toggle and icon morphing on such
|
||||
devices).
|
||||
- The glow pool and the icon color now ask the same question: a lit light
|
||||
yellows its icon in every fill mode, by exactly the condition that lights
|
||||
its glow spot. The README (en+ru) documents the color language.
|
||||
|
||||
**The editors, on a phone**
|
||||
|
||||
- Pinch zoom and pan gestures now work in every editor: drawing is
|
||||
click-based, so the two coexist — a moving finger pans, two fingers pinch,
|
||||
releasing after a gesture never draws a point, a clean tap still does.
|
||||
|
||||
**The room settings button**
|
||||
|
||||
- Detached from the (movable) room name: it sits at the VISUAL centre of the
|
||||
room — the centre of the largest inscribed circle with a pull toward the
|
||||
area centroid, so an elongated room centres it on both axes and an L-shaped
|
||||
one keeps it in the middle of its widest part, never down a thin limb.
|
||||
- Half its former size, sized from the device icon (70% of the icon box) and
|
||||
zooming WITH the plan instead of keeping a constant screen size.
|
||||
- The small metric rows under the room name (temperature, humidity, signal,
|
||||
lights) now show in the plan editor too, and the name renders in exactly
|
||||
the same spot in view mode and in the editor.
|
||||
|
||||
## v1.50.4 — 2026-07-29
|
||||
|
||||
**From the v1.50.3 review**
|
||||
|
||||
@@ -6,6 +6,63 @@
|
||||
> **Правило проекта:** оба файла пополняются в одном коммите с самим
|
||||
> изменением — как и остальная документация (см. docs/STATUS.md).
|
||||
|
||||
## v1.51.0 — 2026-07-29
|
||||
|
||||
**Скрытие — теперь явная галка** (docs/FILTERING.md)
|
||||
|
||||
- **В диалоге каждого устройства — включая виртуальные — есть галка «Скрыть
|
||||
устройство с плана».** Старый фильтр «на лету» остался только сеятелем
|
||||
этих галок: при первом открытии редактором конфиг один раз
|
||||
материализуется — нефизические устройства (мосты, сцены, служебные
|
||||
интеграции, лампы, свёрнутые в световую группу) получают галку, и дальше
|
||||
она принадлежит вам. Снятая галка — навсегда: сеятель не возвращается к
|
||||
устройству, о котором вы уже решили. Новые нефизические прячутся молча;
|
||||
физические — с красной точкой, как раньше.
|
||||
- **«Показать все» стала «Показать скрытые»** — локальный инструмент
|
||||
редактора устройств (на настенных планшетах ничего не мигает): скрытые
|
||||
рисуются полупрозрачными СИНИМИ пунктирными призраками — не спутать с
|
||||
серым недоступным — и совсем без живой индикации: призрак — это
|
||||
конфигурация, а не статус. Клик — и галку можно снять. «Удалить с плана»
|
||||
у привязанных устройств убрана (галка — единственный путь); «Удалить» у
|
||||
виртуального по-прежнему удаляет.
|
||||
- Скрытые устройства учитываются в Zigbee-сигнале комнаты, но не дают ни
|
||||
пятна света, ни заливки — не видно устройства, не видно и света. Климат
|
||||
комнат без изменений. Старые конфиги ведут себя по-старому, пока их не
|
||||
материализует клиент с правом записи.
|
||||
|
||||
**Жёлтый значит «работает прямо сейчас»**
|
||||
|
||||
- Один принцип для светящегося значка: лампа светит, розетка подаёт,
|
||||
вентилятор крутится, медиа играет, пылесос убирает — или термоголовка
|
||||
РЕАЛЬНО греет (hvac_action), а не просто включена на зиму. Раньше
|
||||
термоголовка могла светиться жёлтым из-за включённой защиты от накипи, а
|
||||
реально греющая оставалась тёмной: выбор главной сущности пропускал
|
||||
служебный свитч производителя вперёд видимого climate. Исправлено —
|
||||
служебная сущность больше никогда не побеждает видимую основную функцию
|
||||
(это чинит и tap-переключение, и морфинг иконок у таких устройств).
|
||||
- Пятно света и цвет значка задают один и тот же вопрос: горящая лампа
|
||||
желтит значок в любом режиме заливки ровно тем условием, что зажигает её
|
||||
пятно. README (en+ru) описывает язык цветов.
|
||||
|
||||
**Редакторы на телефоне**
|
||||
|
||||
- Пинч-зум и панорамирование жестами работают во всех редакторах: рисование
|
||||
кликовое, так что они совместимы — палец с движением панорамирует, два
|
||||
пальца зумируют, отпускание после жеста не ставит точку, чистый тап —
|
||||
ставит.
|
||||
|
||||
**Кнопка настроек комнаты**
|
||||
|
||||
- Отвязана от (передвигаемого) названия: стоит в ВИЗУАЛЬНОМ центре комнаты —
|
||||
центр наибольшей вписанной окружности с тяготением к центроиду площади,
|
||||
поэтому вытянутая комната центрирует её по обеим осям, а Г-образная
|
||||
держит в середине широкой части и не утаскивает в узкую.
|
||||
- Вдвое меньше прежней, размер от иконки устройства (70% бокса) и зумится
|
||||
ВМЕСТЕ с планом, а не держит постоянный экранный размер.
|
||||
- Мелкие подписи под названием комнаты (температура, влажность, сигнал,
|
||||
свет) теперь видны и в редакторе плана, а название рендерится ровно в том
|
||||
же месте в просмотре и в редакторе.
|
||||
|
||||
## v1.50.4 — 2026-07-29
|
||||
|
||||
**По ревью v1.50.3**
|
||||
|
||||
+2
-2
@@ -15,12 +15,12 @@
|
||||
|
||||
| Item | State |
|
||||
|---|---|
|
||||
| Version | **v1.50.4** everywhere (manifest, const.py, package.json, CARD_VERSION); deployed to the home instance |
|
||||
| Version | **v1.51.0** everywhere (manifest, const.py, package.json, CARD_VERSION); deployed to the home instance |
|
||||
| Workflow | Since 2026-07-22: minor changes go to branch **`dev`** (build + smokes → deploy home → commit → push, NO release); releases are batched on the owner's command (merge dev→main, one tag, one release with a summary changelog, CI checked on dev beforehand) |
|
||||
| GitHub | https://github.com/Matysh/houseplan-card — **`main` carries every published release, the latest tag is the current version above**; `dev` is where work lands and is merged into `main` at release time (so `dev` is normally equal to or ahead of `main`, never behind). Push via SSH key `ha_jb` (remote git@github.com:…); API releases via the fine-grained PAT in `~/.git-credentials` (Contents R/W, issued 2026-07-23) |
|
||||
| CI | validate.yml (hacs + hassfest + frontend + backend) green; release.yml attaches the bundle on release publish |
|
||||
| HACS | Custom repository works. **Inclusion PR: hacs/default#9004** — open, valid, labeled; ~864 older open PRs but merge rate ≈180/mo; realistic ETA 1–3 months (checked 2026-07-24) |
|
||||
| Home instance | ha.jbstudio.pro (SSH port 323, key `ha_jb`), deployed **v1.50.4** via direct copy (HACS custom repo also installed) |
|
||||
| Home instance | ha.jbstudio.pro (SSH port 323, key `ha_jb`), deployed **v1.51.0** via direct copy (HACS custom repo also installed) |
|
||||
| Localization | UI en/ru (src/i18n/*.json), everything user-visible localized incl. kiosk popover |
|
||||
| Tests | Four layers: frontend unit (`npm test`, node:test over `test-build/`), pure backend (`pytest tests_backend`, runs anywhere), HA-harness backend (same folder, CI only — needs py3.13 + pytest-homeassistant-custom-component), and browser smokes (`demo/smoke_*.mjs`, headless chromium). **Counts are not written down here** — they went stale within two releases while the version line beside them was kept current, which reads as less coverage than exists (review R5-2). Run `npm run inventory` for the current numbers, or read them off the last CI run |
|
||||
| Community | **Telegram chat: https://t.me/ha_houseplan** (created 2026-07-27) — the primary user-facing support channel; GitHub issues stay for bugs/features. Link it from any new release notes and posts |
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "houseplan-card",
|
||||
"version": "1.50.4",
|
||||
"version": "1.51.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "houseplan-card",
|
||||
"version": "1.50.4",
|
||||
"version": "1.51.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"lit": "^3.1.3",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "houseplan-card",
|
||||
"version": "1.50.4",
|
||||
"version": "1.51.0",
|
||||
"description": "Interactive house plan Lovelace card for Home Assistant",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
||||
@@ -36,7 +36,7 @@ import { cardStyles } from './styles';
|
||||
import { fitInSquare, contentBounds, spaceModels } from './space-geometry';
|
||||
import { langOf, t, type I18nKey } from './i18n';
|
||||
|
||||
const CARD_VERSION = '1.50.4';
|
||||
const CARD_VERSION = '1.51.0';
|
||||
const LS_KEY = 'houseplan_card_layout_v1';
|
||||
const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering
|
||||
const LS_ZOOM = 'houseplan_card_zoom_v1';
|
||||
|
||||
Reference in New Issue
Block a user