Release v1.70.0
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric) (push) Failing after 2m38s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (large-house) (push) Failing after 2m36s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (overlay) (push) Failing after 2m35s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (blend) (push) Failing after 2m38s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 23s
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Successful in 1m7s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 30s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 1m40s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 23s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-default) (push) Failing after 28m14s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 11m48s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 12m42s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (plan-snap) (push) Failing after 41m37s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-glow) (push) Failing after 42m30s

Issue: #126
Release: v1.70.0
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-09-02 13:22:13 +03:00
parent ef0d2be2be
commit 1fd042d9e0
26 changed files with 150 additions and 146 deletions
+1 -1
View File
@@ -47,7 +47,7 @@ PLAN_ORPHAN_TTL_S = 3600
SCHEDULED_GRACE_S = 30 * 24 * 3600
FILES_DIR = "houseplan/files"
CONF_ADMIN_ONLY = "admin_only"
VERSION = "1.70.0-beta.5"
VERSION = "1.70.0"
# #43: the support transport is deliberately not configurable. A user supplied
# URL would turn the integration into an SSRF proxy and make the privacy notice
@@ -1,125 +1,125 @@
{
"schema": 1,
"fingerprint": "84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2",
"fingerprint": "d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-CB6EFEJR.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 290464,
"initialViewGzipBytes": 290460,
"lazyFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/fr-Crzq0_K0.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.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": 205823,
"lazyGzipBytes": 205822,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js"
],
"lazyEditorGzipBytes": 148722,
"lazyEditorGzipBytes": 148716,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyOnboardingGzipBytes": 14030,
"lazyOnboardingGzipBytes": 14032,
"lazyLocaleFiles": [
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/fr-Crzq0_K0.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/fr-gYskL0hZ.js"
],
"lazyLocaleGzipBytes": 50142,
"lazyLocaleGzipBytes": 50146,
"files": [
{
"path": "houseplan-assets/backdrop-pick-D1xUAL1E.js",
"sha256": "0866f902104b1c2f9a96c981d1eabc83fb63bf568808d633dbe3124fc64f082b",
"path": "houseplan-assets/backdrop-pick-CI0weKTj.js",
"sha256": "36f0fbfeccd0ac6981be68fc7446f7b548a5cb40a542b48e07331f2791e7f555",
"rawBytes": 20636,
"gzipBytes": 7071,
"gzipBytes": 7072,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-CsG1LRBj.js",
"sha256": "43e5def4faf65d74400abd193cc8d0467d9e5221d078de6e0273c4c060467d84",
"path": "houseplan-assets/de-Db5jQSzb.js",
"sha256": "412aaaff8a26a9d7fd6d5e4335711e821ea5ad38cc095b61a3ae56ece4c0a7e9",
"rawBytes": 83981,
"gzipBytes": 25342,
"gzipBytes": 25344,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-B5N1jPM6.js",
"sha256": "8ca8b6a4f1fa167722410b71a062bd4d0132cfef52397c8e3c955218b0a7d374",
"path": "houseplan-assets/editor-DrFXz_Hr.js",
"sha256": "cba3f4d097d84c823946d966677f02fcae841233c3a683e2deda6c7084f1f7f2",
"rawBytes": 3826,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Crzq0_K0.js",
"sha256": "9a66c899a2769cbc4e4338814b2f8ef3aece52dc2e2927fb0bba0a3037dd4efc",
"path": "houseplan-assets/fr-gYskL0hZ.js",
"sha256": "6fe8d00dfa1f3b29b669aa81b205547f49778c86441e5723ab3982b970af09b0",
"rawBytes": 86212,
"gzipBytes": 24800,
"gzipBytes": 24802,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-CB6EFEJR.js",
"sha256": "f3dd70321f52b092ee695b79ec9f1dbdc41c50e9eead3f7a2e8e986086dcc44a",
"rawBytes": 1032575,
"gzipBytes": 289667,
"path": "houseplan-assets/houseplan-card-HIu1PXGU.js",
"sha256": "d43a961780a297835fa6b3d8b3ff534897b8376128afa9e7c1db7829dee74ee4",
"rawBytes": 1032568,
"gzipBytes": 289663,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/fr-Crzq0_K0.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.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-BvqR1dug.js",
"sha256": "4fcd60ffcf073d657a0e3470fac5ec6ce1de731c77dc763e7d7e1b8945ebe9e9",
"rawBytes": 543272,
"gzipBytes": 140069,
"path": "houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"sha256": "df085c635b6b02fa11c1b0b5d9f8e87fc56309ed905de32f6eaee5b8e7c10af4",
"rawBytes": 543265,
"gzipBytes": 140062,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.js",
"sha256": "e2bee469b831241c1764b86b56d03b0537ed2b1c5f104bf76923eed3dd25aa9e",
"path": "houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js",
"sha256": "0a7828064aa00462836ba7d7fd7bd975b9a0751894d5546aa5c1bad60b987702",
"rawBytes": 28088,
"gzipBytes": 6959,
"gzipBytes": 6960,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "577443b8b2d165fd5319c5b86426e290c0f9e8cda808192908a2b34ecd895f62",
"sha256": "0ac5ff1feac770dfe96547960ca7e5816d4f501fc37cdaf47f5e6cd93d3e427b",
"rawBytes": 1183,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
}
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";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-CB6EFEJR.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
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}
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";import{l as t,ar as s,A as e,t as o,c as a,bW as l,bX as i,bY as h,bZ as c,ao as n,b_ as r,c3 as p,b$ as d,c0 as _,c1 as u,c2 as g,cY as m,an as b,ap as $,cZ as v}from"./houseplan-card-CB6EFEJR.js";import{i as f,c as y,e as w,r as D,a as k,b as S,s as C,t as M}from"./backdrop-pick-D1xUAL1E.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?a`<hp-help data-help-key=${l}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";import{l as t,ar as s,A as e,t as o,c as a,bW as l,bX as i,bY as h,bZ as c,ao as n,b_ as r,c3 as p,b$ as d,c0 as _,c1 as u,c2 as g,cY as m,an as b,ap as $,cZ as v}from"./houseplan-card-HIu1PXGU.js";import{i as f,c as y,e as w,r as D,a as k,b as S,s as C,t as M}from"./backdrop-pick-CI0weKTj.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?a`<hp-help data-help-key=${l}
.text=${o(h,l)} .ariaLabel=${o(h,i)}></hp-help>`:e}_openSpaceDialog(t,s){if(!this.host._serverStorage||!this.host._serverCfg)return void this.host._showToast(this.host._t("toast.integration_missing"));if("edit"===t){const e=this.host._serverCfg.spaces.find(t=>t.id===s);if(!e)return;const o=l(e),a=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?i(e.settings.custom_fill):null,p="none"===o.fill?{...a||h,a:0}:a;return void(this.host._spaceDialog={mode:t,spaceId:s,title:e.title,planUrl:e.plan_url||null,planFile:null,source:e.plan_url?"file":"draw",showBorders:o.showBorders,showNames:o.showNames,zeroWallStyle:r(e),displayTouched:!0,hideDecor:o.hideDecor,hideOpenings:o.hideOpenings,roomColor:o.color,roomOpacity:o.opacity,fillMode:"none"===o.fill?"custom":o.fill,customFill:p,glowEnabled:o.glow,bgColor:o.bgColor,bgMode:"static"===e.settings?.bg_mode||"daynight"===e.settings?.bg_mode?e.settings.bg_mode:null,northDeg:n({},e.settings),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:o.tempMin,tempMax:o.tempMax,showLqi:o.showLqi??this.host._config?.show_signal??!0,cardFontScale:o.cardFontScale,labelTemp:o.labelTemp,labelHum:o.labelHum,labelLqi:o.labelLqi,labelLight:o.labelLight,cellCm:Number(e.cell_cm)>0?Number(e.cell_cm):5,cellCmInput:c(Number(e.cell_cm)>0?Number(e.cell_cm):5,this.host._imperial),cellCmTouched:!1,busy:!1})}const e=p(this.host._imperial);this.host._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,...f(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:_,tempMax:d,showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:c(e,this.host._imperial),cellCmTouched:!1,busy:!1}}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const o=await y(e);if("reject"===o.kind)return void this.host._showToast(this.host._t("toast.plan_formats"));if("guard"===o.kind)return void(this.host._backdropGuard=o.state);const a=await w(e,o.ext,e.name);this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:a})}_renderBackdropGuard(){return D(this.host,t=>{this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:t})},()=>{this.host._backdropGuard=null},this.host.hass)??e}_useServerPlan(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this.host._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let s=0;s<40;s++){const s=this.host._display(t);if(s){const e=await new Promise(t=>{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:0),e.onerror=()=>t(0),e.src=s}),o=this.host._spaceDialog;return o&&o.planUrl===t&&Number.isFinite(e)&&e>0?(this.host._spaceDialog={...o,savedAspect:e},e):0}if(await new Promise(t=>setTimeout(t,150)),this.host._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){const s=this.host._spaceDialog,e=s?.saved?.find(s=>s.name===t);if(!s||!e||e.used_by.length||e.url===s.planUrl)return;const o=await this.host._confirmDanger({key:"delete-plan",kind:"destructive",title:this.host._t("confirm.delete_plan_title"),message:this.host._t("confirm.delete_plan_body"),objectName:t,confirmLabel:this.host._t("btn.delete"),cancelLabel:this.host._t("btn.cancel")}),a=this.host._spaceDialog,l=a?.saved?.find(s=>s.name===t);if(o&&a&&l&&l.url===e.url&&l.modified===e.modified&&!l.used_by.length&&l.url!==a.planUrl)try{await this.host.hass.callWS({type:"houseplan/plans/delete",name:t});const s=this.host._spaceDialog;s?.saved&&(this.host._spaceDialog={...s,saved:s.saved.filter(s=>s.name!==t)})}catch(t){this.host._showToast(this.host._t("toast.plan_delete_failed",{err:this.host._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return a`<div class="savedplans muted">${this.host._t("space.loading")}</div>`;const s=t.saved||[];if(!s.length)return a`<div class="savedplans muted">${this.host._t("space.no_saved")}</div>`;return a`<div class="savedplans">
${s.map(s=>{return a`
<div class="savedplan ${s.url===t.planUrl?"cur":""}">
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";try{await import("./houseplan-assets/houseplan-card-CB6EFEJR.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)}
+1 -1
View File
@@ -16,5 +16,5 @@
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
"requirements": [],
"single_config_entry": true,
"version": "1.70.0-beta.5"
"version": "1.70.0"
}
+55 -55
View File
@@ -1,125 +1,125 @@
{
"schema": 1,
"fingerprint": "84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2",
"fingerprint": "d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73",
"entry": "houseplan-card.js",
"initialViewFiles": [
"houseplan-assets/houseplan-card-CB6EFEJR.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js",
"houseplan-card.js"
],
"initialViewGzipBytes": 290464,
"initialViewGzipBytes": 290460,
"lazyFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/fr-Crzq0_K0.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.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": 205823,
"lazyGzipBytes": 205822,
"lazyEditorFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/editor-DrFXz_Hr.js",
"houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js"
],
"lazyEditorGzipBytes": 148722,
"lazyEditorGzipBytes": 148716,
"lazyOnboardingFiles": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js"
],
"lazyOnboardingGzipBytes": 14030,
"lazyOnboardingGzipBytes": 14032,
"lazyLocaleFiles": [
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/fr-Crzq0_K0.js"
"houseplan-assets/de-Db5jQSzb.js",
"houseplan-assets/fr-gYskL0hZ.js"
],
"lazyLocaleGzipBytes": 50142,
"lazyLocaleGzipBytes": 50146,
"files": [
{
"path": "houseplan-assets/backdrop-pick-D1xUAL1E.js",
"sha256": "0866f902104b1c2f9a96c981d1eabc83fb63bf568808d633dbe3124fc64f082b",
"path": "houseplan-assets/backdrop-pick-CI0weKTj.js",
"sha256": "36f0fbfeccd0ac6981be68fc7446f7b548a5cb40a542b48e07331f2791e7f555",
"rawBytes": 20636,
"gzipBytes": 7071,
"gzipBytes": 7072,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/de-CsG1LRBj.js",
"sha256": "43e5def4faf65d74400abd193cc8d0467d9e5221d078de6e0273c4c060467d84",
"path": "houseplan-assets/de-Db5jQSzb.js",
"sha256": "412aaaff8a26a9d7fd6d5e4335711e821ea5ad38cc095b61a3ae56ece4c0a7e9",
"rawBytes": 83981,
"gzipBytes": 25342,
"gzipBytes": 25344,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/editor-B5N1jPM6.js",
"sha256": "8ca8b6a4f1fa167722410b71a062bd4d0132cfef52397c8e3c955218b0a7d374",
"path": "houseplan-assets/editor-DrFXz_Hr.js",
"sha256": "cba3f4d097d84c823946d966677f02fcae841233c3a683e2deda6c7084f1f7f2",
"rawBytes": 3826,
"gzipBytes": 1582,
"isEntry": false,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/fr-Crzq0_K0.js",
"sha256": "9a66c899a2769cbc4e4338814b2f8ef3aece52dc2e2927fb0bba0a3037dd4efc",
"path": "houseplan-assets/fr-gYskL0hZ.js",
"sha256": "6fe8d00dfa1f3b29b669aa81b205547f49778c86441e5723ab3982b970af09b0",
"rawBytes": 86212,
"gzipBytes": 24800,
"gzipBytes": 24802,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-card-CB6EFEJR.js",
"sha256": "f3dd70321f52b092ee695b79ec9f1dbdc41c50e9eead3f7a2e8e986086dcc44a",
"rawBytes": 1032575,
"gzipBytes": 289667,
"path": "houseplan-assets/houseplan-card-HIu1PXGU.js",
"sha256": "d43a961780a297835fa6b3d8b3ff534897b8376128afa9e7c1db7829dee74ee4",
"rawBytes": 1032568,
"gzipBytes": 289663,
"isEntry": false,
"imports": [],
"dynamicImports": [
"houseplan-assets/de-CsG1LRBj.js",
"houseplan-assets/editor-B5N1jPM6.js",
"houseplan-assets/fr-Crzq0_K0.js",
"houseplan-assets/houseplan-editor-runtime-BvqR1dug.js",
"houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.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-BvqR1dug.js",
"sha256": "4fcd60ffcf073d657a0e3470fac5ec6ce1de731c77dc763e7d7e1b8945ebe9e9",
"rawBytes": 543272,
"gzipBytes": 140069,
"path": "houseplan-assets/houseplan-editor-runtime-BHxJWPq7.js",
"sha256": "df085c635b6b02fa11c1b0b5d9f8e87fc56309ed905de32f6eaee5b8e7c10af4",
"rawBytes": 543265,
"gzipBytes": 140062,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-assets/houseplan-onboarding-runtime-Nrk9zlVQ.js",
"sha256": "e2bee469b831241c1764b86b56d03b0537ed2b1c5f104bf76923eed3dd25aa9e",
"path": "houseplan-assets/houseplan-onboarding-runtime-CXZ19w7L.js",
"sha256": "0a7828064aa00462836ba7d7fd7bd975b9a0751894d5546aa5c1bad60b987702",
"rawBytes": 28088,
"gzipBytes": 6959,
"gzipBytes": 6960,
"isEntry": false,
"imports": [
"houseplan-assets/backdrop-pick-D1xUAL1E.js",
"houseplan-assets/houseplan-card-CB6EFEJR.js"
"houseplan-assets/backdrop-pick-CI0weKTj.js",
"houseplan-assets/houseplan-card-HIu1PXGU.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
"sha256": "577443b8b2d165fd5319c5b86426e290c0f9e8cda808192908a2b34ecd895f62",
"sha256": "0ac5ff1feac770dfe96547960ca7e5816d4f501fc37cdaf47f5e6cd93d3e427b",
"rawBytes": 1183,
"gzipBytes": 797,
"isEntry": true,
"imports": [
"houseplan-assets/houseplan-card-CB6EFEJR.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,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";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-CB6EFEJR.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
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}
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,4 +1,4 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";import{l as t,ar as s,A as e,t as o,c as a,bW as l,bX as i,bY as h,bZ as c,ao as n,b_ as r,c3 as p,b$ as d,c0 as _,c1 as u,c2 as g,cY as m,an as b,ap as $,cZ as v}from"./houseplan-card-CB6EFEJR.js";import{i as f,c as y,e as w,r as D,a as k,b as S,s as C,t as M}from"./backdrop-pick-D1xUAL1E.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?a`<hp-help data-help-key=${l}
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";import{l as t,ar as s,A as e,t as o,c as a,bW as l,bX as i,bY as h,bZ as c,ao as n,b_ as r,c3 as p,b$ as d,c0 as _,c1 as u,c2 as g,cY as m,an as b,ap as $,cZ as v}from"./houseplan-card-HIu1PXGU.js";import{i as f,c as y,e as w,r as D,a as k,b as S,s as C,t as M}from"./backdrop-pick-CI0weKTj.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="d90076d3f49d110c3959a6c08a86895a6b98ca810fe122b37b76e22adc38ad73";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?a`<hp-help data-help-key=${l}
.text=${o(h,l)} .ariaLabel=${o(h,i)}></hp-help>`:e}_openSpaceDialog(t,s){if(!this.host._serverStorage||!this.host._serverCfg)return void this.host._showToast(this.host._t("toast.integration_missing"));if("edit"===t){const e=this.host._serverCfg.spaces.find(t=>t.id===s);if(!e)return;const o=l(e),a=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?i(e.settings.custom_fill):null,p="none"===o.fill?{...a||h,a:0}:a;return void(this.host._spaceDialog={mode:t,spaceId:s,title:e.title,planUrl:e.plan_url||null,planFile:null,source:e.plan_url?"file":"draw",showBorders:o.showBorders,showNames:o.showNames,zeroWallStyle:r(e),displayTouched:!0,hideDecor:o.hideDecor,hideOpenings:o.hideOpenings,roomColor:o.color,roomOpacity:o.opacity,fillMode:"none"===o.fill?"custom":o.fill,customFill:p,glowEnabled:o.glow,bgColor:o.bgColor,bgMode:"static"===e.settings?.bg_mode||"daynight"===e.settings?.bg_mode?e.settings.bg_mode:null,northDeg:n({},e.settings),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:o.tempMin,tempMax:o.tempMax,showLqi:o.showLqi??this.host._config?.show_signal??!0,cardFontScale:o.cardFontScale,labelTemp:o.labelTemp,labelHum:o.labelHum,labelLqi:o.labelLqi,labelLight:o.labelLight,cellCm:Number(e.cell_cm)>0?Number(e.cell_cm):5,cellCmInput:c(Number(e.cell_cm)>0?Number(e.cell_cm):5,this.host._imperial),cellCmTouched:!1,busy:!1})}const e=p(this.host._imperial);this.host._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,...f(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:_,tempMax:d,showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:c(e,this.host._imperial),cellCmTouched:!1,busy:!1}}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const o=await y(e);if("reject"===o.kind)return void this.host._showToast(this.host._t("toast.plan_formats"));if("guard"===o.kind)return void(this.host._backdropGuard=o.state);const a=await w(e,o.ext,e.name);this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:a})}_renderBackdropGuard(){return D(this.host,t=>{this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:t})},()=>{this.host._backdropGuard=null},this.host.hass)??e}_useServerPlan(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this.host._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let s=0;s<40;s++){const s=this.host._display(t);if(s){const e=await new Promise(t=>{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:0),e.onerror=()=>t(0),e.src=s}),o=this.host._spaceDialog;return o&&o.planUrl===t&&Number.isFinite(e)&&e>0?(this.host._spaceDialog={...o,savedAspect:e},e):0}if(await new Promise(t=>setTimeout(t,150)),this.host._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){const s=this.host._spaceDialog,e=s?.saved?.find(s=>s.name===t);if(!s||!e||e.used_by.length||e.url===s.planUrl)return;const o=await this.host._confirmDanger({key:"delete-plan",kind:"destructive",title:this.host._t("confirm.delete_plan_title"),message:this.host._t("confirm.delete_plan_body"),objectName:t,confirmLabel:this.host._t("btn.delete"),cancelLabel:this.host._t("btn.cancel")}),a=this.host._spaceDialog,l=a?.saved?.find(s=>s.name===t);if(o&&a&&l&&l.url===e.url&&l.modified===e.modified&&!l.used_by.length&&l.url!==a.planUrl)try{await this.host.hass.callWS({type:"houseplan/plans/delete",name:t});const s=this.host._spaceDialog;s?.saved&&(this.host._spaceDialog={...s,saved:s.saved.filter(s=>s.name!==t)})}catch(t){this.host._showToast(this.host._t("toast.plan_delete_failed",{err:this.host._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return a`<div class="savedplans muted">${this.host._t("space.loading")}</div>`;const s=t.saved||[];if(!s.length)return a`<div class="savedplans muted">${this.host._t("space.no_saved")}</div>`;return a`<div class="savedplans">
${s.map(s=>{return a`
<div class="savedplan ${s.url===t.planUrl?"cur":""}">
+1 -1
View File
@@ -1 +1 @@
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="84dadc0ad537495b7cdd319480d648a25af57eb056bf81f04b6d4c9e86c00bf2";try{await import("./houseplan-assets/houseplan-card-CB6EFEJR.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)}
+9 -5
View File
@@ -1,14 +1,18 @@
<!-- release: v1.70.0-beta.5 -->
<!-- release: v1.70.0 -->
## Основное
- Первая загрузка после обновления больше не рассчитывает большой этаж дважды при создании служебной привязки к HA-зонам ([#126](https://github.com/Matysh/houseplan-card/issues/126)).
- В House Plan появился закрытый канал «Помощь и обратная связь», ошибки и подсказки локализованы, а опасные действия используют единый доступный диалог подтверждения ([#43](https://github.com/Matysh/houseplan-card/issues/43), [#42](https://github.com/Matysh/houseplan-card/issues/42), [#86](https://github.com/Matysh/houseplan-card/issues/86), [#32](https://github.com/Matysh/houseplan-card/issues/32)).
- Работа с устройствами получила видимые фильтры обнаружения, Undo/Redo позиций, автоматический перенос в связанную HA-зону, действие «Ничего не делать» и более безопасное редактирование привязок ([#44](https://github.com/Matysh/houseplan-card/issues/44), [#74](https://github.com/Matysh/houseplan-card/issues/74), [#126](https://github.com/Matysh/houseplan-card/issues/126), [#381](https://github.com/Matysh/houseplan-card/issues/381), [#385](https://github.com/Matysh/houseplan-card/issues/385)).
- Камера теперь движется плавно, мебель можно точно менять в размере, зеркалить и вращать, а плотное кадрирование игнорирует скрытую архитектуру; старые и будущие конфиги защищены проверками совместимости ([#82](https://github.com/Matysh/houseplan-card/issues/82), [#396](https://github.com/Matysh/houseplan-card/issues/396), [#383](https://github.com/Matysh/houseplan-card/issues/383), [#384](https://github.com/Matysh/houseplan-card/issues/384), [#33](https://github.com/Matysh/houseplan-card/issues/33)).
- Мелкие исправления и улучшения.
## Highlights
- The first load after upgrading no longer calculates a large floor twice while establishing HA Area tracking ([#126](https://github.com/Matysh/houseplan-card/issues/126)).
- House Plan adds a private Help & feedback flow, localized errors and contextual help, plus one accessible confirmation experience for destructive actions ([#43](https://github.com/Matysh/houseplan-card/issues/43), [#42](https://github.com/Matysh/houseplan-card/issues/42), [#86](https://github.com/Matysh/houseplan-card/issues/86), [#32](https://github.com/Matysh/houseplan-card/issues/32)).
- Device workflows gain visible discovery filters, position Undo/Redo, automatic relocation to a linked Home Assistant Area, a Do nothing tap action, and safer binding edits ([#44](https://github.com/Matysh/houseplan-card/issues/44), [#74](https://github.com/Matysh/houseplan-card/issues/74), [#126](https://github.com/Matysh/houseplan-card/issues/126), [#381](https://github.com/Matysh/houseplan-card/issues/381), [#385](https://github.com/Matysh/houseplan-card/issues/385)).
- Camera moves are now smooth, furniture can be resized, mirrored and rotated precisely, and tight house framing ignores hidden architecture; compatibility guards protect old and future plan configs ([#82](https://github.com/Matysh/houseplan-card/issues/82), [#396](https://github.com/Matysh/houseplan-card/issues/396), [#383](https://github.com/Matysh/houseplan-card/issues/383), [#384](https://github.com/Matysh/houseplan-card/issues/384), [#33](https://github.com/Matysh/houseplan-card/issues/33)).
- Small fixes and improvements.
[Полный список изменений на русском](https://github.com/Matysh/houseplan-card/blob/v1.70.0-beta.5/docs/CHANGELOG.ru.md)
· [Full changelog in English](https://github.com/Matysh/houseplan-card/blob/v1.70.0-beta.5/docs/CHANGELOG.md)
[Полный список изменений на русском](https://github.com/Matysh/houseplan-card/blob/v1.70.0/docs/CHANGELOG.ru.md)
· [Full changelog in English](https://github.com/Matysh/houseplan-card/blob/v1.70.0/docs/CHANGELOG.md)
+2 -2
View File
@@ -21,8 +21,8 @@ metadata). Only an explicit owner-approved emergency hotfix may skip this gate.
| Item | State |
|---|---|
| Version | **v1.70.0-beta.5** everywhere (manifest, const.py, package.json, CARD_VERSION) |
| Current local cycle | v1.70.0-beta.5 is the gate-repair prerelease candidate for the beta.1–beta.4 line. It keeps #126's first authoritative HA Area provenance write out of the geometry epoch, returning the 20-room cold-load benchmark to the v1.69.0 level; the exact cache ceiling is now 100. After exact-SHA Validate this beta is published, then promoted to v1.70.0 only after Full Performance is green on the exact `main` SHA. |
| Version | **v1.70.0** everywhere (manifest, const.py, package.json, CARD_VERSION) |
| Current local cycle | v1.70.0 is the promotion-only stable candidate for the published beta.1–beta.5 line. Beta.5 fixed #126's first authoritative HA Area provenance write so it no longer advances the geometry epoch, returned the 20-room cold-load benchmark to the v1.69.0 level, and tightened the exact cache ceiling to 100. Publish stable only after exact-SHA Validate and Full Performance are green on `main`. |
| Hidden Labs Stage | #89 Stage 1 ships in v1.63.0-beta.1. #122 Stage 2 ships in v1.64.0 and evolves the same hidden, expiring `iso` experiment with matte walls, a low exterior floor edge, restrained shared shadows and live vertical door/window/gate panels. Flat remains default; editors and `houseplan-space-card` remain flat; live floor effects and HA actions remain unchanged. Public activation remains a separate task. |
| Workflow | Superseded 2026-08-12: the pre-1.62 rule of "local edits without tests or commits" is **dead** — since release 1.62 every product change follows `PROCESS.md` (issue in `S5-ready`+, branch `issue/<NN>-slug`, trailers on every commit, review pipeline; `AGENTS.md` is the summary). Release mechanics below remain current. A requested pre-release gets a production build plus the smallest targeted unit/smoke set covering the changed surfaces, one tested `dev` commit/tag and a GitHub Release with `prerelease=true`; `main` stays untouched. The complete local frontend/backend/smoke gate runs only before a stable release, after which `main` is fast-forwarded to the exact tested `dev` SHA and the GitHub Release uses `prerelease=false`. Release bodies are short and bilingual (Russian first); every bullet links its GitHub issue (#NN) so the #328 rules stay machine-checkable. A STABLE body aggregates the changelog since the PREVIOUS STABLE release (never since the last beta): features/fixes described across the line's beta changelogs must appear, while bugs that were introduced and fixed strictly inside the beta line (never shipped in any stable) are excluded — draft with `npm run release:notes -- <tag>`, curate by hand, then `npm run release:notes -- <tag> --verify` must pass. `Мелкие исправления и улучшения` / `Small fixes and improvements` is allowed only when the range really contains user-visible work not itemised in the body; a single-issue hotfix ships without it (the verifier enforces this). Every body ends with separate links to the Russian and English changelogs. Open or partially delivered issues are never presented as shipped. Telegram announcements are sent only for stable releases; beta and RC publication is silent. `docs/RELEASE-NOTES.md` is the current canonical body instance; `npm run release:prerelease -- <tag> --issues=… --yes` is the primary local publication path and the manual `Publish prerelease` workflow is its GitHub-only equivalent once present on `main`. Nothing is copied to the home instance by hand |
| GitHub | https://github.com/Matysh/houseplan-card — [Issues](https://github.com/Matysh/houseplan-card/issues) are the canonical task records; their labels carry priority and workflow status (`PROCESS.md` §9). GitHub Projects is no longer used. `main` carries stable releases; pre-release tags may point directly at `dev`. Work lands on `dev` and is merged into `main` for a stable release, 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) |
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "houseplan-card",
"version": "1.70.0-beta.5",
"version": "1.70.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "houseplan-card",
"version": "1.70.0-beta.5",
"version": "1.70.0",
"license": "MIT",
"dependencies": {
"lit": "^3.1.3",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "houseplan-card",
"version": "1.70.0-beta.5",
"version": "1.70.0",
"description": "Interactive house plan Lovelace card for Home Assistant",
"license": "MIT",
"type": "module",
+1 -1
View File
@@ -374,7 +374,7 @@ import {
} from './space-order';
import { applyOpeningMoves, mergeCollinearPartitions, spaceMergeGeometry } from './wall-merge';
const CARD_VERSION = '1.70.0-beta.5';
const CARD_VERSION = '1.70.0';
const ENTRY_BUILD_FINGERPRINT = '__HOUSEPLAN_SOURCE_FINGERPRINT__';
const EDITOR_RETRY_ASSET = '__HOUSEPLAN_EDITOR_RETRY_ASSET__';
+1 -1
View File
@@ -352,7 +352,7 @@ import {
} from './space-order';
import { applyOpeningMoves, mergeCollinearPartitions, spaceMergeGeometry } from './wall-merge';
const CARD_VERSION = '1.70.0-beta.5';
const CARD_VERSION = '1.70.0';
type ResizeLiveLabel = {
kind: 'length';