fix: preserve geometry cache during Area baseline

Issue: #126
User-Visible: yes
This commit is contained in:
Sergey Matyunin
2026-09-02 12:54:51 +03:00
parent 67935fa8c0
commit a79d4cd9d2
25 changed files with 221 additions and 191 deletions
@@ -1,125 +1,125 @@
{
"schema": 1,
"fingerprint": "f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f",
"fingerprint": "d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-CqPFzxrj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 290377,
"initialViewGzipBytes": 290460,
"lazyFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/fr-Bfx7FDK1.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/fr-gYskL0hZ.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyGzipBytes": 205802,
"lazyGzipBytes": 205822,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js"
],
"lazyEditorGzipBytes": 148707,
"lazyEditorGzipBytes": 148716,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyOnboardingGzipBytes": 14026,
"lazyOnboardingGzipBytes": 14032,
"lazyLocaleFiles": [
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/fr-Bfx7FDK1.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/fr-gYskL0hZ.js"
],
"lazyLocaleGzipBytes": 50139,
"lazyLocaleGzipBytes": 50146,
"files": [
{
"path": "houseplan-assets/backdrop-pick-yqQ-XytP.js",
"sha256": "4fc16219ca920754cf06c5c3ae4eeae3ed4d0d4c7083ef50ef45c1f785dc31d8",
"path": "houseplan-assets/backdrop-pick-CI0weKTj.js",
"sha256": "36f0fbfeccd0ac6981be68fc7446f7b548a5cb40a542b48e07331f2791e7f555",
"rawBytes": 20636,
"gzipBytes": 7070,
"gzipBytes": 7072,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BZ8DJxmg.js",
"sha256": "351183289a7409a334fdadb6d76362e46314f01e288d91963e28bbe8dd8663a6",
"path": "houseplan-assets/de-Db5jQSzb.js",
"sha256": "412aaaff8a26a9d7fd6d5e4335711e821ea5ad38cc095b61a3ae56ece4c0a7e9",
"rawBytes": 83981,
"gzipBytes": 25341,
"gzipBytes": 25344,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-C1k2VegW.js",
"sha256": "a07f442468fbc8d9581a67586ead9e17aa93e2dc51c302fd1f84fcd6dbf8d6f7",
"path": "houseplan-assets/editor-DrFXz_Hr.js",
"sha256": "cba3f4d097d84c823946d966677f02fcae841233c3a683e2deda6c7084f1f7f2",
"rawBytes": 3826,
"gzipBytes": 1579,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Bfx7FDK1.js",
"sha256": "f5cddc6163a0ad69c95b017b5784e83246d5bfb9d62e42ee904d257b5b93ecd9",
"path": "houseplan-assets/fr-gYskL0hZ.js",
"sha256": "6fe8d00dfa1f3b29b669aa81b205547f49778c86441e5723ab3982b970af09b0",
"rawBytes": 86212,
"gzipBytes": 24798,
"gzipBytes": 24802,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-CqPFzxrj.js",
"sha256": "cfe289dae1528f5747ac849ff6908a2510e8c6051d4427b281d7d5794483f446",
"rawBytes": 1032333,
"gzipBytes": 289581,
"path": "houseplan-assets/houseplan-card-HIu1PXGU.js",
"sha256": "d43a961780a297835fa6b3d8b3ff534897b8376128afa9e7c1db7829dee74ee4",
"rawBytes": 1032568,
"gzipBytes": 289663,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/fr-Bfx7FDK1.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/fr-gYskL0hZ.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"sha256": "52c7a264ce85adc41430e15c1e732dfc3efa1ab69669c6b37b493ab6a24e2461",
"path": "houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"sha256": "df085c635b6b02fa11c1b0b5d9f8e87fc56309ed905de32f6eaee5b8e7c10af4",
"rawBytes": 543265,
"gzipBytes": 140058,
"gzipBytes": 140062,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js",
"sha256": "361af59cb2aae503e55ca84b4ee6fd0abea727f9a347a7e650a2a9a1fdb29951",
"path": "houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js",
"sha256": "0a7828064aa00462836ba7d7fd7bd975b9a0751894d5546aa5c1bad60b987702",
"rawBytes": 28088,
"gzipBytes": 6956,
"gzipBytes": 6960,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "ff2ab3744132b6369ee4b6798860166db78f3f685484fcedc8c2876ce67c579a",
"sha256": "0ac5ff1feac770dfe96547960ca7e5816d4f501fc37cdaf47f5e6cd93d3e427b",
"rawBytes": 1183,
"gzipBytes": 796,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
}
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f";import{b as e,l as o,t,d8 as s,A as a,d9 as i,da as l,db as n,E as r,c}from"./houseplan-card-CqPFzxrj.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";import{b as e,l as o,t,d8 as s,A as a,d9 as i,da as l,db as n,E as r,c}from"./houseplan-card-HIu1PXGU.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>f[e.name]||e.name}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(h.slice(0,3))}
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f";try{await import("./houseplan-assets/houseplan-card-CqPFzxrj.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";try{await import("./houseplan-assets/houseplan-card-HIu1PXGU.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
+4 -3
View File
@@ -144,9 +144,10 @@ rationale in the change. Do not loosen a threshold merely to make a single red
run pass. A new fixture profile gets a new profile id instead of silently
changing the meaning of `large-house-v1`.
The `cleanFloor` entry ceiling is 160: the reviewed fixture currently warms
120 deterministic room/physical-body entries, and the extra 40 slots allow a
legitimate fixture extension without weakening the separate zero-growth gate.
The `cleanFloor` entry ceiling is 100: the reviewed fixture warms exactly 100
deterministic room/physical-body entries. An extra 20 means that one complete
floor was invalidated and rebuilt, so fixture extensions must recalibrate this
ceiling explicitly instead of receiving silent cache headroom.
## Glow profiles
@@ -31,7 +31,7 @@
"noiseAllowanceBytes": 16777216
},
"cacheEntries": {
"cleanFloor": 160,
"cleanFloor": 100,
"glowClip": 200,
"wallUnion": 1,
"openingTunnel": 1,
@@ -76,7 +76,7 @@
"noiseAllowanceBytes": 16777216
},
"cacheEntries": {
"cleanFloor": 160,
"cleanFloor": 100,
"glowClip": 200,
"wallUnion": 1,
"openingTunnel": 1,
+1 -1
View File
@@ -70,7 +70,7 @@
"noiseAllowanceBytes": 16777216
},
"cacheEntries": {
"cleanFloor": 160,
"cleanFloor": 100,
"glowClip": 200,
"wallUnion": 1,
"openingTunnel": 1,
+56 -56
View File
@@ -1,125 +1,125 @@
{
"schema": 1,
"fingerprint": "f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f",
"fingerprint": "d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-CqPFzxrj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 290377,
"initialViewGzipBytes": 290460,
"lazyFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/fr-Bfx7FDK1.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/fr-gYskL0hZ.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyGzipBytes": 205802,
"lazyGzipBytes": 205822,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js"
],
"lazyEditorGzipBytes": 148707,
"lazyEditorGzipBytes": 148716,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyOnboardingGzipBytes": 14026,
"lazyOnboardingGzipBytes": 14032,
"lazyLocaleFiles": [
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/fr-Bfx7FDK1.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/fr-gYskL0hZ.js"
],
"lazyLocaleGzipBytes": 50139,
"lazyLocaleGzipBytes": 50146,
"files": [
{
"path": "houseplan-assets/backdrop-pick-yqQ-XytP.js",
"sha256": "4fc16219ca920754cf06c5c3ae4eeae3ed4d0d4c7083ef50ef45c1f785dc31d8",
"path": "houseplan-assets/backdrop-pick-CI0weKTj.js",
"sha256": "36f0fbfeccd0ac6981be68fc7446f7b548a5cb40a542b48e07331f2791e7f555",
"rawBytes": 20636,
"gzipBytes": 7070,
"gzipBytes": 7072,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-BZ8DJxmg.js",
"sha256": "351183289a7409a334fdadb6d76362e46314f01e288d91963e28bbe8dd8663a6",
"path": "houseplan-assets/de-Db5jQSzb.js",
"sha256": "412aaaff8a26a9d7fd6d5e4335711e821ea5ad38cc095b61a3ae56ece4c0a7e9",
"rawBytes": 83981,
"gzipBytes": 25341,
"gzipBytes": 25344,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-C1k2VegW.js",
"sha256": "a07f442468fbc8d9581a67586ead9e17aa93e2dc51c302fd1f84fcd6dbf8d6f7",
"path": "houseplan-assets/editor-DrFXz_Hr.js",
"sha256": "cba3f4d097d84c823946d966677f02fcae841233c3a683e2deda6c7084f1f7f2",
"rawBytes": 3826,
"gzipBytes": 1579,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Bfx7FDK1.js",
"sha256": "f5cddc6163a0ad69c95b017b5784e83246d5bfb9d62e42ee904d257b5b93ecd9",
"path": "houseplan-assets/fr-gYskL0hZ.js",
"sha256": "6fe8d00dfa1f3b29b669aa81b205547f49778c86441e5723ab3982b970af09b0",
"rawBytes": 86212,
"gzipBytes": 24798,
"gzipBytes": 24802,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-CqPFzxrj.js",
"sha256": "cfe289dae1528f5747ac849ff6908a2510e8c6051d4427b281d7d5794483f446",
"rawBytes": 1032333,
"gzipBytes": 289581,
"path": "houseplan-assets/houseplan-card-HIu1PXGU.js",
"sha256": "d43a961780a297835fa6b3d8b3ff534897b8376128afa9e7c1db7829dee74ee4",
"rawBytes": 1032568,
"gzipBytes": 289663,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-BZ8DJxmg.js",
"houseplan-assets/editor-C1k2VegW.js",
"houseplan-assets/fr-Bfx7FDK1.js",
"houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/fr-gYskL0hZ.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
]
},
{
"path": "houseplan-assets/houseplan-editor-runtime-NGqI-hdQ.js",
"sha256": "52c7a264ce85adc41430e15c1e732dfc3efa1ab69669c6b37b493ab6a24e2461",
"path": "houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"sha256": "df085c635b6b02fa11c1b0b5d9f8e87fc56309ed905de32f6eaee5b8e7c10af4",
"rawBytes": 543265,
"gzipBytes": 140058,
"gzipBytes": 140062,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-BcQpo6pu.js",
"sha256": "361af59cb2aae503e55ca84b4ee6fd0abea727f9a347a7e650a2a9a1fdb29951",
"path": "houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js",
"sha256": "0a7828064aa00462836ba7d7fd7bd975b9a0751894d5546aa5c1bad60b987702",
"rawBytes": 28088,
"gzipBytes": 6956,
"gzipBytes": 6960,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-yqQ-XytP.js",
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "ff2ab3744132b6369ee4b6798860166db78f3f685484fcedc8c2876ce67c579a",
"sha256": "0ac5ff1feac770dfe96547960ca7e5816d4f501fc37cdaf47f5e6cd93d3e427b",
"rawBytes": 1183,
"gzipBytes": 796,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-CqPFzxrj.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,14 +1,14 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f";import{b as e,l as o,t,d8 as s,A as a,d9 as i,da as l,db as n,E as r,c}from"./houseplan-card-CqPFzxrj.js";class f extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,f={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},h=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";import{b as e,l as o,t,d8 as s,A as a,d9 as i,da as l,db as n,E as r,c}from"./houseplan-card-HIu1PXGU.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return o(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`<ha-form
.hass=${this.hass}
.data=${this._formData}
.schema=${e}
.computeLabel=${e=>f[e.name]||e.name}
.computeLabel=${e=>h[e.name]||e.name}
@value-changed=${this._valueChanged}
></ha-form>`;return c`
${d(h.slice(0,3))}
${d(f.slice(0,3))}
${_?c`<div class="default-floor-error" role="alert"
style="color:var(--error-color,#db4437);margin:-4px 0 12px;overflow-wrap:anywhere">
${t(s,"editor.default_floor_missing",{id:_})}
</div>`:a}
${d(h.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}f.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",f);
${d(f.slice(3))}
`}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="f5efceeeb4e6dc4bcc5007b22002220bf68b69fc77f6a42c5063001c23fe514f";try{await import("./houseplan-assets/houseplan-card-CqPFzxrj.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";try{await import("./houseplan-assets/houseplan-card-HIu1PXGU.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale entry: the main chunk is unavailable",e)}
+7
View File
@@ -27,6 +27,13 @@
[#33](https://github.com/Matysh/houseplan-card/issues/33)).
- Small fixes and improvements.
## v1.70.0-beta.5 — 2026-09-02
- The first load after upgrading no longer calculates a large floor twice while
House Plan establishes Home Assistant Area tracking. Startup of the 20-room
benchmark floor is back to the previous stable line's time
([#126](https://github.com/Matysh/houseplan-card/issues/126)).
## v1.70.0-beta.4 — 2026-09-02
- **Help & feedback** now uses the same 44 px header button as General settings,
+7
View File
@@ -35,6 +35,13 @@
[#33](https://github.com/Matysh/houseplan-card/issues/33)).
- Мелкие исправления и улучшения.
## v1.70.0-beta.5 — 2026-09-02
- Первая загрузка после обновления больше не рассчитывает большой этаж дважды,
пока House Plan создаёт служебную привязку к зонам Home Assistant. Время
запуска тестового этажа из 20 комнат вернулось к уровню предыдущей стабильной
версии ([#126](https://github.com/Matysh/houseplan-card/issues/126)).
## v1.70.0-beta.4 — 2026-09-02
- Кнопка **«Помощь и обратная связь»** теперь совпадает по размеру 44 px с
+22 -7
View File
@@ -3909,8 +3909,10 @@ export class HouseplanCard extends LitElement {
}
/** Spaces in render units (NORM_W × NORM_W — the canvas is square). */
/** Bumped by every config mutation — the model/geometry cache key (audit L1). */
/** Bumped by every structural config mutation — the model/geometry cache key (audit L1). */
private _cfgEpoch = 0;
/** Exact settings-only Area lifecycle replacement which may reuse geometry. */
private _cfgEpochPreservedConfig: ServerConfig | null = null;
private _modelCache: { key: string; model: SpaceModel[] } | null = null;
private _emptySpaceStateActive = false;
private _decorSnapCache: {
@@ -4129,11 +4131,23 @@ export class HouseplanCard extends LitElement {
return effectiveExcludedIntegrations(this._settings); // #44: single resolver
}
/** Replace only Area lifecycle settings without invalidating room geometry. */
private _setAreaLifecycleConfig(next: ServerConfig): void {
this._cfgEpochPreservedConfig = next;
this._serverCfg = next;
}
protected willUpdate(changed: PropertyValues): void {
// `_serverCfg` is the root of every geometry cache. Keep the epoch
// invariant local to that reactive assignment so imports, reconnects and
// demo harnesses cannot accidentally reuse an older config object's data.
if (changed.has('_serverCfg')) this._cfgEpoch++;
// #126's provenance/new-device write is the one exact exception: it changes
// no space input, and rebuilding a 20-room floor here doubled cold work.
if (changed.has('_serverCfg')) {
const preserveGeometry = this._cfgEpochPreservedConfig === this._serverCfg;
this._cfgEpochPreservedConfig = null;
if (!preserveGeometry) this._cfgEpoch++;
}
this._syncEmptySpaceState();
if (changed.has('hass') && this.hass) {
this._hassSequence++;
@@ -5209,7 +5223,7 @@ export class HouseplanCard extends LitElement {
if (snapshotChanged || attentionChanged) {
const previousSnapshot = st.marker_area_snapshot;
const previousAttention = st.new_device_ids;
this._serverCfg = {
const nextConfig: ServerConfig = {
...this._serverCfg,
settings: {
...st,
@@ -5217,7 +5231,7 @@ export class HouseplanCard extends LitElement {
...(attentionChanged ? { new_device_ids: nextAttention } : {}),
},
};
this._cfgEpoch++;
this._setAreaLifecycleConfig(nextConfig);
try {
// Await this internal lifecycle write. A debounced fire-and-forget
// save would leave the local snapshot advanced after a rejection,
@@ -5241,7 +5255,8 @@ export class HouseplanCard extends LitElement {
else restored.marker_area_snapshot = previousSnapshot;
if (previousAttention === undefined) delete restored.new_device_ids;
else restored.new_device_ids = previousAttention;
this._serverCfg = { ...this._serverCfg!, settings: restored };
const restoredConfig: ServerConfig = { ...this._serverCfg!, settings: restored };
this._setAreaLifecycleConfig(restoredConfig);
this._cfgContentFingerprint = contentFingerprint(this._serverCfg);
}
// Config and layout are separate stores, but this lifecycle change is
@@ -5278,11 +5293,11 @@ export class HouseplanCard extends LitElement {
? attentionSettings.new_device_ids : []),
...restoreFailed,
])];
this._serverCfg = {
const attentionConfig: ServerConfig = {
...this._serverCfg,
settings: { ...attentionSettings, new_device_ids: attention },
};
this._cfgEpoch++;
this._setAreaLifecycleConfig(attentionConfig);
try {
await this._writeConfig();
} catch (attentionError: unknown) {