mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-07 23:19:14 +00:00
Compare commits
24
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
370df0708c | ||
|
|
bcc68f0da2 | ||
|
|
574ae94840 | ||
|
|
90e8ea4685 | ||
|
|
ee351dcb84 | ||
|
|
2b841d94e4 | ||
|
|
c175a2ab1a | ||
|
|
020739ebca | ||
|
|
ffdd69e277 | ||
|
|
319ee70010 | ||
|
|
5c893c7ff3 | ||
|
|
077e9c1b1b | ||
|
|
0471482c2e | ||
|
|
db887cd7f0 | ||
|
|
7feda5b6c8 | ||
|
|
285a6dc436 | ||
|
|
52876b0573 | ||
|
|
cdfe02e64d | ||
|
|
07c885435a | ||
|
|
67af859e8c | ||
|
|
4a7abf531b | ||
|
|
379de706d2 | ||
|
|
1faed2af7d | ||
|
|
343449e694 |
@@ -49,6 +49,10 @@ async def _async_flush_runtime(
|
||||
writers are independently guarded so one failed store cannot prevent the
|
||||
other from reaching disk during shutdown.
|
||||
"""
|
||||
zigbee = getattr(entry.runtime_data, "zigbee_coordinator", None)
|
||||
if zigbee is not None:
|
||||
await zigbee.async_close()
|
||||
|
||||
recorder = hass.data.get(DOMAIN, {}).get("trail_recorder")
|
||||
if recorder is not None:
|
||||
try:
|
||||
@@ -111,6 +115,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: HouseplanConfigEntry) ->
|
||||
_LOGGER.exception("House Plan: virtual-light storage is not readable; using default on")
|
||||
entry.runtime_data = data
|
||||
|
||||
from .zigbee_topology import ZigbeeScanCoordinator
|
||||
data.zigbee_coordinator = ZigbeeScanCoordinator(hass, entry)
|
||||
|
||||
from .radar import RadarCoordinator
|
||||
data.radar_coordinator = RadarCoordinator(hass, data)
|
||||
await data.radar_coordinator.async_setup()
|
||||
|
||||
@@ -57,7 +57,7 @@ SCHEDULED_GRACE_S = 30 * 24 * 3600
|
||||
FILES_DIR = "houseplan/files"
|
||||
ASSETS_DIR = "houseplan/assets"
|
||||
CONF_ADMIN_ONLY = "admin_only"
|
||||
VERSION = "1.80.0-beta.1"
|
||||
VERSION = "1.80.0-beta.4"
|
||||
DECOR_ASSETS_API_VERSION = 1
|
||||
SUMMARY_PANEL_API_VERSION = 1
|
||||
|
||||
|
||||
@@ -1,598 +1,626 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"fingerprint": "dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",
|
||||
"fingerprint": "2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",
|
||||
"entry": "houseplan-card.js",
|
||||
"panelEntry": "houseplan-panel.js",
|
||||
"initialViewFiles": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-card.js"
|
||||
],
|
||||
"initialViewGzipBytes": 301007,
|
||||
"initialViewGzipBytes": 301040,
|
||||
"initialPanelFiles": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelGzipBytes": 302529,
|
||||
"initialPanelGzipBytes": 302564,
|
||||
"initialPanelOnlyFiles": [
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelOnlyGzipBytes": 2321,
|
||||
"initialPanelOnlyGzipBytes": 2327,
|
||||
"lazyFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
],
|
||||
"lazyGzipBytes": 480977,
|
||||
"lazyGzipBytes": 485830,
|
||||
"lazyEditorFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"lazyEditorGzipBytes": 242375,
|
||||
"lazyEditorGzipBytes": 243803,
|
||||
"lazyOnboardingFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"lazyOnboardingGzipBytes": 28393,
|
||||
"lazyOnboardingGzipBytes": 28679,
|
||||
"lazyLocaleFiles": [
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js"
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js"
|
||||
],
|
||||
"lazyLocaleGzipBytes": 53848,
|
||||
"lazyLocaleGzipBytes": 53867,
|
||||
"lazyIsometricFiles": [
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js"
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js"
|
||||
],
|
||||
"lazyIsometricGzipBytes": 12344,
|
||||
"lazyIsometricGzipBytes": 12348,
|
||||
"lazyFurnitureArtFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js"
|
||||
],
|
||||
"lazyFurnitureArtGzipBytes": 16943,
|
||||
"lazyFurnitureArtGzipBytes": 16939,
|
||||
"lazyPdfFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js"
|
||||
],
|
||||
"lazyPdfGzipBytes": 126940,
|
||||
"lazyPdfGzipBytes": 126937,
|
||||
"lazyMoonFiles": [
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js"
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js"
|
||||
],
|
||||
"lazyMoonGzipBytes": 11714,
|
||||
"lazyMoonGzipBytes": 11715,
|
||||
"lazyLedFiles": [
|
||||
"houseplan-assets/led-strip-field-D9Bcdufv.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js"
|
||||
"houseplan-assets/led-strip-field-DYtgd8wB.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js"
|
||||
],
|
||||
"lazyLedGzipBytes": 10673,
|
||||
"lazyLedGzipBytes": 10684,
|
||||
"lazyLedEditorFiles": [
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"lazyLedEditorGzipBytes": 10691,
|
||||
"lazyLedEditorGzipBytes": 10705,
|
||||
"lazyNamespaceLocaleFiles": [
|
||||
"houseplan-assets/led-de-in8-Bixy.js",
|
||||
"houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"houseplan-assets/led-ru-BunGriy7.js",
|
||||
"houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"houseplan-assets/settings-ru-yivgZyNN.js",
|
||||
"houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"houseplan-assets/topology-ru-Cv-4NOD4.js"
|
||||
"houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"houseplan-assets/led-ru-BcCmiv05.js",
|
||||
"houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"houseplan-assets/settings-ru-Dm61M7J6.js",
|
||||
"houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"houseplan-assets/topology-ru-DSq63N19.js"
|
||||
],
|
||||
"lazyNamespaceLocaleGzipBytes": 30384,
|
||||
"lazyNamespaceLocaleGzipBytes": 31767,
|
||||
"files": [
|
||||
{
|
||||
"path": "houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"sha256": "e5287d777ef8cb19356af3c7205445d3e8cb0fa070a8c1fb4d9c86f0fba4938e",
|
||||
"rawBytes": 55329,
|
||||
"gzipBytes": 18023,
|
||||
"path": "houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"sha256": "141b16e51a818ad137bbf001efb6bed28a20791e8d992b0430edd79bfa3d0bec",
|
||||
"rawBytes": 54425,
|
||||
"gzipBytes": 17699,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"houseplan-assets/settings-ru-yivgZyNN.js"
|
||||
"houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"houseplan-assets/settings-ru-Dm61M7J6.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/de-BX4qFHIX.js",
|
||||
"sha256": "eff45b5f7c398944263edad4d12dcf092f2cb19a7752b631c20c4417edf6f47e",
|
||||
"path": "houseplan-assets/de-Df0SMMtx.js",
|
||||
"sha256": "ce067613e40e29223f9a0e46516035e7bf153bc30145083239945e82096803ab",
|
||||
"rawBytes": 89873,
|
||||
"gzipBytes": 27157,
|
||||
"gzipBytes": 27164,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/editor-PXorykkG.js",
|
||||
"sha256": "de49dbd79ee4e95fc3a5f8ff411743b391fe47e83c94e56132240cf4a2820880",
|
||||
"path": "houseplan-assets/editor-Ber3pzUs.js",
|
||||
"sha256": "9a8614dc89d1f5df419b66152f97872ac3a1cee8aff47bbc190e28ca3dd87317",
|
||||
"rawBytes": 3833,
|
||||
"gzipBytes": 1580,
|
||||
"gzipBytes": 1585,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"sha256": "1da1581c026ed21404ac69f5975793b40aac0eea46c22236dd88d00550d9dfb2",
|
||||
"path": "houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"sha256": "a6fccd3fb4ad315ba51316e958d65b49cf3e4d51707ddd98e47019e83b8467f2",
|
||||
"rawBytes": 1104,
|
||||
"gzipBytes": 579,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"sha256": "d67cd5482adce817b474e68ba31e1d3c0ddec55ff8f7c912e78395a265bb881d",
|
||||
"rawBytes": 25605,
|
||||
"gzipBytes": 5058,
|
||||
"gzipBytes": 5059,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/fr-Cfsy2S88.js",
|
||||
"sha256": "20122ee14aff0368571d664b95fc4ca18dd76ad39f5bee0219f89306ec5c0775",
|
||||
"path": "houseplan-assets/fr-9DZosQeR.js",
|
||||
"sha256": "14738a9cb6f99a1b7c56b425696dd354bb0589c58f569db280bab7aa313dab08",
|
||||
"rawBytes": 92266,
|
||||
"gzipBytes": 26691,
|
||||
"gzipBytes": 26703,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"sha256": "4e1fd4e13ecc5e2592669af1333de2c844df3718a91dcb6e77eebc10512f4380",
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"sha256": "75937cebabec17ca652b22606bfe3ae511df5a8e44921d05d4f84fe3ab353e74",
|
||||
"rawBytes": 52035,
|
||||
"gzipBytes": 16943,
|
||||
"gzipBytes": 16939,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"sha256": "b1577206faff0d44254faf7fe2f3725346234ee6ac0b31e00dbffb09f32b5fa6",
|
||||
"rawBytes": 1059141,
|
||||
"gzipBytes": 300208,
|
||||
"path": "houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"sha256": "2891b5898e812f6433322a6b750077f5c543a6308c2b04e19e349f3003101830",
|
||||
"rawBytes": 1059200,
|
||||
"gzipBytes": 300237,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js"
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"sha256": "15935a500d2cf09d7d6367ce3d2a45115624a561f5c21cc81c481583bbb83d07",
|
||||
"rawBytes": 696207,
|
||||
"gzipBytes": 194763,
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"sha256": "2706f9bbc0201e8902598eb20463ee9e417520e40ebb9536be857098f7b56ca3",
|
||||
"rawBytes": 698926,
|
||||
"gzipBytes": 195577,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"sha256": "6d6f0398771c34f56a9dc64b3b6faddbf596d8832dbcd407453c12840165cf8e",
|
||||
"rawBytes": 15886,
|
||||
"gzipBytes": 4905,
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"sha256": "715f8a6fecb9d2772c0184834a4e7fd673fb8ba8e2b19f25e084d5139ab63ff9",
|
||||
"rawBytes": 15930,
|
||||
"gzipBytes": 4932,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"sha256": "acf283f4ebdfef0f31785f14f881b7d10a7678fbb599b30cc54964d83bc488a3",
|
||||
"rawBytes": 12193,
|
||||
"gzipBytes": 4295,
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"sha256": "d4a06ecef69eef43807011f234e9ea4f41525512e3c46cd192f71c7530da5797",
|
||||
"rawBytes": 16715,
|
||||
"gzipBytes": 5525,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"sha256": "1c9f594f000cf9b15ee730829deb878169dc057a8911b37367e1fd5f8d535f46",
|
||||
"path": "houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"sha256": "6865d06163a910a4f641d0bb29bc99cb8215902708b83427de0b466c4d796914",
|
||||
"rawBytes": 36700,
|
||||
"gzipBytes": 12344,
|
||||
"gzipBytes": 12348,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-de-in8-Bixy.js",
|
||||
"sha256": "4b49513a9f51a060a0266d3387a614819cc3b845e840d1e6520af009e41a860d",
|
||||
"path": "houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"sha256": "622c426b50781de7a4be6aadb935cadcc7fa774179b2ef409f65fa64e9064e65",
|
||||
"rawBytes": 1907,
|
||||
"gzipBytes": 919,
|
||||
"gzipBytes": 922,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"sha256": "56c0e03568d0bacf5c9d35bf39061682305458a5e67d8b1202897f2072d2f2d1",
|
||||
"path": "houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"sha256": "1f10f0098bb13ce8ef24f60a1dda556b0aa6f47239a0bfa124d016fc92ede20d",
|
||||
"rawBytes": 1886,
|
||||
"gzipBytes": 904,
|
||||
"gzipBytes": 907,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-ru-BunGriy7.js",
|
||||
"sha256": "bc2777d7d6f1ffbcc44398c7ce23d346b89eb7585deff7a2c779c0eb1a7c8efb",
|
||||
"path": "houseplan-assets/led-ru-BcCmiv05.js",
|
||||
"sha256": "8c367a70a2fd03504863c42afb168803905dd7f16145e489e227f77c0b61e7fe",
|
||||
"rawBytes": 2525,
|
||||
"gzipBytes": 1105,
|
||||
"gzipBytes": 1107,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"sha256": "d929af6d550f9fe7e11f20c97464977f1af2f74fef7e8cb37ac62e12bb46fd37",
|
||||
"path": "houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"sha256": "4f25c8551b2db798fc062c5f9e0a9733d8a18bd6f7d3d03da73c33753623403c",
|
||||
"rawBytes": 21704,
|
||||
"gzipBytes": 7372,
|
||||
"gzipBytes": 7381,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/led-de-in8-Bixy.js",
|
||||
"houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"houseplan-assets/led-ru-BunGriy7.js"
|
||||
"houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"houseplan-assets/led-ru-BcCmiv05.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-field-D9Bcdufv.js",
|
||||
"sha256": "8b362df9a6f1eaafec5cde2d37cb031d4632e86c74a3c4a8bcfe83d8f4a5894e",
|
||||
"path": "houseplan-assets/led-strip-field-DYtgd8wB.js",
|
||||
"sha256": "47fd14662b9836229b7f2aa55fb027f4aa56313b0825be70f5b1a6a674541d17",
|
||||
"rawBytes": 8066,
|
||||
"gzipBytes": 3379,
|
||||
"gzipBytes": 3383,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"sha256": "60ad8036bd5149cbbd337948f869cc1611361e8ee9f7b00961a38b6ddd2b0f8f",
|
||||
"path": "houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"sha256": "d59b35b494d23921b63faf4f584f1ab9dea3342e5a43b7399964e3d4732d40fe",
|
||||
"rawBytes": 7055,
|
||||
"gzipBytes": 2912,
|
||||
"gzipBytes": 2914,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"sha256": "5372fffb42da6d3b88505f56f0067f177bd30f8d91421583d400be336239c072",
|
||||
"path": "houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"sha256": "2675363403be48fddf536c7101422e2492b1e4172aa701851a15e46ce1f80ce2",
|
||||
"rawBytes": 11248,
|
||||
"gzipBytes": 4382,
|
||||
"gzipBytes": 4387,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/led-strip-field-D9Bcdufv.js"
|
||||
"houseplan-assets/led-strip-field-DYtgd8wB.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"sha256": "8ce67a99c4a06e7ac1b6c9769f3fa180f431c45a8dcfe7d31a6b1d511bfbbebb",
|
||||
"rawBytes": 8370,
|
||||
"gzipBytes": 3273,
|
||||
"path": "houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"sha256": "744e65ad2f843f7f6e09176ff449b5b4b83e935856a98b2ec128aebdf93ebc8d",
|
||||
"rawBytes": 9694,
|
||||
"gzipBytes": 3782,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"sha256": "8805e21c3833547d5d675e3a07c63ff2414813ca09e0be84dc58b052455dc2de",
|
||||
"path": "houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"sha256": "597bb1bc933908ff200057dd7ba941f3b5a974c9a2090acc56b0f715da39ad6f",
|
||||
"rawBytes": 1191,
|
||||
"gzipBytes": 683,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"sha256": "c70c2405448d5aa0444ed2ad0ef9446a568e06981c9e14665a53c7c0af030604",
|
||||
"rawBytes": 30292,
|
||||
"gzipBytes": 11714,
|
||||
"gzipBytes": 11715,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"sha256": "96fd090ad66b4fd88502eeb5a2acef5f0fcf67f758c88e3f546a3d7e3f620088",
|
||||
"path": "houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"sha256": "85197049ab95cd2928a157d8045508cc2e6340dcd8963079dfda1b743b9e910f",
|
||||
"rawBytes": 675,
|
||||
"gzipBytes": 407,
|
||||
"gzipBytes": 410,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"sha256": "b718a5d48b9e774649e1e942adc5f1c83928605f2ac10a846770bd2a4d14a217",
|
||||
"path": "houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"sha256": "05ce799acc1bb24dc0d283a44beb1bfed7c5791637ebc9c9140c7bda5652b7df",
|
||||
"rawBytes": 236714,
|
||||
"gzipBytes": 109997,
|
||||
"gzipBytes": 109998,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"sha256": "766c2d32e011428a85c01471da9863f525d1efa22e95c55409f007ff0e99a3c5",
|
||||
"path": "houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"sha256": "5185e2fbba6b5ca8384a5b9f8024210dd4f7eae44a208255f8fe142012075890",
|
||||
"rawBytes": 8886,
|
||||
"gzipBytes": 3406,
|
||||
"gzipBytes": 3410,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"sha256": "68fdd0f26382ee70ed9ea20c95578cb696ba9e839655c98342b9817491380743",
|
||||
"path": "houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"sha256": "a1a6ce7597b21f3e8b6bbf41c374dc3fab4e5ae4baf9181d270c90a6fa58f45c",
|
||||
"rawBytes": 9297,
|
||||
"gzipBytes": 3379,
|
||||
"gzipBytes": 3384,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-ru-yivgZyNN.js",
|
||||
"sha256": "a91238540e317153b46c782e28988984184e75f3d67f536f3cb099323a24abfe",
|
||||
"path": "houseplan-assets/settings-ru-Dm61M7J6.js",
|
||||
"sha256": "e1efb00b777f3f386ce2296f96c76cc1970460dc5b9915cf5bca0d667e814f2b",
|
||||
"rawBytes": 12284,
|
||||
"gzipBytes": 3896,
|
||||
"gzipBytes": 3900,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"sha256": "e49ba86408175c0ec0642436a811a1105b6c698adcf389b7b7e057e8e7f2e145",
|
||||
"path": "houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"sha256": "1939fa609e45366525ac5e61cee84cb1aeae7d3a99711fa1744908fda7e9cde6",
|
||||
"rawBytes": 2619,
|
||||
"gzipBytes": 1124,
|
||||
"gzipBytes": 1127,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-editor-Cxzy0-Eo.js",
|
||||
"sha256": "72d514ddaaa223cccc30f44835a69f13ccdee4d21680f089c147c18952850b55",
|
||||
"path": "houseplan-assets/summary-panel-editor-BDa-rBgX.js",
|
||||
"sha256": "abccfc8cfad10984cdbfe5b7b8f416c84c11727640b3fe707b3bb03b168ecc8a",
|
||||
"rawBytes": 14867,
|
||||
"gzipBytes": 3424,
|
||||
"gzipBytes": 3427,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js"
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-metrics-DCWtuw0D.js",
|
||||
"sha256": "0de126c3a3461fe404b8cd9f929c0f8fb7df00a7376b39d677ed5ceb27c5808e",
|
||||
"path": "houseplan-assets/summary-panel-metrics-BiXNDvWo.js",
|
||||
"sha256": "c0a6e64d7805b99c83dd58b3704814dea5b21e47a9c5a4f3c61d0f5582f1ae55",
|
||||
"rawBytes": 2701,
|
||||
"gzipBytes": 1341,
|
||||
"gzipBytes": 1344,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js",
|
||||
"sha256": "1c0e52ab60df32e6863b32cf4e6b607cf346baddc8b4dfc2ab7aceb4caf6084d",
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js",
|
||||
"sha256": "b978d47f4babb0564c97a7b3a2d0e505a43a81eab4f49792acb3b39be38d6564",
|
||||
"rawBytes": 73476,
|
||||
"gzipBytes": 20484,
|
||||
"gzipBytes": 20488,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/summary-panel-editor-Cxzy0-Eo.js",
|
||||
"houseplan-assets/summary-panel-metrics-DCWtuw0D.js"
|
||||
"houseplan-assets/summary-panel-editor-BDa-rBgX.js",
|
||||
"houseplan-assets/summary-panel-metrics-BiXNDvWo.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"sha256": "3dd1076c8e194970aa07c0abc7ef659ea35084818078db4c95fa6610c1a8460d",
|
||||
"path": "houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"sha256": "0250ec7cbbcca4f972f612b68bc8dd19fe7ebf6b83014e521c06291d53814416",
|
||||
"rawBytes": 6167,
|
||||
"gzipBytes": 2393,
|
||||
"gzipBytes": 2397,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"sha256": "447051dca94d109223c2262dbc7a9ebec2fd5f3a044b6d58d55b6f31ee5c5b15",
|
||||
"path": "houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"sha256": "c67ff5b8ddc5c490e292199debc279ccf65c46cecdec2e105ecc7ee06e9c5a90",
|
||||
"rawBytes": 6333,
|
||||
"gzipBytes": 2428,
|
||||
"gzipBytes": 2433,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"sha256": "c1670d36d1bd4213bdb5ebb61c7af6a96989e03df3490d97220b009d8628c7a0",
|
||||
"path": "houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"sha256": "534214af44ba8e80b6449ad3bc42ecdb6f43103f293fd7d19deae60d1481a52e",
|
||||
"rawBytes": 8376,
|
||||
"gzipBytes": 2874,
|
||||
"gzipBytes": 2877,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"sha256": "ddb88d1eff71074f5d4abd4c0104c0d997e732218e90858c63863bd7d4a3bbc9",
|
||||
"path": "houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"sha256": "205d81de2c9b9b79516e88e7284592c0726e5f4b3a9dd63242cc028b267ee8ce",
|
||||
"rawBytes": 4130,
|
||||
"gzipBytes": 1373,
|
||||
"gzipBytes": 1377,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"sha256": "b8204314e3b4b94b9e3b293b82695a0325671768af8ad888495b5a489d4ccba3",
|
||||
"path": "houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"sha256": "3a3d842ec5befbc252261ec46afefd8cb28b2ab1d805220a55933ddd38831a2c",
|
||||
"rawBytes": 4136,
|
||||
"gzipBytes": 1356,
|
||||
"gzipBytes": 1359,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"sha256": "7e18727975a541c8bb20233edbb820328128134ac69f316884a90111641dc03d",
|
||||
"path": "houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"sha256": "46afb767891262c52bc51658de2db852264b911eb864f03f91a5f10d2573301b",
|
||||
"rawBytes": 5633,
|
||||
"gzipBytes": 1693,
|
||||
"gzipBytes": 1696,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"sha256": "a0c95c17a111567d8b3cc1b27d437ead6bee7461850cf4320046cf9ff7bee783",
|
||||
"rawBytes": 2951,
|
||||
"gzipBytes": 1435,
|
||||
"path": "houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"sha256": "85ed4bb11a34972e23ba51a7bb74a70f7fc30b228f7b140a7a87c780cdfa93aa",
|
||||
"rawBytes": 4237,
|
||||
"gzipBytes": 1889,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"sha256": "0d7d4412a61f74b97a446f52ea977d810016a7225422ad37dfd3c989b000804b",
|
||||
"rawBytes": 3039,
|
||||
"gzipBytes": 1447,
|
||||
"path": "houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"sha256": "67b40ff27301c3aefd69dee454f5e90ff7edf43da084434ce850c3960e7bb65b",
|
||||
"rawBytes": 4321,
|
||||
"gzipBytes": 1871,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-ru-Cv-4NOD4.js",
|
||||
"sha256": "f062fe240df83d46e7a0afed17d325b4027a5bdef7afc61ba1b7b77d98f35fb2",
|
||||
"rawBytes": 4270,
|
||||
"gzipBytes": 1776,
|
||||
"path": "houseplan-assets/topology-ru-DSq63N19.js",
|
||||
"sha256": "21126337f66f9e2af553a999af9cb33a72a3d780daa86b1da8c2b5f92ffb6b85",
|
||||
"rawBytes": 5880,
|
||||
"gzipBytes": 2238,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"sha256": "e827b48796657593e36f772ae1142a70f21abfb6ad231a7f72f146827f1654f4",
|
||||
"rawBytes": 14847,
|
||||
"gzipBytes": 5601,
|
||||
"path": "houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"sha256": "1fee965bb50d8d80417cae2e9a6b070a8fe1311b42171b300d83768f911eb9c4",
|
||||
"rawBytes": 15905,
|
||||
"gzipBytes": 5955,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"houseplan-assets/topology-ru-Cv-4NOD4.js"
|
||||
"houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"houseplan-assets/topology-ru-DSq63N19.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js",
|
||||
"sha256": "3f1e2c4b58cc97535e83e9a0b011175fef0c5c878c4ee6f9e9de3c03476c4c4a",
|
||||
"rawBytes": 4374,
|
||||
"gzipBytes": 1952,
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js",
|
||||
"sha256": "1d76b7f08b7659d6f3a05ba551acc4698ab3a05be495077ac498b212dadb039b",
|
||||
"rawBytes": 7883,
|
||||
"gzipBytes": 2880,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-card.js",
|
||||
"sha256": "085db39e22d81bc69f6552b4d6a7e4d4270bb76b4bf7f0e26e98e438ed060237",
|
||||
"sha256": "b1334be19eb372421b9b2886a9f79a7d86bf68f3dd856cda830865436059ad15",
|
||||
"rawBytes": 1205,
|
||||
"gzipBytes": 799,
|
||||
"gzipBytes": 803,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-panel.js",
|
||||
"sha256": "bd1cfdab7b550552450e08d47e699fd65ea3f13ba76ef44df8766897e1dcb380",
|
||||
"sha256": "e1e064634e82387201d3666c7264d26f9aae2df27bd9b1229d8a872738f4ad53",
|
||||
"rawBytes": 6165,
|
||||
"gzipBytes": 2321,
|
||||
"gzipBytes": 2327,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
}
|
||||
|
||||
+76
-76
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{aG as e,l as o,aJ as t,eE as s,A as a,eF as i,eG as l,eH as n,E as r,c}from"./houseplan-card-pPShiPsn.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__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{aG as e,l as o,aJ as t,eE as s,A as a,eF as i,eG as l,eH as n,E as r,c}from"./houseplan-card-BOhGeQlv.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
|
||||
.hass=${this.hass}
|
||||
.data=${this._formData}
|
||||
.schema=${e}
|
||||
@@ -0,0 +1 @@
|
||||
function t(t){const a=t.visualViewport;return a&&Number.isFinite(a.width)&&Number.isFinite(a.height)?{left:Number(a.offsetLeft)||0,top:Number(a.offsetTop)||0,width:Math.max(0,Number(a.width)||0),height:Math.max(0,Number(a.height)||0)}:{left:0,top:0,width:t.innerWidth,height:t.innerHeight}}function a(t,a,h,e=7,i=8){const o=h.left+i,n=h.top+i,m=Math.max(o,h.left+h.width-i),f=Math.max(n,h.top+h.height-i),r=Math.max(0,m-o),M=Math.max(0,f-n),u=Math.min(Math.max(0,a.width),r),d=Math.min(Math.max(0,a.height),M);let p=t.left;p+u>m&&(p=t.right-u),p=Math.min(Math.max(o,p),Math.max(o,m-u));const x=t.bottom+e,s=t.top-e-d;let b="bottom",l=x;return x+d>f&&s>=n?(b="top",l=Math.min(Math.max(n,s),Math.max(n,f-d))):l=Math.min(Math.max(n,x),Math.max(n,f-d)),{left:Math.round(p),top:Math.round(l),side:b,maxWidth:Math.round(r),maxHeight:Math.round(M)}}function h(t){const a=t.HTMLElement?.prototype;return"function"==typeof a?.showPopover&&"function"==typeof a?.hidePopover}globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{h as a,t as f,a as p};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+10
-10
File diff suppressed because one or more lines are too long
+56
-51
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{l as t,bS as s,A as e,aJ as o,c as a,m as i,d2 as l,d3 as h,d4 as n,bO as r,d5 as c,da as p,d6 as d,d7 as _,d8 as u,d9 as g,db as m,dc as f}from"./houseplan-card-pPShiPsn.js";import{z as b,A as v,C as y,D,E as w,G as S,H as $,I as C,n as M,S as k}from"./backdrop-pick-pmkHPB61.js";import{s as I}from"./namespace-language-Cj9GZ2Dl.js";import"./form-kit.styles-BC5W6ya6.js";const x="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",T=I([k]);class F{constructor(t){this.host=t,this.languageRuntime=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(i){const l=`${i}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,i)&&s(h,l)?a`<hp-help data-help-key=${i}
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{l as t,bS as s,A as e,aJ as o,c as a,m as i,d2 as l,d3 as h,d4 as n,bO as r,d5 as c,da as p,d6 as d,d7 as _,d8 as u,d9 as g,db as m,dc as f}from"./houseplan-card-BOhGeQlv.js";import{x as b,y as v,A as y,B as D,C as w,D as S,E as $,G as C,n as M,S as k}from"./backdrop-pick-rLk02S_E.js";import{s as I}from"./namespace-language-qIVz1CjX.js";import"./form-kit.styles-BXaoYN6g.js";import"./floating-surface-CAk--Y2g.js";const x="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",T=I([k]);class F{constructor(t){this.host=t,this.languageRuntime=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(i){const l=`${i}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,i)&&s(h,l)?a`<hp-help data-help-key=${i}
|
||||
.text=${o(h,i)} .ariaLabel=${o(h,l)}></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=i(e),a=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?l(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:c(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:r({},e.settings),northDegInput:null===r({},e.settings)?"":String(r({},e.settings)),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:o.tempMin,tempMax:o.tempMax,tempMinInput:String(o.tempMin),tempMaxInput:String(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:n(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,...m(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,northDegInput:"",sunRays:null,tempMin:_,tempMax:d,tempMinInput:String(_),tempMaxInput:String(d),showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:n(e,this.host._imperial),cellCmTouched:!1,busy:!1},b(this.host,this.host._spaceDialog)}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const o=await v(this.host,e);o&&this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:o})}_renderBackdropGuard(){return y(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,i=a?.saved?.find(s=>s.name===t);if(o&&a&&i&&i.url===e.url&&i.modified===e.modified&&!i.used_by.length&&i.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":""}">
|
||||
+27
File diff suppressed because one or more lines are too long
-27
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"LED-Streifen","led.hint":"Zeichnen Sie den Streifen Punkt für Punkt entlang der Wandflächen oder über den Boden; er rastet am Raster und an Wandflächen ein. Danach wählen Sie das Gerät, das er darstellt.","led.start":"Klicken, um den Streifen zu beginnen","led.start_touch":"Tippen, um den Streifen zu beginnen","led.points":"Punkte: {n} · Umschalt — 45°-Schritte · Esc — fertig · Strg+Z — Punkt entfernen","led.points_touch":"Punkte: {n} · Werkzeug wechseln zum Beenden","led.finish":"Fertig","led.stopped":"Der Streifen stößt an eine Wand","led.unbound":"Streifen ist mit keinem Gerät verbunden","led.bind":"Gerät verbinden","led.change":"Gerät wechseln","led.later":"Später","led.unbind":"Trennen","led.delete":"Streifen löschen","led.settings":"Geräteeinstellungen","led.type_note":"LED-Streifen: Form im Geräte-Editor auf dem Plan bearbeiten","led.show_strip":"Als LED-Streifen zeigen","led.show_icon":"Als Symbol zeigen","led.cancel":"Abbrechen","led.taken":"Bereits mit einem anderen LED-Streifen verbunden","led.space":"Zuerst den LED-Streifen lösen: Er gehört zu seinem Bereich","led.limit_points":"Höchstens 50 Punkte pro Streifen","led.limit_strips":"Höchstens 50 Streifen pro Bereich","led.pick_title":"Gerät für den Streifen wählen","led.pick_new":"Neues Gerät…","led.pick_empty":"Auf diesem Plan gibt es noch keine freien Geräte.","led.saved":"LED-Streifen gespeichert","led.save_failed":"Streifen nicht gespeichert: {err}","led.history_draw":"LED-Streifen","led.history_shape":"Form des LED-Streifens","led.history_view":"Darstellung des Geräts","led.optimize_walls":"Streifen durch Wände: {n} ({spaces})"};const n="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,n as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"LED-Streifen","led.hint":"Zeichnen Sie den Streifen Punkt für Punkt entlang der Wandflächen oder über den Boden; er rastet am Raster und an Wandflächen ein. Danach wählen Sie das Gerät, das er darstellt.","led.start":"Klicken, um den Streifen zu beginnen","led.start_touch":"Tippen, um den Streifen zu beginnen","led.points":"Punkte: {n} · Umschalt — 45°-Schritte · Esc — fertig · Strg+Z — Punkt entfernen","led.points_touch":"Punkte: {n} · Werkzeug wechseln zum Beenden","led.finish":"Fertig","led.stopped":"Der Streifen stößt an eine Wand","led.unbound":"Streifen ist mit keinem Gerät verbunden","led.bind":"Gerät verbinden","led.change":"Gerät wechseln","led.later":"Später","led.unbind":"Trennen","led.delete":"Streifen löschen","led.settings":"Geräteeinstellungen","led.type_note":"LED-Streifen: Form im Geräte-Editor auf dem Plan bearbeiten","led.show_strip":"Als LED-Streifen zeigen","led.show_icon":"Als Symbol zeigen","led.cancel":"Abbrechen","led.taken":"Bereits mit einem anderen LED-Streifen verbunden","led.space":"Zuerst den LED-Streifen lösen: Er gehört zu seinem Bereich","led.limit_points":"Höchstens 50 Punkte pro Streifen","led.limit_strips":"Höchstens 50 Streifen pro Bereich","led.pick_title":"Gerät für den Streifen wählen","led.pick_new":"Neues Gerät…","led.pick_empty":"Auf diesem Plan gibt es noch keine freien Geräte.","led.saved":"LED-Streifen gespeichert","led.save_failed":"Streifen nicht gespeichert: {err}","led.history_draw":"LED-Streifen","led.history_shape":"Form des LED-Streifens","led.history_view":"Darstellung des Geräts","led.optimize_walls":"Streifen durch Wände: {n} ({spaces})"};const n="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,n as fingerprint};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"Ruban LED","led.hint":"Tracez le ruban point par point le long des faces des murs ou sur le sol ; il s’aimante à la grille et aux faces des murs. Ensuite, choisissez l’appareil qu’il représente.","led.start":"Cliquez pour commencer le ruban","led.start_touch":"Touchez pour commencer le ruban","led.points":"Points : {n} · Maj — pas de 45° · Échap — terminer · Ctrl+Z — retirer le point","led.points_touch":"Points : {n} · changez d’outil pour terminer","led.finish":"Terminer","led.stopped":"Le ruban bute contre un mur","led.unbound":"Ruban non lié à un appareil","led.bind":"Lier un appareil","led.change":"Changer d’appareil","led.later":"Plus tard","led.unbind":"Délier","led.delete":"Supprimer le ruban","led.settings":"Réglages de l’appareil","led.type_note":"Ruban LED : modifiez sa forme sur le plan dans l’éditeur d’appareils","led.show_strip":"Afficher en ruban LED","led.show_icon":"Afficher en icône","led.cancel":"Annuler","led.taken":"Déjà lié à un autre ruban LED","led.space":"Détachez d’abord le ruban LED : il appartient à son espace","led.limit_points":"50 points au maximum par ruban","led.limit_strips":"50 rubans au maximum par espace","led.pick_title":"Choisissez l’appareil du ruban","led.pick_new":"Nouvel appareil…","led.pick_empty":"Aucun appareil libre sur ce plan pour l’instant.","led.saved":"Ruban LED enregistré","led.save_failed":"Ruban non enregistré : {err}","led.history_draw":"Ruban LED","led.history_shape":"Forme du ruban LED","led.history_view":"Représentation de l’appareil","led.optimize_walls":"Rubans traversant des murs : {n} ({spaces})"};const a="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,a as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"Ruban LED","led.hint":"Tracez le ruban point par point le long des faces des murs ou sur le sol ; il s’aimante à la grille et aux faces des murs. Ensuite, choisissez l’appareil qu’il représente.","led.start":"Cliquez pour commencer le ruban","led.start_touch":"Touchez pour commencer le ruban","led.points":"Points : {n} · Maj — pas de 45° · Échap — terminer · Ctrl+Z — retirer le point","led.points_touch":"Points : {n} · changez d’outil pour terminer","led.finish":"Terminer","led.stopped":"Le ruban bute contre un mur","led.unbound":"Ruban non lié à un appareil","led.bind":"Lier un appareil","led.change":"Changer d’appareil","led.later":"Plus tard","led.unbind":"Délier","led.delete":"Supprimer le ruban","led.settings":"Réglages de l’appareil","led.type_note":"Ruban LED : modifiez sa forme sur le plan dans l’éditeur d’appareils","led.show_strip":"Afficher en ruban LED","led.show_icon":"Afficher en icône","led.cancel":"Annuler","led.taken":"Déjà lié à un autre ruban LED","led.space":"Détachez d’abord le ruban LED : il appartient à son espace","led.limit_points":"50 points au maximum par ruban","led.limit_strips":"50 rubans au maximum par espace","led.pick_title":"Choisissez l’appareil du ruban","led.pick_new":"Nouvel appareil…","led.pick_empty":"Aucun appareil libre sur ce plan pour l’instant.","led.saved":"Ruban LED enregistré","led.save_failed":"Ruban non enregistré : {err}","led.history_draw":"Ruban LED","led.history_shape":"Forme du ruban LED","led.history_view":"Représentation de l’appareil","led.optimize_walls":"Rubans traversant des murs : {n} ({spaces})"};const a="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,a as fingerprint};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"LED-лента","led.hint":"Нарисуйте ленту по точкам вдоль граней стен или по полу — она прилипает к сетке и граням. После завершения выберите устройство, которое она показывает.","led.start":"Нажмите, чтобы начать ленту","led.start_touch":"Коснитесь, чтобы начать ленту","led.points":"Точек: {n} · Shift — шаг 45° · Esc — завершить · Ctrl+Z — убрать точку","led.points_touch":"Точек: {n} · смените инструмент, чтобы завершить","led.finish":"Завершить","led.stopped":"Лента упёрлась в стену","led.unbound":"Лента не привязана к устройству","led.bind":"Привязать устройство","led.change":"Сменить устройство","led.later":"Позже","led.unbind":"Отвязать","led.delete":"Удалить ленту","led.settings":"Настройки устройства","led.type_note":"LED-лента: форма редактируется на плане в редакторе устройств","led.show_strip":"Показывать LED-лентой","led.show_icon":"Показывать значком","led.cancel":"Отмена","led.taken":"Уже привязано к другой LED-ленте","led.space":"Сначала отвяжите LED-ленту: она принадлежит своему пространству","led.limit_points":"Не более 50 точек в ленте","led.limit_strips":"Не более 50 лент в пространстве","led.pick_title":"Выберите устройство для ленты","led.pick_new":"Новое устройство…","led.pick_empty":"На этом плане пока нет свободных устройств.","led.saved":"LED-лента сохранена","led.save_failed":"Лента не сохранена: {err}","led.history_draw":"LED-лента","led.history_shape":"Форма LED-ленты","led.history_view":"Вид устройства","led.optimize_walls":"Лент, проходящих сквозь стены: {n} ({spaces})"};const d="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,d as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"LED-лента","led.hint":"Нарисуйте ленту по точкам вдоль граней стен или по полу — она прилипает к сетке и граням. После завершения выберите устройство, которое она показывает.","led.start":"Нажмите, чтобы начать ленту","led.start_touch":"Коснитесь, чтобы начать ленту","led.points":"Точек: {n} · Shift — шаг 45° · Esc — завершить · Ctrl+Z — убрать точку","led.points_touch":"Точек: {n} · смените инструмент, чтобы завершить","led.finish":"Завершить","led.stopped":"Лента упёрлась в стену","led.unbound":"Лента не привязана к устройству","led.bind":"Привязать устройство","led.change":"Сменить устройство","led.later":"Позже","led.unbind":"Отвязать","led.delete":"Удалить ленту","led.settings":"Настройки устройства","led.type_note":"LED-лента: форма редактируется на плане в редакторе устройств","led.show_strip":"Показывать LED-лентой","led.show_icon":"Показывать значком","led.cancel":"Отмена","led.taken":"Уже привязано к другой LED-ленте","led.space":"Сначала отвяжите LED-ленту: она принадлежит своему пространству","led.limit_points":"Не более 50 точек в ленте","led.limit_strips":"Не более 50 лент в пространстве","led.pick_title":"Выберите устройство для ленты","led.pick_new":"Новое устройство…","led.pick_empty":"На этом плане пока нет свободных устройств.","led.saved":"LED-лента сохранена","led.save_failed":"Лента не сохранена: {err}","led.history_draw":"LED-лента","led.history_shape":"Форма LED-ленты","led.history_view":"Вид устройства","led.optimize_walls":"Лент, проходящих сквозь стены: {n} ({spaces})"};const d="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,d as fingerprint};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{eu as e,eC as t,c6 as s,eJ as o,eK as i,ad as n,ee as a,O as r,eL as l,az as d,ef as c,aL as p,eM as u,eN as h,eO as f,A as m,eP as v}from"./houseplan-card-pPShiPsn.js";import{L as g,v as w,s as $,a as _,b as y,p as k,c as b,d as C,e as P}from"./led-strip-geometry-P8XODJa_.js";const M="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";let F,L=null,U=null;function x(e,t){return L||U||F===e||""===F||(U=(void 0===F?import("./led-strip-field-D9Bcdufv.js"):import(new URL(`./led-strip-field-D9Bcdufv.js?${Date.now()}`,import.meta.url).href)).then(e=>{e.LED_FIELD_FINGERPRINT===o?L=e:F=""},()=>{F=e}).finally(()=>{U=null})),L||U?.then(()=>L&&t()),L}const D=e=>e.some(e=>e.glow&&"on"===e.state),R=e=>e.map(e=>[e[0],e[1]]),E="#383838";function A(o,i){if(!o)return null;const n=Array.isArray(o.masonryGeometry)?o.masonryGeometry:[],a=[...e(o.masonryGeometry),...o.opaqueBodies],r=[];for(const e of a)for(let t=0;t<e.length;t++){const s=e[t],o=e[(t+1)%e.length];s&&o&&r.push({a:[s[0],s[1]],b:[o[0],o[1]]})}const l=25,d=new Map;r.forEach((e,t)=>{const s=Math.floor(Math.min(e.a[0],e.b[0])/l),o=Math.floor(Math.max(e.a[0],e.b[0])/l),i=Math.floor(Math.min(e.a[1],e.b[1])/l),n=Math.floor(Math.max(e.a[1],e.b[1])/l);for(let e=s;e<=o;e++)for(let s=i;s<=n;s++){const o=`${e},${s}`,i=d.get(o);i?i.push(t):d.set(o,[t])}});const c=e=>{let t=1/0,s=1/0,o=-1/0,i=-1/0;for(const n of e)t=Math.min(t,n[0]),s=Math.min(s,n[1]),o=Math.max(o,n[0]),i=Math.max(i,n[1]);return[t,s,o,i]},p=(e,t)=>e[0]>=t[0]&&e[0]<=t[2]&&e[1]>=t[1]&&e[1]<=t[3],u=n.filter(e=>e?.[0]?.length).map(e=>({box:c(e[0]),poly:e})),h=o.opaqueBodies.map(e=>({box:c(e),body:e}));return{faces:r,inside:e=>u.some(({box:s,poly:o})=>p(e,s)&&t([e[0],e[1]],[o]))||h.some(({box:t,body:o})=>p(e,t)&&s([e[0],e[1]],o)),epsilon:i,near:e=>{const t=new Set;for(let s=Math.floor(e[0]/l);s<=Math.floor(e[2]/l);s++)for(let o=Math.floor(e[1]/l);o<=Math.floor(e[3]/l);o++)for(const e of d.get(`${s},${o}`)||[])t.add(e);return[...t].map(e=>r[e])}}}function I(e){const t=e.candidate?.sourceEid||e.device.primary||"",s=t?e.hass?.states?.[t]?.state:void 0,o="unavailable"===s||"unknown"===s||!!t&&!!e.hass&&!e.hass.states?.[t]&&!e.device.virtual,i=Number(e.device.marker?.glow_radius_cm),n=Number.isFinite(i)&&i>0?i/e.cellCm*e.gridPitch:e.defaultRadius,a=o?null:e.candidate?.appearance??null;return{strip:e.strip,device:e.device,state:o?"unavailable":a?"on":"off",glow:e.glow,appearance:a,radius:n}}const T=new WeakMap;function j(e,t,s){const o=P*s;const i=T.get(e);if(i&&i.faces===t&&i.epsilon===t?.epsilon&&i.value.t===o&&i.points.length===e.points.length&&i.points.every((t,s)=>t[0]===e.points[s][0]&&t[1]===e.points[s][1]))return i.value;const n=R(e.points),a=y(n,t,o/2),r={t:o,path:a,d:k(a)};return T.set(e,{faces:t,epsilon:t?.epsilon,points:n,value:r}),r}function G(e){if(!e.views.length)return d``;const t=e.handlers,s=[...e.views].sort((e,t)=>e.strip.id<t.strip.id?1:e.strip.id>t.strip.id?-1:0),o=e.iso;return d`<g class="led-strips" data-hp-led-strips="${s.length}"
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{eu as e,eC as t,c6 as s,eJ as o,eK as i,ad as n,ee as a,O as r,eL as l,az as d,ef as c,aL as p,eM as u,eN as h,eO as f,A as m,eP as v}from"./houseplan-card-BOhGeQlv.js";import{L as g,v as w,s as $,a as y,b as _,p as k,c as b,d as C,e as P}from"./led-strip-geometry-CFq4tPIv.js";const M="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";let F,L=null,U=null;function x(e,t){return L||U||F===e||""===F||(U=(void 0===F?import("./led-strip-field-DYtgd8wB.js"):import(new URL(`./led-strip-field-DYtgd8wB.js?${Date.now()}`,import.meta.url).href)).then(e=>{e.LED_FIELD_FINGERPRINT===o?L=e:F=""},()=>{F=e}).finally(()=>{U=null})),L||U?.then(()=>L&&t()),L}const D=e=>e.some(e=>e.glow&&"on"===e.state),R=e=>e.map(e=>[e[0],e[1]]),E="#383838";function A(o,i){if(!o)return null;const n=Array.isArray(o.masonryGeometry)?o.masonryGeometry:[],a=[...e(o.masonryGeometry),...o.opaqueBodies],r=[];for(const e of a)for(let t=0;t<e.length;t++){const s=e[t],o=e[(t+1)%e.length];s&&o&&r.push({a:[s[0],s[1]],b:[o[0],o[1]]})}const l=25,d=new Map;r.forEach((e,t)=>{const s=Math.floor(Math.min(e.a[0],e.b[0])/l),o=Math.floor(Math.max(e.a[0],e.b[0])/l),i=Math.floor(Math.min(e.a[1],e.b[1])/l),n=Math.floor(Math.max(e.a[1],e.b[1])/l);for(let e=s;e<=o;e++)for(let s=i;s<=n;s++){const o=`${e},${s}`,i=d.get(o);i?i.push(t):d.set(o,[t])}});const c=e=>{let t=1/0,s=1/0,o=-1/0,i=-1/0;for(const n of e)t=Math.min(t,n[0]),s=Math.min(s,n[1]),o=Math.max(o,n[0]),i=Math.max(i,n[1]);return[t,s,o,i]},p=(e,t)=>e[0]>=t[0]&&e[0]<=t[2]&&e[1]>=t[1]&&e[1]<=t[3],u=n.filter(e=>e?.[0]?.length).map(e=>({box:c(e[0]),poly:e})),h=o.opaqueBodies.map(e=>({box:c(e),body:e}));return{faces:r,inside:e=>u.some(({box:s,poly:o})=>p(e,s)&&t([e[0],e[1]],[o]))||h.some(({box:t,body:o})=>p(e,t)&&s([e[0],e[1]],o)),epsilon:i,near:e=>{const t=new Set;for(let s=Math.floor(e[0]/l);s<=Math.floor(e[2]/l);s++)for(let o=Math.floor(e[1]/l);o<=Math.floor(e[3]/l);o++)for(const e of d.get(`${s},${o}`)||[])t.add(e);return[...t].map(e=>r[e])}}}function I(e){const t=e.candidate?.sourceEid||e.device.primary||"",s=t?e.hass?.states?.[t]?.state:void 0,o="unavailable"===s||"unknown"===s||!!t&&!!e.hass&&!e.hass.states?.[t]&&!e.device.virtual,i=Number(e.device.marker?.glow_radius_cm),n=Number.isFinite(i)&&i>0?i/e.cellCm*e.gridPitch:e.defaultRadius,a=o?null:e.candidate?.appearance??null;return{strip:e.strip,device:e.device,state:o?"unavailable":a?"on":"off",glow:e.glow,appearance:a,radius:n}}const T=new WeakMap;function j(e,t,s){const o=P*s;const i=T.get(e);if(i&&i.faces===t&&i.epsilon===t?.epsilon&&i.value.t===o&&i.points.length===e.points.length&&i.points.every((t,s)=>t[0]===e.points[s][0]&&t[1]===e.points[s][1]))return i.value;const n=R(e.points),a=_(n,t,o/2),r={t:o,path:a,d:k(a)};return T.set(e,{faces:t,epsilon:t?.epsilon,points:n,value:r}),r}function G(e){if(!e.views.length)return d``;const t=e.handlers,s=[...e.views].sort((e,t)=>e.strip.id<t.strip.id?1:e.strip.id>t.strip.id?-1:0),o=e.iso;return d`<g class="led-strips" data-hp-led-strips="${s.length}"
|
||||
data-hp-iso=${o?"raised":m}>
|
||||
${o?d`<defs><filter id="hp-led-iso-shadow" filterUnits="userSpaceOnUse"
|
||||
x="-100000" y="-100000" width="200000" height="200000">
|
||||
@@ -44,4 +44,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2
|
||||
@blur=${()=>t.blur(p)}></path>`:m}
|
||||
</g>
|
||||
</g>`})}
|
||||
</g>`}function H(e,t,s,o){return(t?e.find(e=>e.id===t):void 0)??(s?e.find(e=>o(s,e)):void 0)}function N(e){const t=new Map(e.devices.map(e=>[e.id,e])),s=g/e.cellCm*e.gridPitch,o=new Map(i({hass:e.hass,devices:e.devices,virtualLights:e.virtualLights,spaceId:e.space.id,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,defaultRadiusUnits:s,cellCm:e.cellCm,gridPitch:e.gridPitch,position:()=>({x:0,y:0})}).map(e=>[e.key,e])),r=[];for(const i of e.space.led_strips||[]){if(!1===i?.active||!i.marker||!w(i.points))continue;const a={...i,points:i.points.map(e=>[e[0]*n,e[1]*n])},l=t.get(a.marker);if(!l||l.space!==e.space.id)continue;if(l.hidden&&!e.showHidden)continue;const d=H(e.space.rooms,l.marker?.room_id,$(R(a.points)),e.inRoom);r.push(I({strip:a,device:l,candidate:o.get(`${e.space.id}|${l.id}`)??null,hass:e.hass,glow:!!d&&e.glowFor(d),defaultRadius:s,cellCm:e.cellCm,gridPitch:e.gridPitch}))}const l=_/e.cellCm*e.gridPitch;return{views:r,faces:A(e.scene,l),d:e.iconPct/100*a(e.space),scene:e.scene,polygons:e.polygons}}const q=new WeakMap;function B(e){for(const t of q.get(e)?.frame.views??[])T.delete(t.strip);q.delete(e),L?.releaseLedField(e)}function S(e){return{shapes:q.get(e)?.frame.views.length??0,...L?.ledFieldStats(e)??{visibility:0,sources:0,visibilityPaths:0,pathChars:0,recomputes:0}}}function O(e,t,s){const o=t.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),i=o.length?e._lightBarriers(t,o.map(({room:e,poly:t})=>({r:e,poly:t}))):null,n=[t,e._renderDevices,e._renderPlanHass,s,i,e._mode,e._showAll],a=q.get(e);if(a&&a.key.every((e,t)=>e===n[t]))return a.frame;for(const e of a?.frame.views??[])T.delete(e.strip);const d=e._config?.icon_size??2.5,c=N({space:t,devices:e._renderDevices,hass:e._renderPlanHass,virtualLights:e._virtualLights,defaultColor:e._fillColors.glow_light.c,paletteAlpha:e._fillColors.glow_light.a,cellCm:e._cellCm,gridPitch:e._gridPitch,iconPct:d>8?2.5:d,scene:i,polygons:o,glowFor:e=>l(s,e),inRoom:(t,s)=>e._pointInRoom(t,s),showHidden:"devices"===e._mode&&e._showAll});return!1!==e.isConnected&&q.set(e,{key:n,frame:c}),c}function W(e,t,s,o){const i=O(e,t,s),n=e._stageEl?.clientWidth,a="iso"===e._renderProjection&&"view"===e._mode,r=a?i.d*c:i.d,l="theme-dark"===p(e._renderPlanHass)?"dark":"light",m=!!e._isoLightFloors?.size,v=u(l,m),g=G({views:i.views,d:r,iso:a?{lift:f.lift*r,depth:f.depth*r,edge:h(E,l,m),shadow:{dx:v.dx*r,dy:v.dy*r,sigma:v.sigma*r,opacity:v.opacityWhite}}:null,faces:i.faces,perUnit:n&&o.w?n/o.w:1,handlers:"view"===e._mode?{click:(t,s)=>e._clickDevice(t,s),keydown:(t,s)=>e._keyDevice(t,s),contextmenu:(t,s)=>e._ctxDevice(t,s),pointerdown:(t,s)=>e._pointerDown(t,s),pointermove:(t,s)=>{const o=e._pointerMove(t,s);o&&e._showDeviceTip(t,o)},pointerup:(t,s)=>e._pointerUp(t,s),pointercancel:(t,s)=>e._pointerCancel(t,s),pointerover:(t,s)=>e._showDeviceTip(t,s),pointerleave:()=>e._clearPointerHover(),focus:(t,s)=>e._showDeviceFocusTip(t,s),blur:t=>e._hideDeviceFocusTip(t.id),label:e=>e.name}:null});return"plan"===e._mode||"decor"===e._mode?d`<g class="led-passive" opacity="0.45" pointer-events="none">${g}</g>`:g}function z(e,t,s){if(!1===e.isConnected)return d``;const o=O(e,t,s),i=o.scene&&(D(o.views)||L?.hasLedField(e))?L||x(t.id,()=>!1!==e.isConnected&&e.requestUpdate()):null;return i?i.renderLedField({views:o.views,scene:o.scene,polygons:o.polygons,faces:o.faces,spaceId:t.id,owner:e,requestUpdate:()=>e.requestUpdate(),isConnected:()=>!1!==e.isConnected}):d``}function Y(e){const t=e.space.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),s=N({space:e.space,devices:e.devices,hass:e.hass,virtualLights:e.virtualLights,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,cellCm:e.cellCm,gridPitch:e.gridPitch,iconPct:e.iconPct,scene:e.scene,polygons:t,glowFor:e.glowFor,inRoom:e.inRoom,showHidden:!1}),o=e.live?s.views:s.views.map(e=>({...e,state:"off",appearance:null,glow:!1})),i=A({masonryGeometry:e.bodies.masonryGeometry,opaqueBodies:e.bodies.opaqueBodies},_/e.cellCm*e.gridPitch),n=e.isConnected()&&e.scene&&e.live&&(D(o)||L?.hasLedField(e.owner))?x(e.space.id,()=>e.isConnected()&&e.ready()):null;return n||L?.releaseLedField(e.owner),d`${n?n.renderLedField({views:o,scene:e.scene,polygons:t,faces:i,spaceId:e.space.id,owner:e.owner,requestUpdate:e.ready,isConnected:e.isConnected}):m}${G({views:o,d:s.d,faces:i,perUnit:e.perUnit,handlers:null})}`}export{M as LED_RUNTIME_FINGERPRINT,A as faceContext,x as ledField,N as ledFrame,O as ledFrameFor,S as ledStats,I as ledStripView,j as ledStripePath,B as releaseLed,z as renderLedFieldFor,W as renderLedLayerFor,G as renderLedStripes,Y as renderStaticLed,H as stripRoom};
|
||||
</g>`}function H(e,t,s,o){return(t?e.find(e=>e.id===t):void 0)??(s?e.find(e=>o(s,e)):void 0)}function N(e){const t=new Map(e.devices.map(e=>[e.id,e])),s=g/e.cellCm*e.gridPitch,o=new Map(i({hass:e.hass,devices:e.devices,virtualLights:e.virtualLights,spaceId:e.space.id,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,defaultRadiusUnits:s,cellCm:e.cellCm,gridPitch:e.gridPitch,position:()=>({x:0,y:0})}).map(e=>[e.key,e])),r=[];for(const i of e.space.led_strips||[]){if(!1===i?.active||!i.marker||!w(i.points))continue;const a={...i,points:i.points.map(e=>[e[0]*n,e[1]*n])},l=t.get(a.marker);if(!l||l.space!==e.space.id)continue;if(l.hidden&&!e.showHidden)continue;const d=H(e.space.rooms,l.marker?.room_id,$(R(a.points)),e.inRoom);r.push(I({strip:a,device:l,candidate:o.get(`${e.space.id}|${l.id}`)??null,hass:e.hass,glow:!!d&&e.glowFor(d),defaultRadius:s,cellCm:e.cellCm,gridPitch:e.gridPitch}))}const l=y/e.cellCm*e.gridPitch;return{views:r,faces:A(e.scene,l),d:e.iconPct/100*a(e.space),scene:e.scene,polygons:e.polygons}}const q=new WeakMap;function B(e){for(const t of q.get(e)?.frame.views??[])T.delete(t.strip);q.delete(e),L?.releaseLedField(e)}function S(e){return{shapes:q.get(e)?.frame.views.length??0,...L?.ledFieldStats(e)??{visibility:0,sources:0,visibilityPaths:0,pathChars:0,recomputes:0}}}function O(e,t,s){const o=t.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),i=o.length?e._lightBarriers(t,o.map(({room:e,poly:t})=>({r:e,poly:t}))):null,n=[t,e._renderDevices,e._renderPlanHass,s,i,e._mode,e._showAll],a=q.get(e);if(a&&a.key.every((e,t)=>e===n[t]))return a.frame;for(const e of a?.frame.views??[])T.delete(e.strip);const d=e._config?.icon_size??2.5,c=N({space:t,devices:e._renderDevices,hass:e._renderPlanHass,virtualLights:e._virtualLights,defaultColor:e._fillColors.glow_light.c,paletteAlpha:e._fillColors.glow_light.a,cellCm:e._cellCm,gridPitch:e._gridPitch,iconPct:d>8?2.5:d,scene:i,polygons:o,glowFor:e=>l(s,e),inRoom:(t,s)=>e._pointInRoom(t,s),showHidden:"devices"===e._mode&&e._showAll});return!1!==e.isConnected&&q.set(e,{key:n,frame:c}),c}function W(e,t,s,o){const i=O(e,t,s),n=e._stageEl?.clientWidth,a="iso"===e._renderProjection&&"view"===e._mode,r=a?i.d*c:i.d,l="theme-dark"===p(e._renderPlanHass)?"dark":"light",m=!!e._isoLightFloors?.size,v=u(l,m),g=G({views:i.views,d:r,iso:a?{lift:f.lift*r,depth:f.depth*r,edge:h(E,l,m),shadow:{dx:v.dx*r,dy:v.dy*r,sigma:v.sigma*r,opacity:v.opacityWhite}}:null,faces:i.faces,perUnit:n&&o.w?n/o.w:1,handlers:"view"===e._mode?{click:(t,s)=>e._clickDevice(t,s),keydown:(t,s)=>e._keyDevice(t,s),contextmenu:(t,s)=>e._ctxDevice(t,s),pointerdown:(t,s)=>e._pointerDown(t,s),pointermove:(t,s)=>{const o=e._pointerMove(t,s);o&&e._showDeviceTip(t,o)},pointerup:(t,s)=>e._pointerUp(t,s),pointercancel:(t,s)=>e._pointerCancel(t,s),pointerover:(t,s)=>e._showDeviceTip(t,s),pointerleave:()=>e._clearPointerHover(),focus:(t,s)=>e._showDeviceFocusTip(t,s),blur:t=>e._hideDeviceFocusTip(t.id),label:e=>e.name}:null});return"plan"===e._mode||"decor"===e._mode?d`<g class="led-passive" opacity="0.45" pointer-events="none">${g}</g>`:g}function z(e,t,s){if(!1===e.isConnected)return d``;const o=O(e,t,s),i=o.scene&&(D(o.views)||L?.hasLedField(e))?L||x(t.id,()=>!1!==e.isConnected&&e.requestUpdate()):null;return i?i.renderLedField({views:o.views,scene:o.scene,polygons:o.polygons,faces:o.faces,spaceId:t.id,owner:e,requestUpdate:()=>e.requestUpdate(),isConnected:()=>!1!==e.isConnected}):d``}function Y(e){const t=e.space.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),s=N({space:e.space,devices:e.devices,hass:e.hass,virtualLights:e.virtualLights,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,cellCm:e.cellCm,gridPitch:e.gridPitch,iconPct:e.iconPct,scene:e.scene,polygons:t,glowFor:e.glowFor,inRoom:e.inRoom,showHidden:!1}),o=e.live?s.views:s.views.map(e=>({...e,state:"off",appearance:null,glow:!1})),i=A({masonryGeometry:e.bodies.masonryGeometry,opaqueBodies:e.bodies.opaqueBodies},y/e.cellCm*e.gridPitch),n=e.isConnected()&&e.scene&&e.live&&(D(o)||L?.hasLedField(e.owner))?x(e.space.id,()=>e.isConnected()&&e.ready()):null;return n||L?.releaseLedField(e.owner),d`${n?n.renderLedField({views:o,scene:e.scene,polygons:t,faces:i,spaceId:e.space.id,owner:e.owner,requestUpdate:e.ready,isConnected:e.isConnected}):m}${G({views:o,d:s.d,faces:i,perUnit:e.perUnit,handlers:null})}`}export{M as LED_RUNTIME_FINGERPRINT,A as faceContext,x as ledField,N as ledFrame,O as ledFrameFor,S as ledStats,I as ledStripView,j as ledStripePath,B as releaseLed,z as renderLedFieldFor,W as renderLedLayerFor,G as renderLedStripes,Y as renderStaticLed,H as stripRoom};
|
||||
+1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";const t=t=>[t.left,t.top,t.right,t.bottom,t.width,t.height].every(Number.isFinite)&&t.right>=t.left&&t.bottom>=t.top&&t.width>=0&&t.height>=0;function o(o){const{preferred:e,size:i,bounds:h,blockers:r,gap:f=8,edge:n=8}=o;if(![e.x,e.y,i.width,i.height,f,n].every(Number.isFinite)||i.width<=0||i.height<=0||f<0||n<0||!t(h)||r.some(o=>!t(o)))return null;const s=h.left+n,d=h.right-n-i.width,l=h.top+n,a=h.bottom-n-i.height;if(![s,d,l,a].every(Number.isFinite)||d<s||a<l)return null;const b=r.filter(t=>t.right>t.left&&t.bottom>t.top).map(t=>({left:t.left-f-i.width,right:t.right+f,top:t.top-f-i.height,bottom:t.bottom+f})),g=(t,o,e)=>Math.max(o,Math.min(e,t)),m=new Set([s,d,g(e.x,s,d)]),p=new Set([l,a,g(e.y,l,a)]);for(const t of b)m.add(g(t.left,s,d)),m.add(g(t.right,s,d)),p.add(g(t.top,l,a)),p.add(g(t.bottom,l,a));const c=[...m].sort((t,o)=>t-o),u=[...p].sort((t,o)=>t-o);let w=null,y=1/0;for(const t of u)for(const o of c){if(b.some(e=>o>e.left&&o<e.right&&t>e.top&&t<e.bottom))continue;const i=Math.hypot(o-e.x,t-e.y);(!w||i<y)&&(w={left:o,top:t},y=i)}return w}export{o as p};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{eR as a,eS as e,eG as n}from"./houseplan-card-pPShiPsn.js";function c(n,c){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:c.ru},{code:"de",loadDictionary:c.de},{code:"fr",loadDictionary:c.fr}],"dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",console.warn,e)}function d(a){return function(a,e){return{state:n=>{const c=a.state(n);return"pending"!==c&&e.some(a=>"pending"===a.state(n))?"pending":c},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{c as n,d as s};
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{eR as a,eS as e,eG as n}from"./houseplan-card-BOhGeQlv.js";function o(n,o){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:o.ru},{code:"de",loadDictionary:o.de},{code:"fr",loadDictionary:o.fr}],"2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",console.warn,e)}function r(a){return function(a,e){return{state:n=>{const o=a.state(n);return"pending"!==o&&e.some(a=>"pending"===a.state(n))?"pending":o},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{o as n,r as s};
|
||||
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,6 +1,6 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{aG as e,l as t,aJ as s,A as a,eF as o,eG as i,eH as n,E as c,eQ as l,c as r}from"./houseplan-card-pPShiPsn.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!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}))}catch{this._spaces=[]}finally{this._spacesLoading=!1}}}get _lang(){return t(this.hass,this._config?.language)}get _schema(){const e=this._spaces||[];return[e.length?{name:"space",selector:{select:{mode:"dropdown",options:e}}}:{name:"space",selector:{text:{}}},{name:"title",selector:{text:{}}},{name:"fit",selector:{select:{mode:"dropdown",options:[{value:"content",label:s(this._lang,"editor.fit_content")},{value:"house",label:s(this._lang,"editor.fit_house")}]}}},{name:"show_button",selector:{boolean:{}}},{name:"button_label",selector:{text:{}}},{name:"button_target",selector:{text:{}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"light_pools",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}}]}render(){if(!this.hass||!this._config)return a;const e=o(this,i,t(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return c;this._loadSpaces();const h=this._lang,_={space:s(h,"editor.space"),title:s(h,"editor.title"),fit:s(h,"editor.framing"),show_button:s(h,"editor.show_button"),button_label:s(h,"editor.button_label"),button_target:s(h,"editor.button_target"),icon_size:s(h,"editor.icon_size"),show_temperature:s(h,"editor.show_temperature"),live_states:s(h,"editor.live_states"),light_pools:s(h,"editor.light_pools"),show_signal:s(h,"editor.show_signal")};return r`<ha-form
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{aG as e,l as t,aJ as s,A as a,eF as o,eG as i,eH as n,E as l,eQ as c,c as r}from"./houseplan-card-BOhGeQlv.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!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}))}catch{this._spaces=[]}finally{this._spacesLoading=!1}}}get _lang(){return t(this.hass,this._config?.language)}get _schema(){const e=this._spaces||[];return[e.length?{name:"space",selector:{select:{mode:"dropdown",options:e}}}:{name:"space",selector:{text:{}}},{name:"title",selector:{text:{}}},{name:"fit",selector:{select:{mode:"dropdown",options:[{value:"content",label:s(this._lang,"editor.fit_content")},{value:"house",label:s(this._lang,"editor.fit_house")}]}}},{name:"show_button",selector:{boolean:{}}},{name:"button_label",selector:{text:{}}},{name:"button_target",selector:{text:{}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"light_pools",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}}]}render(){if(!this.hass||!this._config)return a;const e=o(this,i,t(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return l;this._loadSpaces();const h=this._lang,_={space:s(h,"editor.space"),title:s(h,"editor.title"),fit:s(h,"editor.framing"),show_button:s(h,"editor.show_button"),button_label:s(h,"editor.button_label"),button_target:s(h,"editor.button_target"),icon_size:s(h,"editor.icon_size"),show_temperature:s(h,"editor.show_temperature"),live_states:s(h,"editor.live_states"),light_pools:s(h,"editor.light_pools"),show_signal:s(h,"editor.show_signal")};return r`<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{...this._config,fit:l(this._config.fit)}}
|
||||
.data=${{...this._config,fit:c(this._config.fit)}}
|
||||
.schema=${this._schema}
|
||||
.computeLabel=${e=>_[e.name]||e.name}
|
||||
@value-changed=${this._valueChanged}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{c as a,A as s}from"./houseplan-card-pPShiPsn.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-C4YDg3Cx.js";import"./form-kit.styles-BC5W6ya6.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{c as a,A as s}from"./houseplan-card-BOhGeQlv.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-Gm80_eMo.js";import"./form-kit.styles-BXaoYN6g.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
|
||||
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
|
||||
<input id="summary-local-show" data-summary-local-show type="checkbox"
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{e$ as e,O as t,b5 as n,M as i,af as o,ad as r,cf as s,f0 as a,ce as c,b4 as l,b3 as d,b6 as u,f1 as f,f2 as m,ch as g,f3 as v}from"./houseplan-card-pPShiPsn.js";function y(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function _(e,t){return e?.length?t?.length?v(e,t):e:t}function h(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:d(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*p(l,d,u=h){try{let f=0;for(const m of d){const d=l.spaces.find(e=>String(e?.id)===m.id);if(!d)continue;const g=e(d,m),v=u(m,g);let y=null;for(const e of m.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(m.rooms,e.id,g.walls,g.openCuts,i,g.cellCm,o,r,v.roomGeom,v.multiWallNodes)||a;y=_(y,s(c,g.physicalBodies)),yield}const h=a(y||[],m.stairs);let p=h.next();for(;!p.done;)yield,p=h.next();y=p.value;const b=g.cellCm/o;f+=c(y)*b*b/1e4}return f}catch{return null}}function b(e,t,n=h){const i=p(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function S(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:g(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function C(e,t){const n=e?.states?.[t];if(!n)return null;const i=f(e,t);return i?m(i,String(n.attributes?.unit_of_measurement||"")):null}export{p as cleanFloorAreaSteps,y as representedHaDeviceIds,h as spaceWallGeometry,C as summaryEntityValue,S as summarySystemValue,b as totalCleanFloorAreaM2};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{e$ as e,O as t,b5 as n,M as i,af as o,ad as r,cf as s,f0 as a,ce as l,b4 as c,b3 as d,b6 as u,f1 as f,f2 as m,ch as g,f3 as v}from"./houseplan-card-BOhGeQlv.js";function y(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,d="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function _(e,t){return e?.length?t?.length?v(e,t):e:t}function h(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:d(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*p(c,d,u=h){try{let f=0;for(const m of d){const d=c.spaces.find(e=>String(e?.id)===m.id);if(!d)continue;const g=e(d,m),v=u(m,g);let y=null;for(const e of m.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const l=n(m.rooms,e.id,g.walls,g.openCuts,i,g.cellCm,o,r,v.roomGeom,v.multiWallNodes)||a;y=_(y,s(l,g.physicalBodies)),yield}const h=a(y||[],m.stairs);let p=h.next();for(;!p.done;)yield,p=h.next();y=p.value;const b=g.cellCm/o;f+=l(y)*b*b/1e4}return f}catch{return null}}function b(e,t,n=h){const i=p(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function S(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:g(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function C(e,t){const n=e?.states?.[t];if(!n)return null;const i=f(e,t);return i?m(i,String(n.attributes?.unit_of_measurement||"")):null}export{p as cleanFloorAreaSteps,y as representedHaDeviceIds,h as spaceWallGeometry,C as summaryEntityValue,S as summarySystemValue,b as totalCleanFloorAreaM2};
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_computer":"Computer","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_exercise":"Fitnessgerät","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_hood":"Dunstabzugshaube","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_oven":"Backofen","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_exercise":"Fitnessgerät","furn.sym_computer":"Computer","furn.sym_hood":"Dunstabzugshaube","furn.sym_oven":"Backofen","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich"};const r="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,r as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_computer":"Computer","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_exercise":"Fitnessgerät","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_hood":"Dunstabzugshaube","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_oven":"Backofen","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_exercise":"Fitnessgerät","furn.sym_computer":"Computer","furn.sym_hood":"Dunstabzugshaube","furn.sym_oven":"Backofen","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich"};const r="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,r as fingerprint};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_computer":"Ordinateur","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_exercise":"Équipement de sport","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_hood":"Hotte","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_oven":"Four","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_exercise":"Équipement de sport","furn.sym_computer":"Ordinateur","furn.sym_hood":"Hotte","furn.sym_oven":"Four","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis"};const r="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,r as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_computer":"Ordinateur","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_exercise":"Équipement de sport","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_hood":"Hotte","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_oven":"Four","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_exercise":"Équipement de sport","furn.sym_computer":"Ordinateur","furn.sym_hood":"Hotte","furn.sym_oven":"Four","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis"};const r="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,r as fingerprint};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Zeigt Eltern und nächste Hops laut Integration. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt den Elternknoten eines Endgeräts oder den aktiven nächsten Hop eines Routers zum Koordinator laut Integration. Es gibt höchstens einen ausgehenden Pfeil; eingehende Pfeile zeigen Geräte, die über diesen Knoten routen. Gewöhnliche Nachbarn werden ausgeblendet. Alle Linien sind durchgezogen. Linie und Pfeil verwenden LQI 0–255: rot bei 0, gelb bei 128, grün bei 255. Ohne LQI sind sie grau mit schwarzer Kontur. Eine Beschriftung am Pfeilende nennt ein Ziel in einem anderen Bereich oder außerhalb des Plans. Keine Routendaten bedeutet fehlende eindeutige Angaben, nicht dass das Gerät offline ist. Dies sind zuletzt empfangene Integrationsdaten, keine Live-Paketverfolgung oder Garantie des gesamten Pfads. Der ZHA-Cache kann beim Lesen bereits alt sein; veraltete und unvollständige Daten werden markiert. Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan mit Routen kann länger als 10 Minuten dauern. House Plan wartet im Hintergrund weiter. Der Scan kann Zigbee vorübergehend verlangsamen.",scan_connecting:"Verbindung zu Zigbee2MQTT wird hergestellt",scan_waiting:"Warten auf die Karte von Zigbee2MQTT",scan_elapsed:"Vergangen: {time}",scan_background_hint:"Du kannst die Einstellungen schließen — das Warten wird im Hintergrund fortgesetzt.",scan_long_wait:"Zigbee2MQTT hat noch nicht geantwortet. Das Warten wird fortgesetzt.",scan_cancel:"Anfrage abbrechen",scan_cancel_hint:"Nur das Warten von House Plan wird beendet. Zigbee2MQTT kann den Scan fortsetzen.",scan_cancelled:"Warten abgebrochen. Der Scan von Zigbee2MQTT ist möglicherweise noch nicht beendet.",scan_backend_required:"Aktualisieren Sie die House-Plan-Integration und starten Sie Home Assistant neu, um Kartenscans im Hintergrund zu nutzen.",scan_connection_lost:"Die MQTT-Verbindung wurde unterbrochen; das Ergebnis ist möglicherweise nicht angekommen. Das Warten wurde beendet, Zigbee2MQTT scannt möglicherweise weiter.",scan_frontend_disconnected:"Die Verbindung zu Home Assistant wurde unterbrochen. Das Warten wird im Hintergrund fortgesetzt. Stelle die Verbindung wieder her, um den Status zu sehen.",scan_unavailable:"MQTT ist in Home Assistant nicht verfügbar oder wird nicht unterstützt.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · unvollständige Daten",status_no_links:"Empfangen: {time} · keine bestätigten Routen",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich",route_other_space_named:"{space} ({name})",route_device_not_on_plan_named:"Gerät ist nicht im Plan ({name})",route_unknown:"Keine Routendaten",route_stale:"Veraltete Daten",route_partial:"Unvollständige Daten",status_cache:"Integrationscache; Zeitpunkt des Funkscans unbekannt"};const n="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,n as fingerprint};
|
||||
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Zeigt Eltern und nächste Hops laut Integration. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt den Elternknoten eines Endgeräts oder den aktiven nächsten Hop eines Routers zum Koordinator laut Integration. Es gibt höchstens einen ausgehenden Pfeil; eingehende Pfeile zeigen Geräte, die über diesen Knoten routen. Gewöhnliche Nachbarn werden ausgeblendet. Alle Linien sind durchgezogen. Linie und Pfeil verwenden LQI 0–255: rot bei 0, gelb bei 128, grün bei 255. Ohne LQI sind sie grau mit schwarzer Kontur. Eine Beschriftung am Pfeilende nennt ein Ziel in einem anderen Bereich oder außerhalb des Plans. Keine Routendaten bedeutet fehlende eindeutige Angaben, nicht dass das Gerät offline ist. Dies sind zuletzt empfangene Integrationsdaten, keine Live-Paketverfolgung oder Garantie des gesamten Pfads. Der ZHA-Cache kann beim Lesen bereits alt sein; veraltete und unvollständige Daten werden markiert. Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · unvollständige Daten",status_no_links:"Empfangen: {time} · keine bestätigten Routen",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich",route_device_not_on_plan_named:"Gerät ist nicht im Plan ({name})",route_unknown:"Keine Routendaten",route_stale:"Veraltete Daten",route_partial:"Unvollständige Daten",status_cache:"Integrationscache; Zeitpunkt des Funkscans unbekannt"};const n="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,n as fingerprint};
|
||||
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Affiche les parents et prochains sauts signalés par l’intégration. Le survol ne lance aucune requête.",help:"Affiche le parent d’un appareil terminal ou le prochain saut actif d’un routeur vers le coordinateur selon l’intégration. Il y a au plus une flèche sortante ; les flèches entrantes indiquent les appareils passant par ce nœud. Les simples voisins sont masqués. Toutes les lignes sont continues. Ligne et flèche utilisent le LQI 0–255 : rouge à 0, jaune à 128, vert à 255. Sans LQI, elles sont grises avec un contour noir. Une étiquette au bout de la flèche nomme une cible dans un autre espace ou absente du plan. Aucune donnée de route indique l’absence d’information univoque, pas un appareil hors ligne. Il s’agit des derniers relevés de l’intégration, pas du trajet des paquets en direct ni d’une garantie du chemin entier. Le cache ZHA peut déjà être ancien à la lecture ; les données anciennes et incomplètes sont signalées. Les liens ne sont visibles qu’à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · données incomplètes",status_no_links:"Reçu : {time} · aucune route confirmée",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace",route_device_not_on_plan_named:"Appareil absent du plan ({name})",route_unknown:"Aucune donnée de route",route_stale:"Données anciennes",route_partial:"Données incomplètes",status_cache:"Cache de l’intégration ; date de l’analyse radio inconnue"};const n="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,n as fingerprint};
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Affiche les parents et prochains sauts signalés par l’intégration. Le survol ne lance aucune requête.",help:"Affiche le parent d’un appareil terminal ou le prochain saut actif d’un routeur vers le coordinateur selon l’intégration. Il y a au plus une flèche sortante ; les flèches entrantes indiquent les appareils passant par ce nœud. Les simples voisins sont masqués. Toutes les lignes sont continues. Ligne et flèche utilisent le LQI 0–255 : rouge à 0, jaune à 128, vert à 255. Sans LQI, elles sont grises avec un contour noir. Une étiquette au bout de la flèche nomme une cible dans un autre espace ou absente du plan. Aucune donnée de route indique l’absence d’information univoque, pas un appareil hors ligne. Il s’agit des derniers relevés de l’intégration, pas du trajet des paquets en direct ni d’une garantie du chemin entier. Le cache ZHA peut déjà être ancien à la lecture ; les données anciennes et incomplètes sont signalées. Les liens ne sont visibles qu’à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau avec les routes peut prendre plus de 10 minutes. House Plan continue d’attendre en arrière-plan. L’analyse peut réduire temporairement la réactivité de Zigbee.",scan_connecting:"Connexion à Zigbee2MQTT",scan_waiting:"En attente de la carte de Zigbee2MQTT",scan_elapsed:"Temps écoulé : {time}",scan_background_hint:"Vous pouvez fermer les réglages — l’attente continuera en arrière-plan.",scan_long_wait:"Zigbee2MQTT n’a pas encore répondu. L’attente continue.",scan_cancel:"Annuler la demande",scan_cancel_hint:"Seule l’attente de House Plan est annulée. L’analyse de Zigbee2MQTT peut continuer.",scan_cancelled:"Attente annulée. L’analyse de Zigbee2MQTT n’est peut-être pas encore terminée.",scan_backend_required:"Mettez à jour l’intégration House Plan et redémarrez Home Assistant pour utiliser les analyses de carte en arrière-plan.",scan_connection_lost:"La connexion MQTT a été perdue ; le résultat n’est peut-être pas arrivé. L’attente est terminée, mais Zigbee2MQTT peut encore analyser le réseau.",scan_frontend_disconnected:"La connexion à Home Assistant a été interrompue. L’attente continue en arrière-plan. Reconnectez-vous pour retrouver l’état de la demande.",scan_unavailable:"MQTT n’est pas disponible ou n’est pas pris en charge dans Home Assistant.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · données incomplètes",status_no_links:"Reçu : {time} · aucune route confirmée",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace",route_other_space_named:"{space} ({name})",route_device_not_on_plan_named:"Appareil absent du plan ({name})",route_unknown:"Aucune donnée de route",route_stale:"Données anciennes",route_partial:"Données incomplètes",status_cache:"Cache de l’intégration ; date de l’analyse radio inconnue"};const n="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,n as fingerprint};
|
||||
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var a={title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются родители и следующие узлы по сведениям интеграции. Наведение ничего не запрашивает.",help:"Показывает родителя конечного устройства или активный следующий узел роутера к координатору по данным интеграции. Исходящая стрелка не более одной, входящие — устройства, идущие через этот узел. Обычные соседи скрыты. Все линии сплошные. Цвет линии и стрелки — LQI 0–255: красный при 0, жёлтый при 128, зелёный при 255. Без LQI они серые с чёрной обводкой. Подпись на конце стрелки указывает цель на другом пространстве или не на плане. «Нет данных о маршруте» означает отсутствие однозначных сведений об исходящем маршруте, а не недоступность устройства. Это последние записи интеграции, не путь пакета в реальном времени и не гарантия всей цепочки. Кеш ZHA может быть старым уже при чтении; устаревшие и неполные данные отмечаются. Связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · неполные данные",status_no_links:"Получено: {time} · подтверждённые маршруты не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"Устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство",route_device_not_on_plan_named:"Устройства нет на плане ({name})",route_unknown:"Нет данных о маршруте",route_stale:"Данные устарели",route_partial:"Неполные данные",status_cache:"Кеш интеграции; время радиосканирования неизвестно"};const e="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{a as dictionary,e as fingerprint};
|
||||
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
File diff suppressed because one or more lines are too long
-1
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{n as t,d as n,e}from"./zigbee-topology-Cs-828J3.js";import{aP as o}from"./houseplan-card-pPShiPsn.js";import"./namespace-language-Cj9GZ2Dl.js";const i=new WeakMap;function r(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=i.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},i.set(n,e)),e}function a(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function c(t){return Object.assign(new Error(t),{code:t})}function l(t,n,e){const o=t.inflight.get(n);if(o)return o;const i=t.states[n],r=void 0===i?.obtainedAt?{}:{obtainedAt:i.obtainedAt,partial:i.partial,stale:i.stale};a(t,n,{...r,phase:"loading"});const l=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw c("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],a(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{a(t,n,{...r,...void 0===r.obtainedAt?{}:{stale:!0},phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,l),l}function u(t){const n=r(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function f(t,n){const e=r(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function p(t){if(!0!==t?.user?.is_admin)throw c("permission")}function d(n){const e=r(n);return e?l(e,"zha",async()=>{if(p(n),"function"!=typeof n?.callWS)throw c("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function h(t){return null!==t&&"object"==typeof t?t:null}function m(t){const n=h(t),o=n?.payload??t;if("string"!=typeof o)return o;if(o.length>e)return null;try{return JSON.parse(o)}catch{return null}}async function g(t,n){if(n<=0)throw t.catch(()=>{}),c("timeout");let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(c("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function w(t,e,i=15e4){const a=r(t);if(!a)return Promise.resolve();const s=o(e);return l(a,`z2m:${s||String(e)}`,async()=>{if(p(t),!s)throw c("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw c("unsupported");const r=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),a=Date.now()+Math.max(1,i);let l=!1,u=!1,f=null,d=null,w=null;const y=new Promise(t=>{f=t}),b=new Promise((t,n)=>{d=t,w=n});b.catch(()=>{});const v=[],_=t=>{try{t()}catch{}},S=()=>!l&&Date.now()<a,P=async(t,n)=>{if(!S())throw c("timeout");const i=o.call(e,n,{type:"mqtt/subscribe",topic:`${s}/${t}`}).then(t=>{"function"==typeof t&&(l?_(t):v.push(t))});await g(i,a-Date.now())};try{if(await P("bridge/info",t=>{S()&&!0===h(t)?.retain&&m(t)&&f?.()}),await P("bridge/response/networkmap",t=>{if(!S()||!u||!0===h(t)?.retain)return;const n=m(t);null!==n?n&&function(t){const n=h(t),e=n?.transaction??h(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===r&&d?.(n):w?.(c("invalid_payload"))}),await g(y,Math.min(4e3,a-Date.now())),!S())throw c("timeout");u=!0;const e=t.callService("mqtt","publish",{topic:`${s}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!0,transaction:r}),qos:0,retain:!1}),[,o]=await g(Promise.all([e,b]),a-Date.now());if(!S())throw c("timeout");const i=h(o)?.status;if(i&&"ok"!==i)throw c("provider");return n(o,s)}finally{l=!0,u=!1;for(const t of v)_(t)}})}export{d as readZhaTopology,w as refreshZ2mTopology,f as subscribeZigbeeTopology,u as zigbeeTopologyRuntimeSnapshot};
|
||||
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";try{await import("./houseplan-assets/houseplan-card-pPShiPsn.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 houseplan-card.js: the implementation chunk is unavailable",e)}
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";try{await import("./houseplan-assets/houseplan-card-BOhGeQlv.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 houseplan-card.js: the implementation chunk is unavailable",e)}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -2,7 +2,8 @@
|
||||
"domain": "houseplan",
|
||||
"name": "House Plan",
|
||||
"after_dependencies": [
|
||||
"lovelace"
|
||||
"lovelace",
|
||||
"mqtt"
|
||||
],
|
||||
"codeowners": [
|
||||
"@Matysh"
|
||||
@@ -20,5 +21,5 @@
|
||||
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
||||
"requirements": [],
|
||||
"single_config_entry": true,
|
||||
"version": "1.80.0-beta.1"
|
||||
"version": "1.80.0-beta.4"
|
||||
}
|
||||
|
||||
@@ -112,6 +112,8 @@ class HouseplanData:
|
||||
junction_baseline: tuple[int, dict[str, dict[str, int]]] | None = None
|
||||
# Runtime-only #485 authority; never serialized by HouseplanStore.
|
||||
radar_coordinator: Any | None = None
|
||||
# #800: MQTT jobs and last-good maps live only for this loaded entry.
|
||||
zigbee_coordinator: Any | None = None
|
||||
|
||||
|
||||
HouseplanConfigEntry = ConfigEntry[HouseplanData]
|
||||
|
||||
@@ -258,6 +258,7 @@ async def _resolved_write_pair(
|
||||
def async_register(hass: HomeAssistant) -> None:
|
||||
"""Register the WS commands."""
|
||||
from .radar_websocket import async_register as async_register_radar
|
||||
from .zigbee_websocket import async_register as async_register_zigbee
|
||||
|
||||
websocket_api.async_register_command(hass, ws_layout_get)
|
||||
websocket_api.async_register_command(hass, ws_trail_get)
|
||||
@@ -288,6 +289,7 @@ def async_register(hass: HomeAssistant) -> None:
|
||||
websocket_api.async_register_command(hass, ws_support_preview_discard)
|
||||
websocket_api.async_register_command(hass, ws_support_submit)
|
||||
async_register_radar(hass)
|
||||
async_register_zigbee(hass)
|
||||
|
||||
|
||||
def _runtime(hass: HomeAssistant, connection, msg_id: int) -> HouseplanData | None:
|
||||
@@ -1481,6 +1483,8 @@ async def ws_config_get(hass: HomeAssistant, connection, msg: dict[str, Any]) ->
|
||||
"decor_assets_api": DECOR_ASSETS_API_VERSION,
|
||||
"summary_panel_api": SUMMARY_PANEL_API_VERSION,
|
||||
**({"radar_stage1_api": 1} if rt.radar_coordinator is not None else {}),
|
||||
**({"zigbee_scan_api": 1} if rt.zigbee_coordinator is not None
|
||||
and not rt.zigbee_coordinator.closed else {}),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,441 @@
|
||||
"""Bounded, entry-owned Zigbee2MQTT requests; never a polling radio scanner."""
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
import math
|
||||
import re
|
||||
from collections.abc import Awaitable, Callable
|
||||
from dataclasses import dataclass, field
|
||||
from time import monotonic, time
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
|
||||
from homeassistant.components import mqtt
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
||||
MAX_TOPICS = 8
|
||||
MAX_LISTENERS = 32
|
||||
MAX_PAYLOAD_BYTES = 2 * 1024 * 1024
|
||||
MAX_NODES = 1000
|
||||
MAX_LINKS = 6000
|
||||
CANCEL_AFTER_MS = 600_000
|
||||
TRANSPORT_TIMEOUT = 10.0
|
||||
INFO_TIMEOUT = 4.0
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ZigbeeScanError(Exception):
|
||||
"""A stable, already localized WebSocket command refusal."""
|
||||
|
||||
def __init__(self, code: str) -> None:
|
||||
super().__init__(code)
|
||||
self.code = code
|
||||
|
||||
|
||||
def normalize_base_topic(value: object) -> str:
|
||||
"""Match the frontend's exact-topic normalization, without a saved-topic gate."""
|
||||
if not isinstance(value, str):
|
||||
raise ZigbeeScanError("invalid_data")
|
||||
topic = re.sub(r"/{2,}", "/", value.strip().strip("/"))
|
||||
# JS counts UTF-16 code units; reject lone surrogates as invalid MQTT UTF-8.
|
||||
try:
|
||||
length = len(topic.encode("utf-16-le")) // 2
|
||||
topic.encode("utf-8")
|
||||
except UnicodeError as err:
|
||||
raise ZigbeeScanError("invalid_data") from err
|
||||
if not topic or length > 180 or re.search(r"[#+\x00-\x1f\x7f]", topic):
|
||||
raise ZigbeeScanError("invalid_data")
|
||||
return topic
|
||||
|
||||
|
||||
def _parse_payload(payload: object) -> dict[str, Any] | None:
|
||||
"""Bound bytes before decoding; uncorrelatable garbage must not end a job."""
|
||||
try:
|
||||
if isinstance(payload, str):
|
||||
payload = payload.encode("utf-8")
|
||||
if not isinstance(payload, bytes) or len(payload) > MAX_PAYLOAD_BYTES:
|
||||
return None
|
||||
value = json.loads(payload)
|
||||
if not isinstance(value, dict):
|
||||
return None
|
||||
pending = [(value, 0)]
|
||||
inspected = 0
|
||||
while pending:
|
||||
item, depth = pending.pop()
|
||||
inspected += 1
|
||||
if depth > 32 or inspected > 100_000:
|
||||
return None
|
||||
if isinstance(item, dict):
|
||||
pending.extend((child, depth + 1) for child in item.values())
|
||||
elif isinstance(item, list):
|
||||
pending.extend((child, depth + 1) for child in item)
|
||||
elif isinstance(item, float) and not math.isfinite(item):
|
||||
return None
|
||||
return value
|
||||
except (ValueError, UnicodeError, RecursionError):
|
||||
return None
|
||||
|
||||
|
||||
def _valid_map(message: dict[str, Any]) -> bool:
|
||||
"""Check the raw-map shape, not routing evidence (that remains TypeScript)."""
|
||||
data = message.get("data")
|
||||
value = data.get("value", data) if isinstance(data, dict) else data
|
||||
if value is None:
|
||||
value = message.get("value", message)
|
||||
if isinstance(value, str):
|
||||
value = _parse_payload(value)
|
||||
if not isinstance(value, dict):
|
||||
return False
|
||||
nodes, links = value.get("nodes"), value.get("links")
|
||||
if not isinstance(nodes, list) or len(nodes) > MAX_NODES:
|
||||
return False
|
||||
if not isinstance(links, list) or len(links) > MAX_LINKS:
|
||||
return False
|
||||
for node in nodes:
|
||||
if not isinstance(node, dict):
|
||||
return False
|
||||
ieee = node.get("ieeeAddr", node.get("ieee_address", node.get("ieee")))
|
||||
if not isinstance(ieee, str) or not re.fullmatch(
|
||||
r"(?:0x)?[0-9a-fA-F]{16}|(?:[0-9a-fA-F]{2}[:-]){7}[0-9a-fA-F]{2}", ieee,
|
||||
):
|
||||
return False
|
||||
routes_count = 0
|
||||
for link in links:
|
||||
if not isinstance(link, dict):
|
||||
return False
|
||||
for side in ("source", "target"):
|
||||
endpoint = link.get(f"{side}IeeeAddr", link.get(side))
|
||||
if isinstance(endpoint, bool) or not isinstance(endpoint, (dict, str, int)):
|
||||
return False
|
||||
if not endpoint and endpoint != 0:
|
||||
return False
|
||||
routes = link.get("routes", [])
|
||||
if not isinstance(routes, list) or any(not isinstance(route, dict) for route in routes):
|
||||
return False
|
||||
routes_count += len(routes)
|
||||
if routes_count > MAX_LINKS:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
@dataclass
|
||||
class _Job:
|
||||
topic: str
|
||||
job_id: str
|
||||
started_at: int
|
||||
started: float
|
||||
info: asyncio.Future[None]
|
||||
phase: str = "loading"
|
||||
stage: str = "connecting"
|
||||
finished: float | None = None
|
||||
error: str | None = None
|
||||
stale: bool = False
|
||||
result: dict[str, Any] | None = None
|
||||
obtained_at: int | None = None
|
||||
response_active: bool = False
|
||||
task: asyncio.Task[None] | None = None
|
||||
cleanups: list[Callable[[], None]] = field(default_factory=list)
|
||||
|
||||
|
||||
class ZigbeeScanCoordinator:
|
||||
"""One in-memory slot per topic, shared by all browsers of the HA entry."""
|
||||
|
||||
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
|
||||
self.hass = hass
|
||||
self.entry = entry
|
||||
self.session_id = str(uuid4())
|
||||
self.revision = 0
|
||||
self.closed = False
|
||||
self._jobs: dict[str, _Job] = {}
|
||||
self._listeners: set[Callable[[dict[str, Any]], None]] = set()
|
||||
self._operations: set[asyncio.Task] = set()
|
||||
|
||||
def _active(self, job: _Job) -> bool:
|
||||
return not self.closed and self._jobs.get(job.topic) is job and job.phase == "loading"
|
||||
|
||||
def _state(self, job: _Job) -> dict[str, Any]:
|
||||
provider: dict[str, Any] = {
|
||||
"topic": job.topic, "job_id": job.job_id, "phase": job.phase,
|
||||
"stage": job.stage, "started_at": job.started_at,
|
||||
"elapsed_ms": max(0, int(((job.finished if job.finished is not None else monotonic()) - job.started) * 1000)),
|
||||
"cancel_after_ms": CANCEL_AFTER_MS,
|
||||
}
|
||||
if job.error is not None:
|
||||
provider["error"] = job.error
|
||||
if job.result is not None:
|
||||
provider["result"] = job.result
|
||||
provider["obtained_at"] = job.obtained_at
|
||||
provider["stale"] = job.stale
|
||||
return {"kind": "state", "session_id": self.session_id,
|
||||
"revision": self.revision, "provider": provider}
|
||||
|
||||
def snapshot(self, topic: str) -> dict[str, Any]:
|
||||
"""Current public state; no MQTT work, no timestamp reset."""
|
||||
if self.closed:
|
||||
raise ZigbeeScanError("not_ready")
|
||||
job = self._jobs.get(normalize_base_topic(topic))
|
||||
if job is None:
|
||||
raise ZigbeeScanError("invalid_data")
|
||||
return self._state(job)
|
||||
|
||||
def initial_events(self) -> list[dict[str, Any]]:
|
||||
"""Bound each event to one map; never aggregate eight maps into one frame."""
|
||||
return [{"kind": "reset", "session_id": self.session_id,
|
||||
"revision": self.revision, "topics": list(self._jobs)},
|
||||
*(self._state(job) for job in self._jobs.values())]
|
||||
|
||||
def add_listener(self, listener: Callable[[dict[str, Any]], None]) -> Callable[[], None]:
|
||||
if self.closed:
|
||||
raise ZigbeeScanError("not_ready")
|
||||
if len(self._listeners) >= MAX_LISTENERS:
|
||||
raise ZigbeeScanError("capacity_exceeded")
|
||||
self._listeners.add(listener)
|
||||
return lambda: self._listeners.discard(listener)
|
||||
|
||||
def _emit(self, event: dict[str, Any]) -> None:
|
||||
for listener in tuple(self._listeners):
|
||||
try:
|
||||
listener(event)
|
||||
except Exception: # noqa: BLE001 - one disconnected UI must not interrupt a shared job
|
||||
self._listeners.discard(listener)
|
||||
|
||||
def _changed(self, job: _Job) -> None:
|
||||
self.revision += 1
|
||||
self._emit(self._state(job))
|
||||
|
||||
def start(self, base_topic: str) -> dict[str, Any]:
|
||||
"""Reserve before creating any task: concurrent WS clients join one job."""
|
||||
if self.closed:
|
||||
raise ZigbeeScanError("not_ready")
|
||||
topic = normalize_base_topic(base_topic)
|
||||
previous = self._jobs.get(topic)
|
||||
if previous is not None and previous.phase == "loading":
|
||||
return self._state(previous)
|
||||
# A transport which acknowledges cancellation late still owns a bounded
|
||||
# slot until its cleanup returns; repeated failed starts cannot grow it.
|
||||
if len(self._operations) >= MAX_TOPICS:
|
||||
raise ZigbeeScanError("capacity_exceeded")
|
||||
if previous is None and len(self._jobs) >= MAX_TOPICS:
|
||||
candidate = next((item for item in self._jobs.values() if item.phase != "loading"), None)
|
||||
if candidate is None:
|
||||
raise ZigbeeScanError("capacity_exceeded")
|
||||
del self._jobs[candidate.topic]
|
||||
self.revision += 1
|
||||
self._emit({"kind": "removed", "session_id": self.session_id,
|
||||
"revision": self.revision, "topic": candidate.topic})
|
||||
job = _Job(topic, f"houseplan-{uuid4()}", int(time() * 1000), monotonic(),
|
||||
self.hass.loop.create_future(),
|
||||
stale=previous.stale if previous else False,
|
||||
result=previous.result if previous else None,
|
||||
obtained_at=previous.obtained_at if previous else None)
|
||||
self._jobs.pop(topic, None)
|
||||
self._jobs[topic] = job
|
||||
job.task = self.entry.async_create_background_task(
|
||||
self.hass, self._run(job), "House Plan Zigbee map", eager_start=False,
|
||||
)
|
||||
self._changed(job)
|
||||
return self._state(job)
|
||||
|
||||
def cancel(self, base_topic: str, job_id: str) -> dict[str, Any]:
|
||||
if self.closed:
|
||||
raise ZigbeeScanError("not_ready")
|
||||
topic = normalize_base_topic(base_topic)
|
||||
job = self._jobs.get(topic)
|
||||
if job is None or job.job_id != job_id:
|
||||
raise ZigbeeScanError("conflict")
|
||||
# A repeated cancellation or a success/cancel race never rolls back a final state.
|
||||
if job.phase != "loading":
|
||||
return self._state(job)
|
||||
if (monotonic() - job.started) * 1000 < CANCEL_AFTER_MS:
|
||||
raise ZigbeeScanError("conflict")
|
||||
self._finish(job, "cancelled")
|
||||
return self._state(job)
|
||||
|
||||
@staticmethod
|
||||
def _cleanup(cleanup: Callable[[], None]) -> None:
|
||||
try:
|
||||
cleanup()
|
||||
except Exception: # noqa: BLE001 - cleanup remains idempotent across unload and transport failure
|
||||
_LOGGER.debug("House Plan Zigbee transport cleanup failed")
|
||||
|
||||
def _add_cleanup(self, job: _Job, cleanup: Callable[[], None]) -> None:
|
||||
if self._active(job):
|
||||
job.cleanups.append(cleanup)
|
||||
else:
|
||||
self._cleanup(cleanup)
|
||||
|
||||
def _release(self, job: _Job) -> None:
|
||||
job.response_active = False
|
||||
cleanups, job.cleanups = job.cleanups, []
|
||||
for cleanup in cleanups:
|
||||
self._cleanup(cleanup)
|
||||
if not job.info.done():
|
||||
job.info.cancel()
|
||||
|
||||
def _finish(self, job: _Job, phase: str, error: str | None = None,
|
||||
result: dict[str, Any] | None = None) -> None:
|
||||
if not self._active(job):
|
||||
return
|
||||
job.phase, job.error, job.finished = phase, error, monotonic()
|
||||
if result is not None:
|
||||
job.result, job.obtained_at = result, int(time() * 1000)
|
||||
job.stale = False
|
||||
elif job.result is not None:
|
||||
job.stale = True
|
||||
self._release(job)
|
||||
# Including when called synchronously inside publish: a terminal provider
|
||||
# reply must not wait another ten seconds for the publish acknowledgement.
|
||||
if job.task is not None and not job.task.done():
|
||||
job.task.cancel()
|
||||
self._changed(job)
|
||||
|
||||
async def _operation(self, job: _Job, action: Callable[[], Awaitable],
|
||||
seconds: float, *, subscription: bool = False):
|
||||
"""Bound transport even if a cancelled subscribe later returns an unsubscribe."""
|
||||
async def perform():
|
||||
result = await action()
|
||||
if subscription and callable(result):
|
||||
self._add_cleanup(job, result)
|
||||
return result
|
||||
|
||||
task = self.entry.async_create_background_task(
|
||||
self.hass, perform(), "House Plan Zigbee transport", eager_start=False,
|
||||
)
|
||||
self._operations.add(task)
|
||||
|
||||
@callback
|
||||
def settled(done: asyncio.Task) -> None:
|
||||
self._operations.discard(done)
|
||||
if not done.cancelled():
|
||||
done.exception() # consume a late transport exception after the job ended
|
||||
|
||||
task.add_done_callback(settled)
|
||||
try:
|
||||
done, _pending = await asyncio.wait({task}, timeout=max(0, seconds))
|
||||
if not done:
|
||||
raise TimeoutError
|
||||
return task.result()
|
||||
finally:
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
|
||||
async def _subscribe(self, job: _Job, topic: str, handler: Callable) -> None:
|
||||
deadline = self.hass.loop.time() + TRANSPORT_TIMEOUT
|
||||
await self._operation(job, lambda: mqtt.async_subscribe(
|
||||
self.hass, topic, handler, qos=0, encoding=None,
|
||||
), TRANSPORT_TIMEOUT, subscription=True)
|
||||
# Optional on the declared HA floor (2024.6). This acknowledges HA's
|
||||
# processing of subscriptions, not provider acceptance or radio progress.
|
||||
processed = getattr(mqtt, "async_on_subscribe_done", None)
|
||||
if callable(processed) and self._active(job):
|
||||
ready = self.hass.loop.create_future()
|
||||
|
||||
@callback
|
||||
def on_ready() -> None:
|
||||
if not ready.done():
|
||||
ready.set_result(None)
|
||||
|
||||
remove = processed(self.hass, topic, 0, on_ready)
|
||||
self._add_cleanup(job, remove)
|
||||
async with asyncio.timeout(max(0, deadline - self.hass.loop.time())):
|
||||
await ready
|
||||
|
||||
async def _run(self, job: _Job) -> None:
|
||||
try:
|
||||
if not mqtt.mqtt_config_entry_enabled(self.hass):
|
||||
self._finish(job, "error", "unsupported")
|
||||
return
|
||||
if not mqtt.is_connected(self.hass):
|
||||
self._finish(job, "error", "connection")
|
||||
return
|
||||
|
||||
@callback
|
||||
def connection_changed(connected: bool) -> None:
|
||||
if not connected:
|
||||
self._finish(job, "error", "connection")
|
||||
|
||||
self._add_cleanup(job, mqtt.async_subscribe_connection_status(
|
||||
self.hass, connection_changed,
|
||||
))
|
||||
response_topic = f"{job.topic}/bridge/response/networkmap"
|
||||
info_topic = f"{job.topic}/bridge/info"
|
||||
|
||||
@callback
|
||||
def receive_response(message) -> None:
|
||||
if (not self._active(job) or not job.response_active
|
||||
or message.topic != response_topic or message.retain):
|
||||
return
|
||||
value = _parse_payload(message.payload)
|
||||
if value is None:
|
||||
return
|
||||
data = value.get("data")
|
||||
transaction = value.get("transaction", data.get("transaction") if isinstance(data, dict) else None)
|
||||
if transaction != job.job_id:
|
||||
return
|
||||
if value.get("status") not in (None, "ok"):
|
||||
self._finish(job, "error", "provider")
|
||||
elif not _valid_map(value):
|
||||
self._finish(job, "error", "invalid_payload")
|
||||
else:
|
||||
self._finish(job, "ready", result=value)
|
||||
|
||||
@callback
|
||||
def receive_info(message) -> None:
|
||||
if (self._active(job) and message.topic == info_topic and message.retain
|
||||
and not job.info.done() and _parse_payload(message.payload) is not None):
|
||||
job.info.set_result(None)
|
||||
|
||||
# Response first also improves the old-HA retained-info preflight;
|
||||
# retained info alone is not claimed to be a strict broker SUBACK.
|
||||
await self._subscribe(job, response_topic, receive_response)
|
||||
await self._subscribe(job, info_topic, receive_info)
|
||||
async with asyncio.timeout(INFO_TIMEOUT):
|
||||
await job.info
|
||||
if not self._active(job):
|
||||
return
|
||||
job.response_active = True
|
||||
await self._operation(job, lambda: mqtt.async_publish(
|
||||
self.hass, f"{job.topic}/bridge/request/networkmap",
|
||||
json.dumps({"type": "raw", "routes": True, "transaction": job.job_id}),
|
||||
qos=0, retain=False,
|
||||
), TRANSPORT_TIMEOUT)
|
||||
if self._active(job):
|
||||
job.stage = "waiting"
|
||||
self._changed(job)
|
||||
# Only MQTT, explicit cancel, transport loss or entry teardown
|
||||
# ends this wait. 600 seconds is a cancel threshold, not a deadline.
|
||||
await self.hass.loop.create_future()
|
||||
except asyncio.CancelledError:
|
||||
if self._active(job):
|
||||
self._finish(job, "error", "connection")
|
||||
raise
|
||||
except TimeoutError:
|
||||
self._finish(job, "error", "timeout")
|
||||
except Exception: # noqa: BLE001 - contain optional MQTT errors without logging network payloads
|
||||
self._finish(job, "error", "connection")
|
||||
finally:
|
||||
self._release(job)
|
||||
|
||||
async def async_close(self) -> None:
|
||||
"""Stop entry-owned work, clear volatile maps, never restart a radio scan."""
|
||||
if self.closed:
|
||||
return
|
||||
self.closed = True
|
||||
# Reload does not disconnect HA WebSockets. Tell their observers that
|
||||
# this session and its volatile cache are gone before dropping them.
|
||||
self.revision += 1
|
||||
self._emit({"kind": "closed", "session_id": self.session_id,
|
||||
"revision": self.revision})
|
||||
tasks = [job.task for job in self._jobs.values() if job.task is not None]
|
||||
for job in self._jobs.values():
|
||||
self._release(job)
|
||||
for task in (*tasks, *self._operations):
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
if tasks:
|
||||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
self._jobs.clear()
|
||||
self._listeners.clear()
|
||||
@@ -0,0 +1,91 @@
|
||||
"""Admin-only WebSocket observers and explicit actions for background Z2M jobs."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
import voluptuous as vol
|
||||
from homeassistant.components import websocket_api
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
||||
from .store import get_data
|
||||
from .zigbee_topology import ZigbeeScanCoordinator, ZigbeeScanError
|
||||
|
||||
|
||||
def _coordinator(hass: HomeAssistant, connection, msg_id: int) -> ZigbeeScanCoordinator | None:
|
||||
runtime = get_data(hass)
|
||||
coordinator = getattr(runtime, "zigbee_coordinator", None)
|
||||
if not isinstance(coordinator, ZigbeeScanCoordinator) or coordinator.closed:
|
||||
connection.send_error(msg_id, "not_ready", "not_ready")
|
||||
return None
|
||||
return coordinator
|
||||
|
||||
|
||||
@callback
|
||||
def async_register(hass: HomeAssistant) -> None:
|
||||
websocket_api.async_register_command(hass, ws_zigbee_subscribe)
|
||||
websocket_api.async_register_command(hass, ws_zigbee_start)
|
||||
websocket_api.async_register_command(hass, ws_zigbee_cancel)
|
||||
|
||||
|
||||
@websocket_api.websocket_command({vol.Required("type"): "houseplan/zigbee/subscribe"})
|
||||
@websocket_api.require_admin
|
||||
def ws_zigbee_subscribe(hass: HomeAssistant, connection, msg: dict[str, Any]) -> None:
|
||||
coordinator = _coordinator(hass, connection, msg["id"])
|
||||
if coordinator is None:
|
||||
return
|
||||
|
||||
@callback
|
||||
def publish(event: dict[str, Any]) -> None:
|
||||
# Permission can be revoked during a long-lived browser session.
|
||||
if connection.user is None or not connection.user.is_admin:
|
||||
remove()
|
||||
connection.subscriptions.pop(msg["id"], None)
|
||||
return
|
||||
connection.send_event(msg["id"], event)
|
||||
|
||||
try:
|
||||
remove = coordinator.add_listener(publish)
|
||||
except ZigbeeScanError as err:
|
||||
connection.send_error(msg["id"], err.code, err.code)
|
||||
return
|
||||
# HA calls this on unsubscribe/disconnect. It never cancels the shared job.
|
||||
connection.subscriptions[msg["id"]] = remove
|
||||
connection.send_result(msg["id"], {"session_id": coordinator.session_id,
|
||||
"revision": coordinator.revision})
|
||||
for event in coordinator.initial_events():
|
||||
publish(event)
|
||||
|
||||
|
||||
@websocket_api.websocket_command({
|
||||
vol.Required("type"): "houseplan/zigbee/start",
|
||||
vol.Required("base_topic"): vol.All(str, vol.Length(min=1, max=1024)),
|
||||
})
|
||||
@websocket_api.require_admin
|
||||
def ws_zigbee_start(hass: HomeAssistant, connection, msg: dict[str, Any]) -> None:
|
||||
coordinator = _coordinator(hass, connection, msg["id"])
|
||||
if coordinator is None:
|
||||
return
|
||||
try:
|
||||
result = coordinator.start(msg["base_topic"])
|
||||
except ZigbeeScanError as err:
|
||||
connection.send_error(msg["id"], err.code, err.code)
|
||||
return
|
||||
connection.send_result(msg["id"], result)
|
||||
|
||||
|
||||
@websocket_api.websocket_command({
|
||||
vol.Required("type"): "houseplan/zigbee/cancel",
|
||||
vol.Required("base_topic"): vol.All(str, vol.Length(min=1, max=1024)),
|
||||
vol.Required("job_id"): vol.All(str, vol.Length(min=1, max=80)),
|
||||
})
|
||||
@websocket_api.require_admin
|
||||
def ws_zigbee_cancel(hass: HomeAssistant, connection, msg: dict[str, Any]) -> None:
|
||||
coordinator = _coordinator(hass, connection, msg["id"])
|
||||
if coordinator is None:
|
||||
return
|
||||
try:
|
||||
result = coordinator.cancel(msg["base_topic"], msg["job_id"])
|
||||
except ZigbeeScanError as err:
|
||||
connection.send_error(msg["id"], err.code, err.code)
|
||||
return
|
||||
connection.send_result(msg["id"], result)
|
||||
@@ -129,7 +129,9 @@ const result = await page.evaluate(async () => {
|
||||
|
||||
root().querySelector('.dev').dispatchEvent(mouse('pointermove', 200, 200));
|
||||
await card.updateComplete;
|
||||
out.deviceTipSurvives = card._tip?.room === false && !!root().querySelector('.tip');
|
||||
const deviceTip = root().querySelector('.tip');
|
||||
out.deviceTipSurvives = card._tip?.room === false && !!deviceTip && !deviceTip.hidden
|
||||
&& deviceTip.textContent.includes(card._tip.title);
|
||||
|
||||
card._openSettingsDialog();
|
||||
out.reopenShowsOff = card._settingsDialog?.showRoomTooltip === false;
|
||||
|
||||
@@ -0,0 +1,471 @@
|
||||
// #802: real pointer + public HA/config inputs. No private card writes: the
|
||||
// fixture delivers registry events and the integration's normal topology feed.
|
||||
import { mkdirSync, writeFileSync } from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { launch, checkAll, finish } from './serve.mjs';
|
||||
|
||||
const artifacts = new URL('../artifacts/zigbee-topology-802/', import.meta.url);
|
||||
mkdirSync(artifacts, { recursive: true });
|
||||
const out = {};
|
||||
const evidence = [];
|
||||
const ieee = (n) => `00124b000000000${n}`;
|
||||
const remoteName = 'Landing <router> & "night light"';
|
||||
const nodes = [
|
||||
['d_light1', 1, 1, 'Router'], ['d_lamp', 2, 0, 'Coordinator'],
|
||||
['d_mower', 3, 3, 'EndDevice'], ['d_temp', 4, 4, 'EndDevice'],
|
||||
['not_on_plan', 6, 6, 'Router'], ['d_kettle', 7, 7, 'EndDevice'],
|
||||
];
|
||||
const z2m = {
|
||||
nodes: nodes.map(([id, n, nwk, type]) => ({ ieeeAddr: ieee(n), networkAddress: nwk, type,
|
||||
friendlyName: id === 'not_on_plan' ? 'Unplaced <router> & target' : 'Provider target' })),
|
||||
links: [
|
||||
{ source: ieee(2), target: ieee(1), linkquality: 130, routes: [
|
||||
{ destinationAddress: 0, nextHopAddress: 0, status: 'ACTIVE' },
|
||||
] },
|
||||
{ source: ieee(1), target: ieee(3), relationship: 'Parent', linkquality: 140 },
|
||||
{ source: ieee(6), target: ieee(4), relationship: 'Parent', linkquality: 90 },
|
||||
{ source: ieee(2), target: ieee(6), linkquality: 110, routes: [
|
||||
{ destinationAddress: 0, nextHopAddress: 0, status: 'ACTIVE' },
|
||||
] },
|
||||
],
|
||||
};
|
||||
const zha = nodes.map(([id, n, nwk, type]) => ({ ieee: ieee(n), nwk, device_reg_id: id,
|
||||
device_type: type, name: id === 'not_on_plan' ? 'Unplaced <router> & target' : 'Provider target',
|
||||
neighbors: n === 3 ? [{ ieee: ieee(1), relationship: 'Parent', lqi: 140 }]
|
||||
: n === 4 ? [{ ieee: ieee(6), relationship: 'Parent', lqi: 90 }] : [],
|
||||
...(n === 1 || n === 6 ? { routes: [{ dest_nwk: 0, next_hop: 0, route_status: 'Active' }] } : {}),
|
||||
}));
|
||||
|
||||
for (const provider of ['z2m', 'zha']) {
|
||||
const { page, browser } = await launch({ width: 1100, height: 900 });
|
||||
const root = page.locator('#host > houseplan-card');
|
||||
const marker = (id) => root.locator(`[data-hp="device"][data-id="${id}"]`);
|
||||
const bubble = root.locator('[data-hp="zigbee-topology-parent-bubble"]');
|
||||
const settle = () => page.evaluate(() => window.__hpTest.settled());
|
||||
// Like smoke_preloader, keep the RAF-backed facade operation rooted in the
|
||||
// page and wait from Playwright: CDP can otherwise collect the returned
|
||||
// pending evaluate promise. Start once; never retry a config mutation.
|
||||
const setVolumetricView = async (on) => {
|
||||
await page.evaluate((on) => {
|
||||
const probe = { done: false, error: null, promise: null };
|
||||
window.__zigbeeProjectionSwitch = probe;
|
||||
probe.promise = window.__hpTest.setVolumetricView(on);
|
||||
void probe.promise.then(() => { probe.done = true; }, (error) => {
|
||||
probe.error = error instanceof Error ? error.stack || error.message : String(error);
|
||||
probe.done = true;
|
||||
});
|
||||
}, on);
|
||||
try {
|
||||
await page.waitForFunction(() => window.__zigbeeProjectionSwitch?.done,
|
||||
null, { polling: 25, timeout: 15000 });
|
||||
const error = await page.evaluate(() => window.__zigbeeProjectionSwitch.error);
|
||||
if (error) throw new Error(`projection fixture failed: ${error}`);
|
||||
} finally {
|
||||
await page.evaluate(() => { delete window.__zigbeeProjectionSwitch; });
|
||||
}
|
||||
};
|
||||
let pointer;
|
||||
const hover = async (id, vertical = 0.5) => {
|
||||
await page.mouse.move(2, 2);
|
||||
const box = await marker(id).boundingBox();
|
||||
if (!box) throw new Error(`missing marker ${id}`);
|
||||
pointer = { x: box.x + box.width / 2, y: box.y + box.height * vertical };
|
||||
await page.mouse.move(pointer.x, pointer.y);
|
||||
await settle();
|
||||
};
|
||||
const sample = async (id) => page.evaluate((id) => {
|
||||
const card = window.__card;
|
||||
const root = card.shadowRoot;
|
||||
const topology = root.querySelector('hp-zigbee-topology-overlay');
|
||||
const tip = root.querySelector('[data-hp-live-tip]');
|
||||
const rect = (element) => {
|
||||
const r = element.getBoundingClientRect();
|
||||
return { left: r.left, top: r.top, right: r.right, bottom: r.bottom, width: r.width, height: r.height };
|
||||
};
|
||||
const visible = (element) => !!element && !element.hidden && element.getBoundingClientRect().width > 0
|
||||
&& getComputedStyle(element).display !== 'none' && getComputedStyle(element).visibility !== 'hidden';
|
||||
const stage = rect(root.querySelector('.stage'));
|
||||
const bounds = { left: Math.max(stage.left, 0), top: Math.max(stage.top, 0),
|
||||
right: Math.min(stage.right, innerWidth), bottom: Math.min(stage.bottom, innerHeight) };
|
||||
const source = rect(root.querySelector(`[data-hp="device"][data-id="${id}"]`));
|
||||
const badges = [...(topology?.shadowRoot?.querySelectorAll('.parent-bubble,.remote,.route-status') || [])]
|
||||
.filter(visible).map((element) => ({ rect: rect(element), text: element.textContent.trim(),
|
||||
kind: element.className, pointerEvents: getComputedStyle(element).pointerEvents }));
|
||||
const tipRect = tip ? rect(tip) : null;
|
||||
const overlap = (a, b) => Math.max(0, Math.min(a.right, b.right) - Math.max(a.left, b.left))
|
||||
* Math.max(0, Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top));
|
||||
const tipVisible = visible(tip);
|
||||
const badgesDisjoint = badges.every((badge, i) => badges.slice(i + 1)
|
||||
.every((other) => overlap(badge.rect, other.rect) < 0.5));
|
||||
const inside = (r) => r.left >= bounds.left - 1 && r.top >= bounds.top - 1
|
||||
&& r.right <= bounds.right + 1 && r.bottom <= bounds.bottom + 1;
|
||||
const sourceElement = root.querySelector(`[data-hp="device"][data-id="${id}"]`);
|
||||
const floor = sourceElement.getAttribute('data-hp-iso-floor')?.split(',').map(Number);
|
||||
const visual = sourceElement.getAttribute('data-hp-iso-visual')?.split(',').map(Number);
|
||||
return { source, bounds, badges, tip: tipRect, tipVisible,
|
||||
projectionIso: root.querySelector('.stage').classList.contains('projection-iso'),
|
||||
isoWalls: !!root.querySelector('[data-hp="iso-walls"]'),
|
||||
sourceRaised: floor?.length === 2 && visual?.length === 2
|
||||
&& Math.hypot(floor[0] - visual[0], floor[1] - visual[1]) > 0.1,
|
||||
tipText: tip?.textContent || '', badgesDisjoint,
|
||||
clean: tipVisible && badges.length > 0 && badges.every((badge) => overlap(tipRect, badge.rect) < 0.5)
|
||||
&& overlap(tipRect, source) < 0.5 && inside(tipRect),
|
||||
badgeInside: badges.every((badge) => inside(badge.rect)),
|
||||
pointerTransparent: !!topology && getComputedStyle(topology).pointerEvents === 'none'
|
||||
&& badges.every((badge) => badge.pointerEvents === 'none'),
|
||||
safeText: !topology?.shadowRoot?.querySelector('router,img,script'),
|
||||
endpoint: root.querySelector(`[data-hp="device"][data-id="${id}"]`)?.hasAttribute('data-hp-zigbee-topology-endpoint'),
|
||||
lines: [...(topology?.shadowRoot?.querySelectorAll('line,polygon') || [])].map((element) =>
|
||||
['x1', 'x2', 'y1', 'y2', 'points'].map((name) => element.getAttribute(name)).join(',')),
|
||||
calls: { ...window.__tooltipFixture.calls },
|
||||
};
|
||||
}, id);
|
||||
const witness = async (name, id, { hidden = false } = {}) => {
|
||||
const value = await sample(id);
|
||||
evidence.push({ provider, name, ...value });
|
||||
out[`${provider}_${name}`] = value.badgesDisjoint
|
||||
&& (hidden ? !value.tipVisible && value.badges.length > 0 : value.clean);
|
||||
return value;
|
||||
};
|
||||
const deliver = async (options = {}) => page.evaluate((options) => {
|
||||
const fixture = window.__tooltipFixture;
|
||||
if (options.name !== undefined) {
|
||||
fixture.devices.d_light1 = { ...fixture.devices.d_light1,
|
||||
name_by_user: options.name, name: options.registryName ?? '' };
|
||||
window.__card.hass = { ...window.__card.hass, devices: { ...fixture.devices } };
|
||||
for (const callback of fixture.registryCallbacks) callback({ action: 'update', device_id: 'd_light1' });
|
||||
}
|
||||
if (options.clear) fixture.result = null;
|
||||
else if (options.restore) fixture.result = fixture.originalResult;
|
||||
if (options.providerName !== undefined && fixture.result) {
|
||||
fixture.result = structuredClone(fixture.result);
|
||||
fixture.result.nodes[0].friendlyName = options.providerName;
|
||||
}
|
||||
fixture.phase = options.phase || 'ready';
|
||||
fixture.stale = options.stale === true;
|
||||
for (const callback of fixture.callbacks) callback(fixture.event());
|
||||
}, options);
|
||||
try {
|
||||
// A delayed overlay chunk makes the first hover occur before upgrade. The
|
||||
// source pointer stays still while the public backend reset supplies data.
|
||||
let releaseOverlay;
|
||||
let overlayWasDelayed = false;
|
||||
const overlayReady = new Promise((resolve) => { releaseOverlay = resolve; });
|
||||
if (provider === 'z2m') await page.route('**/*hp-zigbee-topology-overlay*.js', async (route) => {
|
||||
overlayWasDelayed = true;
|
||||
await overlayReady; await route.fallback();
|
||||
});
|
||||
await page.evaluate(async ({ provider, nodes, z2m, zha, remoteName }) => {
|
||||
const card = window.__card;
|
||||
const original = card.hass;
|
||||
const fixture = { devices: structuredClone(original.devices), callbacks: new Set(), registryCallbacks: new Set(),
|
||||
calls: { zha: 0, start: 0, subscriptions: 0 }, revision: 0, phase: 'ready', stale: false,
|
||||
result: provider === 'z2m' ? z2m : null, originalResult: z2m, zha };
|
||||
for (const [id, n] of nodes) if (fixture.devices[id]) fixture.devices[id].identifiers = [['zha', `00124b000000000${n}`]];
|
||||
fixture.devices.d_light1 = { ...fixture.devices.d_light1, name_by_user: remoteName };
|
||||
fixture.event = () => fixture.result ? {
|
||||
kind: 'state', session_id: 'tooltip-802', revision: ++fixture.revision,
|
||||
provider: { topic: 'zigbee2mqtt', job_id: 'fixture', phase: fixture.phase, elapsed_ms: 1200,
|
||||
obtained_at: Date.now() - (fixture.stale ? 360000 : 0), stale: fixture.stale,
|
||||
...(fixture.phase === 'error' ? { error: 'provider' } : {}), result: fixture.result },
|
||||
} : { kind: 'removed', session_id: 'tooltip-802', revision: ++fixture.revision, topic: 'zigbee2mqtt' };
|
||||
const connection = { ...original.connection,
|
||||
subscribeEvents: async (callback, type) => {
|
||||
if (type === 'device_registry_updated') fixture.registryCallbacks.add(callback);
|
||||
const release = await original.connection.subscribeEvents(callback, type);
|
||||
return () => { fixture.registryCallbacks.delete(callback); release(); };
|
||||
},
|
||||
subscribeMessage: async (callback, message) => {
|
||||
if (message.type !== 'houseplan/zigbee/subscribe') return original.connection.subscribeMessage(callback, message);
|
||||
fixture.calls.subscriptions++;
|
||||
fixture.callbacks.add(callback);
|
||||
callback({ kind: 'reset', session_id: 'tooltip-802', revision: fixture.revision,
|
||||
topics: fixture.result ? ['zigbee2mqtt'] : [] });
|
||||
if (fixture.result) callback(fixture.event());
|
||||
return () => fixture.callbacks.delete(callback);
|
||||
},
|
||||
};
|
||||
card.hass = { ...original, devices: fixture.devices, connection,
|
||||
callWS: async (message) => {
|
||||
if (message.type === 'config/device_registry/list') return Object.values(fixture.devices);
|
||||
if (message.type === 'zha/devices') { fixture.calls.zha++; return fixture.zha; }
|
||||
if (message.type === 'houseplan/zigbee/start') { fixture.calls.start++; return fixture.event(); }
|
||||
const response = await original.callWS(message);
|
||||
return message.type === 'houseplan/config/get' ? { ...response, zigbee_scan_api: 1 } : response;
|
||||
},
|
||||
};
|
||||
window.__tooltipFixture = fixture;
|
||||
document.getElementById('host').style.width = '900px';
|
||||
await window.__hpTest.setServerConfig((cfg) => {
|
||||
cfg.settings = { ...cfg.settings, zigbee_topology: { enabled: true, z2m_base_topics: ['zigbee2mqtt'] } };
|
||||
cfg.spaces = cfg.spaces.map((space) => ({ ...space,
|
||||
settings: { ...space.settings, show_borders: true, show_names: true },
|
||||
}));
|
||||
return cfg;
|
||||
});
|
||||
await window.__hpTest.setLayout((layout) => ({ ...layout,
|
||||
d_kettle: { s: 'f1', x: 0.50, y: 0.40 }, d_temp: { s: 'f1', x: 0.22, y: 0.62 },
|
||||
d_light1: { s: 'f1', x: 0.25, y: 0.27 }, d_mower: { s: 'garden', x: 0.50, y: 0.48 },
|
||||
}));
|
||||
}, { provider, nodes, z2m, zha, remoteName });
|
||||
if (provider === 'zha') {
|
||||
await page.evaluate(() => window.__hpTest.setMode('plan'));
|
||||
await root.locator('[data-hp="settings"]').click();
|
||||
await root.locator('hp-zigbee-topology-settings').getByRole('button', { name: /Read ZHA/ }).click();
|
||||
await page.waitForFunction(() => window.__tooltipFixture.calls.zha === 1);
|
||||
await page.evaluate(() => window.__hpTest.close());
|
||||
await page.evaluate(() => window.__hpTest.setMode('view'));
|
||||
}
|
||||
await page.evaluate(() => window.__hpTest.switchSpace('garden'));
|
||||
await hover('d_mower');
|
||||
if (provider === 'z2m') out.mouseReallyPrecedesLazyUpgrade = overlayWasDelayed && await page.evaluate(() =>
|
||||
!customElements.get('hp-zigbee-topology-overlay')
|
||||
&& !window.__card.shadowRoot.querySelector('[data-hp-live-tip]').hidden);
|
||||
releaseOverlay();
|
||||
await bubble.waitFor({ state: 'visible' });
|
||||
await settle();
|
||||
out[`${provider}_remoteCaption`] = (await bubble.innerText()).trim() === `Ground floor (${remoteName})`;
|
||||
const remote = await witness(provider === 'z2m' ? 'firstHoverAfterLazyUpgrade' : 'firstMouseHover', 'd_mower');
|
||||
out[`${provider}_safeTextAndPointerTransparent`] = remote.safeText && remote.pointerTransparent;
|
||||
await page.screenshot({ path: fileURLToPath(new URL(`${provider}-remote-caption.png`, artifacts)) });
|
||||
|
||||
if (provider === 'z2m') {
|
||||
for (const [name, registryName, providerName, expected] of [
|
||||
[' ', 'Registry target', 'Provider target', 'Ground floor (Registry target)'],
|
||||
[' ', ' ', 'Provider target', 'Ground floor (Provider target)'],
|
||||
[' ', ' ', ' ', 'Ground floor'],
|
||||
]) {
|
||||
await deliver({ name, registryName, providerName });
|
||||
await page.waitForTimeout(300);
|
||||
await hover('d_mower');
|
||||
await page.waitForFunction((expected) => window.__card.shadowRoot.querySelector('hp-zigbee-topology-overlay')
|
||||
?.shadowRoot?.querySelector('.parent-bubble')?.textContent.trim() === expected, expected);
|
||||
out[`${provider}_nameFallback_${expected}`] = (await bubble.innerText()).trim() === expected;
|
||||
}
|
||||
await deliver({ name: remoteName });
|
||||
await page.evaluate(() => window.__hpTest.setServerConfig((cfg) => {
|
||||
cfg.spaces.find((space) => space.id === 'f1').title = ''; return cfg;
|
||||
}));
|
||||
await hover('d_mower');
|
||||
out.z2m_missingSpaceTitle = (await bubble.innerText()).trim() === `another space (${remoteName})`;
|
||||
await page.evaluate(() => window.__hpTest.setServerConfig((cfg) => {
|
||||
cfg.spaces.find((space) => space.id === 'f1').title = 'Ground floor'; return cfg;
|
||||
}));
|
||||
|
||||
for (const iso of [false, true]) for (const theme of ['light', 'dark']) {
|
||||
await setVolumetricView(iso);
|
||||
await page.evaluate(({ theme }) => {
|
||||
const card = window.__card;
|
||||
card.hass = { ...card.hass, themes: { ...card.hass.themes, darkMode: theme === 'dark' } };
|
||||
for (const [key, value] of Object.entries(theme === 'light' ? {
|
||||
'--card-background-color': '#ffffff', '--ha-card-background': '#ffffff',
|
||||
'--primary-text-color': '#202020', '--secondary-text-color': '#606060',
|
||||
} : { '--card-background-color': '#1c2530', '--ha-card-background': '#1c2530',
|
||||
'--primary-text-color': '#e1e1e1', '--secondary-text-color': '#9aa4ad' })) card.style.setProperty(key, value);
|
||||
}, { theme });
|
||||
await page.evaluate(() => window.__hpTest.switchSpace('f1'));
|
||||
for (const [id, name] of [['d_temp', 'unplaced'], ['d_light1', 'remote-count'], ['d_kettle', 'status-only']]) {
|
||||
await hover(id, 0.25);
|
||||
await root.locator('.route-status').waitFor({ state: 'visible' });
|
||||
const value = await witness(`${iso ? 'iso' : 'flat'}_${theme}_${name}`, id);
|
||||
out[`actualProjection_${iso}_${theme}_${name}`] = value.projectionIso === iso
|
||||
&& (!iso || (value.isoWalls && value.sourceRaised));
|
||||
if (name === 'remote-count') out[`remoteCount_${iso}_${theme}`] = value.badges.some((badge) => /1/.test(badge.text) && badge.kind === 'remote');
|
||||
if (name === 'status-only') {
|
||||
out[`statusOnlyHasNoEndpoint_${iso}_${theme}`] = !value.endpoint && value.lines.length === 0
|
||||
&& value.badges.some((badge) => /No route data/.test(badge.text));
|
||||
await page.screenshot({ path: fileURLToPath(new URL(`status-only-${iso ? 'iso' : 'flat'}-${theme}.png`, artifacts)) });
|
||||
if (!iso && theme === 'light') {
|
||||
// Recreate only the old display position, not product state. The
|
||||
// same intersection oracle must reject the original defect.
|
||||
const negative = await page.evaluate(({ x, y }) => {
|
||||
const tip = window.__card.shadowRoot.querySelector('[data-hp-live-tip]');
|
||||
const before = tip.getAttribute('style');
|
||||
tip.style.left = `${Math.min(innerWidth - tip.offsetWidth - 8, x + 12)}px`;
|
||||
tip.style.top = `${Math.min(innerHeight - tip.offsetHeight - 8, y + 12)}px`;
|
||||
return before;
|
||||
}, pointer);
|
||||
const oldPlacement = await sample(id);
|
||||
evidence.push({ provider, name: 'negative-control-cursor-plus-12', ...oldPlacement });
|
||||
out.oldPlacementNegativeControlFails = !oldPlacement.clean && oldPlacement.tipVisible
|
||||
&& oldPlacement.badges.some(({ rect }) => Math.max(0, Math.min(rect.right, oldPlacement.tip.right)
|
||||
- Math.max(rect.left, oldPlacement.tip.left)) * Math.max(0, Math.min(rect.bottom, oldPlacement.tip.bottom)
|
||||
- Math.max(rect.top, oldPlacement.tip.top)) > 10);
|
||||
await page.screenshot({ path: fileURLToPath(new URL('negative-control-old-placement.png', artifacts)) });
|
||||
await root.locator('[data-hp-live-tip]').evaluate((tip, style) => tip.setAttribute('style', style), negative);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Live provider status arrives while the mouse remains stationary.
|
||||
await deliver({ phase: 'error', stale: true });
|
||||
await page.waitForFunction(() => /Stale data/i.test(window.__card.shadowRoot.querySelector('hp-zigbee-topology-overlay')
|
||||
?.shadowRoot?.querySelector('.route-status')?.textContent || ''));
|
||||
await settle();
|
||||
const changed = await witness('runtimeErrorStaleNoPointerMove', 'd_kettle');
|
||||
out.runtimeIncludesPartialStaleError = changed.badges.some((badge) => /Incomplete data/.test(badge.text)
|
||||
&& /Stale data/i.test(badge.text) && /could not be loaded/i.test(badge.text));
|
||||
await deliver();
|
||||
await setVolumetricView(false);
|
||||
await page.evaluate(() => window.__hpTest.switchSpace('garden'));
|
||||
const longName = ('Long landing router <safe> & ' + 'north corridor diagnostic lighting '.repeat(5)).trim();
|
||||
await deliver({ name: longName });
|
||||
await page.waitForTimeout(300);
|
||||
await hover('d_mower');
|
||||
const long = await witness('longName', 'd_mower');
|
||||
out.longNameWrapsInsideStage = long.badgeInside && long.safeText
|
||||
&& long.badges.some((badge) => badge.text.includes(longName) && badge.rect.height > 25);
|
||||
await page.screenshot({ path: fileURLToPath(new URL('long-remote-caption.png', artifacts)) });
|
||||
// Freeze the fixture header/stage height so horizontal container resize
|
||||
// cannot move the marker away and create an unrelated native pointerout.
|
||||
await deliver({ name: remoteName });
|
||||
await page.evaluate(() => {
|
||||
const style = document.createElement('style');
|
||||
style.textContent = '.head{height:100px!important;min-height:100px!important;max-height:100px!important;overflow:hidden}.stage{height:400px!important;min-height:400px!important;max-height:400px!important}';
|
||||
window.__card.shadowRoot.append(style);
|
||||
});
|
||||
await page.waitForTimeout(150);
|
||||
await hover('d_mower');
|
||||
const beforeResize = await sample('d_mower');
|
||||
await page.evaluate(() => { document.getElementById('host').style.width = '95px'; });
|
||||
await page.waitForTimeout(150);
|
||||
await witness('narrowHidesOnlyOrdinaryTip', 'd_mower', { hidden: true });
|
||||
await page.screenshot({ path: fileURLToPath(new URL('narrow-priority.png', artifacts)) });
|
||||
await deliver({ clear: true }); await settle();
|
||||
const narrowWithoutBadges = await sample('d_mower');
|
||||
out.removingBadgesRestoresHiddenTipWithoutNewHover = narrowWithoutBadges.tipVisible
|
||||
&& narrowWithoutBadges.badges.length === 0;
|
||||
await deliver({ restore: true }); await settle();
|
||||
await witness('returningBadgesReappliesNarrowFallback', 'd_mower', { hidden: true });
|
||||
await page.evaluate(() => { document.getElementById('host').style.width = '900px'; });
|
||||
await page.waitForTimeout(150);
|
||||
const restored = await witness('resizeRestoresWithoutNewHover', 'd_mower');
|
||||
out.resizePreservesSourceAndRoute = JSON.stringify(restored.source) === JSON.stringify(beforeResize.source)
|
||||
&& JSON.stringify(restored.lines) === JSON.stringify(beforeResize.lines);
|
||||
await deliver({ clear: true });
|
||||
await settle();
|
||||
const removed = await sample('d_mower');
|
||||
out.removingDiagnosticsRestoresOrdinaryTip = removed.tipVisible && removed.badges.length === 0;
|
||||
await deliver({ restore: true, name: remoteName });
|
||||
await hover('d_mower');
|
||||
const networkBefore = JSON.stringify((await sample('d_mower')).calls);
|
||||
for (let i = 0; i < 12; i++) await page.mouse.move(pointer.x + i % 3, pointer.y + i % 2);
|
||||
out.pointerMotionNeverFetches = JSON.stringify((await sample('d_mower')).calls) === networkBefore;
|
||||
await page.mouse.move(2, 2); await settle();
|
||||
const left = await sample('d_mower');
|
||||
out.pointerLeaveClearsBoth = !left.tipVisible && left.badges.length === 0;
|
||||
await page.evaluate(() => window.__hpTest.switchSpace('f1'));
|
||||
await hover('d_tv');
|
||||
const ordinary = await sample('d_tv');
|
||||
out.nonZigbeeRetainsOrdinaryTooltip = ordinary.tipVisible && ordinary.badges.length === 0;
|
||||
await page.evaluate(() => window.__hpTest.switchSpace('garden'));
|
||||
await page.evaluate(() => window.__hpTest.setLayout((layout) => ({ ...layout,
|
||||
d_mower: { s: 'garden', x: 0.94, y: 0.12 },
|
||||
})));
|
||||
await hover('d_mower');
|
||||
const edge = await witness('edgeCaption', 'd_mower');
|
||||
out.edgeCaptionInsideWorkingArea = edge.badgeInside;
|
||||
await page.mouse.wheel(0, -180);
|
||||
await page.waitForTimeout(450);
|
||||
const zoomed = await witness('cameraZoomWithoutNewHover', 'd_mower');
|
||||
out.cameraActuallyChangesGeometry = Math.abs(edge.source.width - zoomed.source.width) > 0.1
|
||||
|| Math.abs(edge.source.left - zoomed.source.left) > 0.1;
|
||||
await page.screenshot({ path: fileURLToPath(new URL('edge-zoom.png', artifacts)) });
|
||||
// A second production card shares the HA connection/runtime but owns its
|
||||
// own pointer/focus tip and layout observers.
|
||||
await page.evaluate(() => {
|
||||
const second = document.createElement('houseplan-card');
|
||||
second.id = 'second-tooltip-card';
|
||||
second.setConfig({ type: 'custom:houseplan-card', icon_size: 3.4 });
|
||||
second.hass = window.__card.hass;
|
||||
second.style.cssText = 'position:fixed;left:5px;top:5px;width:350px;z-index:100';
|
||||
document.body.append(second);
|
||||
});
|
||||
const second = page.locator('#second-tooltip-card');
|
||||
await second.locator('[data-hp="device"]').first().waitFor({ state: 'visible' });
|
||||
await second.locator('[data-hp="device"]').first().focus();
|
||||
await page.keyboard.press('Tab');
|
||||
await settle();
|
||||
out.secondCardKeyboardTipDoesNotActivateTopology = await second.evaluate((card) => {
|
||||
const root = card.shadowRoot;
|
||||
return root.activeElement?.matches('[data-hp="device"]:focus-visible')
|
||||
&& !root.querySelector('[data-hp-live-tip]').hidden
|
||||
&& !root.querySelector('hp-zigbee-topology-overlay')?.shadowRoot?.querySelector('.parent-bubble,.remote,.route-status');
|
||||
});
|
||||
await hover('d_mower');
|
||||
const firstWithSecond = await sample('d_mower');
|
||||
await second.evaluate((card) => card.remove());
|
||||
await settle();
|
||||
const afterSecondRemoved = await sample('d_mower');
|
||||
out.secondCardUnmountDoesNotClearFirstHover = firstWithSecond.clean && afterSecondRemoved.clean
|
||||
&& JSON.stringify(firstWithSecond.badges) === JSON.stringify(afterSecondRemoved.badges);
|
||||
for (const pointerType of ['touch', 'pen']) {
|
||||
await marker('d_mower').dispatchEvent('pointerdown', { pointerType, pointerId: 82,
|
||||
bubbles: true, composed: true, clientX: pointer.x, clientY: pointer.y });
|
||||
await settle();
|
||||
const cleared = await sample('d_mower');
|
||||
out[`${pointerType}ClearsTooltipAndTopology`] = !cleared.tipVisible && cleared.badges.length === 0;
|
||||
await hover('d_mower');
|
||||
await witness(`mouseRestoresAfter_${pointerType}`, 'd_mower');
|
||||
}
|
||||
await page.mouse.move(2, 2);
|
||||
await page.keyboard.press('Tab');
|
||||
await marker('d_mower').focus();
|
||||
await settle();
|
||||
const keyboardOnly = await sample('d_mower');
|
||||
out.focusAloneShowsOrdinaryTipWithoutTopology = keyboardOnly.tipVisible && keyboardOnly.badges.length === 0
|
||||
&& await marker('d_mower').evaluate((element) => element.matches(':focus-visible'));
|
||||
await hover('d_mower');
|
||||
await witness('focusedDeviceMouseDiagnostics', 'd_mower');
|
||||
await page.mouse.move(2, 2); await settle();
|
||||
const focusRestored = await sample('d_mower');
|
||||
out.pointerLeaveRestoresKeyboardTipAfterDiagnostics = focusRestored.tipVisible
|
||||
&& focusRestored.tipText === keyboardOnly.tipText && focusRestored.badges.length === 0;
|
||||
await marker('d_mower').evaluate((element) => element.blur());
|
||||
// A transformed HA/dashboard ancestor establishes the containing block
|
||||
// for a position:fixed tooltip. Measure the actual screen result, not
|
||||
// the CSS left/top values, before and after document scrolling.
|
||||
await hover('d_mower');
|
||||
const beforeAncestorTransform = await sample('d_mower');
|
||||
await page.evaluate(() => {
|
||||
document.body.style.minHeight = '1800px';
|
||||
const host = document.getElementById('host');
|
||||
host.style.transformOrigin = '0 0';
|
||||
host.style.transform = 'translate(35px, 125px) scale(0.82)';
|
||||
});
|
||||
await hover('d_mower');
|
||||
const transformed = await witness('transformedContainingAncestor', 'd_mower');
|
||||
out.ancestorScaleReallyAppliesToFixedTooltip = Math.abs(
|
||||
transformed.source.width / beforeAncestorTransform.source.width - 0.82,
|
||||
) < 0.02 && await root.locator('[data-hp-live-tip]').evaluate((tip) =>
|
||||
getComputedStyle(tip).position === 'fixed');
|
||||
out.transformedBadgesInsideVisibleStage = transformed.badgeInside;
|
||||
await page.screenshot({ path: fileURLToPath(new URL('ancestor-transform.png', artifacts)) });
|
||||
// Six CSS pixels keep the pointer inside the marker, so this check also
|
||||
// witnesses the scroll observer without a new pointer event/hover.
|
||||
await page.evaluate(() => window.scrollTo(0, 6));
|
||||
await settle();
|
||||
const smallScroll = await witness('ancestorScrollWithoutNewHover', 'd_mower');
|
||||
out.scrollActuallyMovesScreenGeometry = Math.abs(transformed.source.top - smallScroll.source.top - 6) < 1;
|
||||
// A larger document scroll moves the source away from the old pointer;
|
||||
// re-enter the still-visible marker with a real mouse.
|
||||
await page.evaluate(() => window.scrollTo(0, 180));
|
||||
await hover('d_mower');
|
||||
const scrolled = await witness('transformedAncestorAfterPageScroll', 'd_mower');
|
||||
out.largePageScrollKeepsBadgesInsideVisibleStage = scrolled.badgeInside
|
||||
&& Math.abs(transformed.source.top - scrolled.source.top - 180) < 1
|
||||
&& await page.evaluate(() => window.scrollY === 180);
|
||||
await page.screenshot({ path: fileURLToPath(new URL('ancestor-transform-scrolled.png', artifacts)) });
|
||||
}
|
||||
} catch (error) {
|
||||
out[`${provider}_completed`] = false;
|
||||
console.error(error);
|
||||
await page.screenshot({ path: fileURLToPath(new URL(`${provider}-failure.png`, artifacts)) });
|
||||
} finally {
|
||||
// Keep the shared smoke page-error guard authoritative for both browsers.
|
||||
await finish(browser);
|
||||
}
|
||||
}
|
||||
writeFileSync(new URL('layout-evidence.json', artifacts), JSON.stringify({ out, evidence }, null, 2));
|
||||
checkAll(out);
|
||||
await finish(null, out);
|
||||
@@ -28,10 +28,16 @@ const result = await page.evaluate(async () => {
|
||||
.some((entry) => /zigbee-topology-runtime|hp-zigbee-topology-overlay/.test(entry.name));
|
||||
|
||||
let zhaCalls = 0;
|
||||
let pendingConfigReads = 0;
|
||||
window.__zigbeeSmokeFetchCount = () => zhaCalls;
|
||||
const originalHass = card.hass;
|
||||
card.hass = { ...originalHass, callWS: async (message) => {
|
||||
if (message.type !== 'zha/devices') return originalHass.callWS(message);
|
||||
if (message.type !== 'zha/devices') {
|
||||
const configRead = message.type === 'houseplan/config/get';
|
||||
if (configRead) pendingConfigReads++;
|
||||
try { return await originalHass.callWS(message); }
|
||||
finally { if (configRead) pendingConfigReads--; }
|
||||
}
|
||||
zhaCalls++;
|
||||
return [
|
||||
{ ieee: '00124b0000000001', nwk: 1, device_reg_id: 'd_light1', device_type: 'Router',
|
||||
@@ -84,17 +90,29 @@ const result = await page.evaluate(async () => {
|
||||
await wait(() => !!settings?.shadowRoot?.querySelector('button'), 'settings button');
|
||||
await settings._readZha();
|
||||
await wait(() => settings._snapshot?.states?.zha?.phase === 'ready', 'ZHA ready');
|
||||
// #800: this fixture intentionally has the old integration's config/get.
|
||||
// backend_required may be cached from the overlay's earlier failed check.
|
||||
// Reopening settings legitimately checks again. Drain the actual in-flight
|
||||
// transport and its queued runtime/Lit notifications before the isolated age
|
||||
// fixture; checking the old error string alone is not a completion barrier.
|
||||
await wait(() => settings._snapshot?.backendError === 'backend_required'
|
||||
&& pendingConfigReads === 0, 'old backend capability reads settled');
|
||||
await new Promise(resolve => setTimeout(resolve, 0));
|
||||
await settings.updateComplete;
|
||||
out.oldBackendStillAllowsZha = settings._snapshot.states.zha.phase === 'ready';
|
||||
out.explicitZhaRead = zhaCalls === 1;
|
||||
const settingsSnapshot = settings._snapshot;
|
||||
const renderedProviderStatus = () => [...settings.shadowRoot.querySelectorAll('.status,.hpf-actions .hpf-hint')]
|
||||
.map((node) => node.textContent).find((value) => /Received /.test(value)) || '';
|
||||
const ageFixtureTime = Date.now() - 5 * 60 * 1000 + 300;
|
||||
settings._acceptSnapshot({ ...settingsSnapshot, states: { ...settingsSnapshot.states,
|
||||
zha: { phase: 'ready', obtainedAt: Date.now() - 5 * 60 * 1000 + 300 },
|
||||
zha: { phase: 'ready', obtainedAt: ageFixtureTime },
|
||||
} });
|
||||
await settings.updateComplete;
|
||||
const initiallyFreshSettings = !/stale/i.test(renderedProviderStatus());
|
||||
await wait(() => /stale/i.test(renderedProviderStatus()), 'mounted settings snapshot ages');
|
||||
out.settingsAgeTimerWithoutRefetch = initiallyFreshSettings && zhaCalls === 1;
|
||||
out.settingsAgeTimerWithoutRefetch = initiallyFreshSettings && zhaCalls === 1
|
||||
&& settings._snapshot.states.zha.obtainedAt === ageFixtureTime;
|
||||
settings._acceptSnapshot(settingsSnapshot);
|
||||
await settings.updateComplete;
|
||||
card._settingsDialog = null;
|
||||
@@ -325,8 +343,9 @@ const result = await page.evaluate(async () => {
|
||||
?.querySelector('[data-hp="zigbee-topology-parent-bubble"]'), 'remote parent bubble');
|
||||
let activeOverlay = root().querySelector('hp-zigbee-topology-overlay');
|
||||
const firstTitle = card._serverCfg.spaces.find((space) => space.id === 'f1')?.title;
|
||||
const remoteParentName = card.hass.devices.d_light1.name_by_user || card.hass.devices.d_light1.name;
|
||||
out.remoteParentBubble = activeOverlay.shadowRoot
|
||||
.querySelector('[data-hp="zigbee-topology-parent-bubble"]')?.textContent.trim() === firstTitle
|
||||
.querySelector('[data-hp="zigbee-topology-parent-bubble"]')?.textContent.trim() === `${firstTitle} (${remoteParentName})`
|
||||
&& activeOverlay.shadowRoot.querySelector('[data-hp="zigbee-topology-parent-bubble"]')
|
||||
?.getAttribute('data-kind') === 'remote-space'
|
||||
&& !!activeOverlay.shadowRoot.querySelector('[data-hp="zigbee-topology-parent-arrow"]')
|
||||
@@ -943,7 +962,11 @@ for (const scale of [0.5, 1, 2]) {
|
||||
const root = card.shadowRoot || card.renderRoot;
|
||||
window.__zigbeeOutlineProbeStyle.textContent = `[data-hp-zigbee-outline-probe] {
|
||||
transform: scale(${scale}) !important; transform-origin: 0 0 !important; background: #fff !important;
|
||||
}`;
|
||||
}
|
||||
/* #802: isolate route ink. At scale=.5 the ordinary pointer tooltip can
|
||||
cover the target arrow; its dark background is not outline coverage.
|
||||
Real tooltip/badge coexistence is witnessed in smoke_zigbee_tooltip_layout. */
|
||||
[data-hp-live-tip] { display: none !important; }`;
|
||||
await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
|
||||
const overlay = root.querySelector('hp-zigbee-topology-overlay');
|
||||
const svg = overlay.shadowRoot.querySelector('svg');
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
// #800: production settings + WS transport, with a server-owned fixture outside
|
||||
// the page. A reload really loses all browser state; backend time is controlled,
|
||||
// not a 15-minute wall-clock sleep. HA/MQTT lifecycle is covered by HA tests.
|
||||
import { mkdirSync } from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { launch, check, finish } from './serve.mjs';
|
||||
|
||||
const { page, browser } = await launch({ width: 1000, height: 850 });
|
||||
const output = {};
|
||||
const record = (name, actual) => { output[name] = actual; check(name, actual); };
|
||||
const artifacts = new URL('../artifacts/zigbee-topology-800/', import.meta.url);
|
||||
mkdirSync(artifacts, { recursive: true });
|
||||
const server = { available: true, session: 'server-800', revision: 0, sequence: 0, publishes: 0, cancels: 0, provider: null };
|
||||
const state = () => ({ kind: 'state', session_id: server.session, revision: server.revision,
|
||||
provider: structuredClone(server.provider) });
|
||||
const initial = () => [{ kind: 'reset', session_id: server.session, revision: server.revision,
|
||||
topics: server.provider ? [server.provider.topic] : [] }, ...(server.provider ? [state()] : [])];
|
||||
await page.exposeFunction('__scanRpc', async (message) => {
|
||||
if (message.type === 'houseplan/config/get') return { available: server.available };
|
||||
if (message.type === 'houseplan/zigbee/subscribe') return initial();
|
||||
if (message.type === 'houseplan/zigbee/start') {
|
||||
if (server.provider?.phase !== 'loading') {
|
||||
server.publishes++;
|
||||
const last = server.provider;
|
||||
server.provider = { topic: 'zigbee2mqtt', job_id: `job-${++server.sequence}`,
|
||||
phase: 'loading', stage: 'waiting', started_at: Date.now(), elapsed_ms: 0,
|
||||
cancel_after_ms: 600000, ...(last?.result ? {
|
||||
result: last.result, obtained_at: last.obtained_at, stale: true,
|
||||
} : {}) };
|
||||
server.revision++;
|
||||
}
|
||||
return state();
|
||||
}
|
||||
if (message.type === 'houseplan/zigbee/cancel') {
|
||||
if (message.job_id !== server.provider?.job_id) throw new Error('conflict');
|
||||
if (server.provider.elapsed_ms < 600000) throw new Error('not_ready');
|
||||
if (server.provider.phase === 'loading') {
|
||||
server.cancels++;
|
||||
server.provider.phase = 'cancelled'; server.provider.stale = true;
|
||||
server.revision++;
|
||||
}
|
||||
return state();
|
||||
}
|
||||
throw new Error(`unexpected fixture RPC: ${message.type}`);
|
||||
});
|
||||
|
||||
const install = async (embedded = false) => page.evaluate(async (isEmbedded) => {
|
||||
const card = window.__card;
|
||||
await card._ensureEditorRuntime();
|
||||
card._openSettingsDialog(); await card.updateComplete;
|
||||
(card.shadowRoot || card.renderRoot)
|
||||
.querySelector('hp-dialog[data-kind="settings"] [data-hp="dialog-cancel"]').click();
|
||||
await card.updateComplete;
|
||||
const original = card.hass;
|
||||
window.__scanCallbacks = new Set();
|
||||
window.__scanStats = { subscriptions: 0, active: 0, mqtt: 0 };
|
||||
const connection = {
|
||||
...original.connection,
|
||||
subscribeMessage: async (callback, message) => {
|
||||
if (message.type !== 'houseplan/zigbee/subscribe') {
|
||||
if (message.type.startsWith('mqtt/')) window.__scanStats.mqtt++;
|
||||
return original.connection.subscribeMessage(callback, message);
|
||||
}
|
||||
window.__scanStats.subscriptions++; window.__scanStats.active++;
|
||||
window.__scanCallbacks.add(callback);
|
||||
for (const event of await window.__scanRpc(message)) callback(event);
|
||||
let active = true;
|
||||
return () => {
|
||||
if (!active) return; active = false;
|
||||
window.__scanCallbacks.delete(callback); window.__scanStats.active--;
|
||||
};
|
||||
},
|
||||
};
|
||||
const hass = { ...original, language: 'en', user: { ...original.user, id: 'admin-800', is_admin: true }, connection,
|
||||
callWS: async (message) => {
|
||||
if (message.type.startsWith('houseplan/zigbee/')) return window.__scanRpc(message);
|
||||
if (message.type === 'houseplan/config/get' && !(await window.__scanRpc(message)).available) {
|
||||
throw { code: 'not_ready' };
|
||||
}
|
||||
const result = await original.callWS(message);
|
||||
if (message.type === 'houseplan/config/get') return {
|
||||
...result, zigbee_scan_api: 1,
|
||||
};
|
||||
return result;
|
||||
},
|
||||
callService: async (...args) => {
|
||||
if (args[0] === 'mqtt') window.__scanStats.mqtt++;
|
||||
return original.callService(...args);
|
||||
},
|
||||
};
|
||||
window.__scanHass = hass;
|
||||
const element = document.createElement('hp-zigbee-topology-settings');
|
||||
element.id = 'scan-settings'; element.hass = hass;
|
||||
element.value = { enabled: true, z2mBaseTopics: ['zigbee2mqtt'] };
|
||||
element.savedEnabled = true; element.embedded = isEmbedded;
|
||||
element.style.cssText = 'position:fixed;inset:0;overflow:auto;padding:20px;box-sizing:border-box;background:#fff;color:#171735;z-index:99999;font:16px sans-serif';
|
||||
// Reproduce the tokens normally inherited from hp-dialog .hpf-form. The
|
||||
// demo document itself is dark; changing only background would fake a theme.
|
||||
for (const [key, value] of Object.entries({
|
||||
'--primary-text-color': '#171735', '--secondary-text-color': '#666879',
|
||||
'--card-background-color': '#fff', '--divider-color': '#dce5e7',
|
||||
'--hpf-surface': '#fff', '--hpf-line': '#dce5e7', '--hpf-muted': '#666879',
|
||||
'--hpf-accent': '#f09600', '--hpf-canvas': '#f5f5f8',
|
||||
})) element.style.setProperty(key, value);
|
||||
document.body.append(element); await element.updateComplete;
|
||||
}, embedded);
|
||||
const settings = () => page.locator('#scan-settings');
|
||||
const refresh = () => settings().getByRole('button', { name: /Update map/ });
|
||||
const cancel = () => settings().locator('[data-hp="zigbee-scan-cancel"]');
|
||||
const elapsed = () => settings().locator('[data-hp="zigbee-scan-elapsed"]');
|
||||
const waitState = async (phase) => page.waitForFunction((expected) =>
|
||||
document.getElementById('scan-settings')?._snapshot?.states?.['z2m:zigbee2mqtt']?.phase === expected, phase);
|
||||
const deliver = async () => page.evaluate((event) => {
|
||||
for (const callback of window.__scanCallbacks) callback(event);
|
||||
}, state());
|
||||
|
||||
try {
|
||||
await install();
|
||||
await refresh().click(); await waitState('loading');
|
||||
record('onePublishAndNoBrowserMqtt', server.publishes === 1
|
||||
&& await page.evaluate(() => window.__scanStats.mqtt === 0));
|
||||
record('stageElapsedAndCloseHint', await elapsed().isVisible()
|
||||
&& await settings().locator('[data-hp="zigbee-scan-stage"]').isVisible()
|
||||
&& await settings().locator('[data-hp="zigbee-scan-background"]').isVisible());
|
||||
record('noInventedPercentOrEarlyCancel', !(await settings().innerText()).includes('%')
|
||||
&& await cancel().count() === 0);
|
||||
|
||||
await page.evaluate(async () => {
|
||||
const element = document.getElementById('scan-settings');
|
||||
for (let i = 0; i < 4; i++) {
|
||||
element.hass = { ...element.hass, states: { ...element.hass.states } };
|
||||
await element.updateComplete;
|
||||
}
|
||||
});
|
||||
record('ordinaryHassUpdatesKeepOneSubscription', await page.evaluate(() =>
|
||||
window.__scanStats.subscriptions === 1 && window.__scanStats.active === 1));
|
||||
server.provider.elapsed_ms = 599100; server.revision++; await deliver();
|
||||
record('599SecondsStillNoCancel', await cancel().count() === 0);
|
||||
await cancel().waitFor({ state: 'visible', timeout: 4000 });
|
||||
record('cancelAppearsFromLocalClockWithoutServerTick', server.provider.elapsed_ms === 599100);
|
||||
|
||||
// Remove settings and reload the entire document, while fixture server lives.
|
||||
await page.evaluate(() => document.getElementById('scan-settings').remove());
|
||||
record('closingReleasesOnlyUi', await page.evaluate(() => window.__scanStats.active === 0)
|
||||
&& server.provider.phase === 'loading');
|
||||
server.provider.elapsed_ms = 901000; server.revision++;
|
||||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||||
await page.waitForFunction(() => window.__card?._booting === false);
|
||||
await install(true); await waitState('loading');
|
||||
record('newPageRestoresSameJobAfter15Minutes', server.publishes === 1
|
||||
&& /15:0[1-9]/.test(await elapsed().innerText()));
|
||||
record('longWaitHasCancelAndHonestHint', await cancel().isVisible()
|
||||
&& await settings().locator('[data-hp="zigbee-scan-long-wait"]').isVisible()
|
||||
&& await settings().locator('[data-hp="zigbee-scan-cancel-hint"]').isVisible());
|
||||
// Narrow layout and real keyboard activation, not a direct private handler.
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
await cancel().scrollIntoViewIfNeeded();
|
||||
const rect = await cancel().boundingBox();
|
||||
record('mobileCancelTouchTargetAndNoOverflow', rect?.height >= 44 && rect?.width >= 44
|
||||
&& await settings().evaluate((element) => element.scrollWidth <= element.clientWidth + 1));
|
||||
await page.screenshot({ path: fileURLToPath(new URL('narrow-light-wait.png', artifacts)) });
|
||||
await settings().evaluate((element) => {
|
||||
element.style.background = '#202126'; element.style.color = '#eee';
|
||||
element.style.setProperty('--card-background-color', '#202126');
|
||||
element.style.setProperty('--primary-text-color', '#eee');
|
||||
element.style.setProperty('--secondary-text-color', '#aaa');
|
||||
element.style.setProperty('--hpf-surface', '#202126');
|
||||
element.style.setProperty('--hpf-line', '#555');
|
||||
element.style.setProperty('--hpf-muted', '#aaa');
|
||||
element.style.setProperty('--hpf-canvas', '#17181d');
|
||||
});
|
||||
await page.screenshot({ path: fileURLToPath(new URL('narrow-dark-wait.png', artifacts)) });
|
||||
await cancel().focus(); await page.keyboard.press('Enter'); await waitState('cancelled');
|
||||
record('keyboardCancelsExactJobWithoutRepublish', server.cancels === 1 && server.publishes === 1);
|
||||
await refresh().click(); await waitState('loading');
|
||||
record('newExplicitScanOnly', server.publishes === 2 && server.provider.job_id === 'job-2');
|
||||
server.provider = { ...server.provider, phase: 'ready', elapsed_ms: 960000,
|
||||
obtained_at: Date.now(), stale: false,
|
||||
result: { status: 'ok', transaction: 'job-2', data: { type: 'raw', value: {
|
||||
nodes: [{ ieeeAddr: '00124b0000000001', type: 'Coordinator', networkAddress: 0 }], links: [],
|
||||
} } },
|
||||
}; server.revision++;
|
||||
// Finish with zero observers, then restore the cached result on remount.
|
||||
await page.evaluate(() => document.getElementById('scan-settings').remove());
|
||||
await install(); await waitState('ready');
|
||||
record('resultWhileAbsentRestoresWithoutNewScan', server.publishes === 2
|
||||
&& await elapsed().count() === 0 && await refresh().isEnabled());
|
||||
record('receivedMapNormalized', await page.evaluate(() =>
|
||||
document.getElementById('scan-settings')._snapshot.topologies.length === 1));
|
||||
await page.setViewportSize({ width: 1000, height: 850 });
|
||||
await page.screenshot({ path: fileURLToPath(new URL('desktop-ready.png', artifacts)) });
|
||||
const obsolete = state();
|
||||
await page.evaluate((event) => {
|
||||
for (const callback of window.__scanCallbacks) callback(event);
|
||||
}, { kind: 'closed', session_id: server.session, revision: ++server.revision });
|
||||
server.session = 'server-800-reloaded'; server.revision = 0; server.provider = null;
|
||||
await page.waitForFunction(() => !document.getElementById('scan-settings')._snapshot.states['z2m:zigbee2mqtt']);
|
||||
record('integrationUnloadClearsUiWithoutClosingHaSocket', await refresh().isEnabled()
|
||||
&& await page.evaluate(() => window.__scanStats.active === 0));
|
||||
server.available = false;
|
||||
await refresh().click(); await waitState('error');
|
||||
record('retryDuringReloadDoesNotStartRadioOrDisableRetry', server.publishes === 2
|
||||
&& await refresh().isEnabled());
|
||||
server.available = true;
|
||||
await refresh().click(); await waitState('loading');
|
||||
await page.evaluate((event) => {
|
||||
for (const callback of window.__scanCallbacks) callback(event);
|
||||
}, obsolete);
|
||||
record('explicitScanAfterIntegrationReloadReobservesNewSession', server.publishes === 3
|
||||
&& await page.evaluate(() => window.__scanStats.active === 1
|
||||
&& document.getElementById('scan-settings')._snapshot.states['z2m:zigbee2mqtt'].jobId === 'job-3'));
|
||||
await page.evaluate(async () => {
|
||||
const element = document.getElementById('scan-settings');
|
||||
element.hass = { ...element.hass, user: { id: 'viewer-800', is_admin: false } };
|
||||
await element.updateComplete;
|
||||
});
|
||||
record('permissionLossDropsObserverAndMap', await page.evaluate(() =>
|
||||
window.__scanStats.active === 0
|
||||
&& document.getElementById('scan-settings')._snapshot.topologies.length === 0));
|
||||
} finally {
|
||||
await finish(browser, output);
|
||||
}
|
||||
Vendored
+319
-291
@@ -1,598 +1,626 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"fingerprint": "dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",
|
||||
"fingerprint": "2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",
|
||||
"entry": "houseplan-card.js",
|
||||
"panelEntry": "houseplan-panel.js",
|
||||
"initialViewFiles": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-card.js"
|
||||
],
|
||||
"initialViewGzipBytes": 301007,
|
||||
"initialViewGzipBytes": 301040,
|
||||
"initialPanelFiles": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelGzipBytes": 302529,
|
||||
"initialPanelGzipBytes": 302564,
|
||||
"initialPanelOnlyFiles": [
|
||||
"houseplan-panel.js"
|
||||
],
|
||||
"initialPanelOnlyGzipBytes": 2321,
|
||||
"initialPanelOnlyGzipBytes": 2327,
|
||||
"lazyFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
],
|
||||
"lazyGzipBytes": 480977,
|
||||
"lazyGzipBytes": 485830,
|
||||
"lazyEditorFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"lazyEditorGzipBytes": 242375,
|
||||
"lazyEditorGzipBytes": 243803,
|
||||
"lazyOnboardingFiles": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"lazyOnboardingGzipBytes": 28393,
|
||||
"lazyOnboardingGzipBytes": 28679,
|
||||
"lazyLocaleFiles": [
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js"
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js"
|
||||
],
|
||||
"lazyLocaleGzipBytes": 53848,
|
||||
"lazyLocaleGzipBytes": 53867,
|
||||
"lazyIsometricFiles": [
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js"
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js"
|
||||
],
|
||||
"lazyIsometricGzipBytes": 12344,
|
||||
"lazyIsometricGzipBytes": 12348,
|
||||
"lazyFurnitureArtFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js"
|
||||
],
|
||||
"lazyFurnitureArtGzipBytes": 16943,
|
||||
"lazyFurnitureArtGzipBytes": 16939,
|
||||
"lazyPdfFiles": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js"
|
||||
],
|
||||
"lazyPdfGzipBytes": 126940,
|
||||
"lazyPdfGzipBytes": 126937,
|
||||
"lazyMoonFiles": [
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js"
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js"
|
||||
],
|
||||
"lazyMoonGzipBytes": 11714,
|
||||
"lazyMoonGzipBytes": 11715,
|
||||
"lazyLedFiles": [
|
||||
"houseplan-assets/led-strip-field-D9Bcdufv.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js"
|
||||
"houseplan-assets/led-strip-field-DYtgd8wB.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js"
|
||||
],
|
||||
"lazyLedGzipBytes": 10673,
|
||||
"lazyLedGzipBytes": 10684,
|
||||
"lazyLedEditorFiles": [
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"lazyLedEditorGzipBytes": 10691,
|
||||
"lazyLedEditorGzipBytes": 10705,
|
||||
"lazyNamespaceLocaleFiles": [
|
||||
"houseplan-assets/led-de-in8-Bixy.js",
|
||||
"houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"houseplan-assets/led-ru-BunGriy7.js",
|
||||
"houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"houseplan-assets/settings-ru-yivgZyNN.js",
|
||||
"houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"houseplan-assets/topology-ru-Cv-4NOD4.js"
|
||||
"houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"houseplan-assets/led-ru-BcCmiv05.js",
|
||||
"houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"houseplan-assets/settings-ru-Dm61M7J6.js",
|
||||
"houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"houseplan-assets/topology-ru-DSq63N19.js"
|
||||
],
|
||||
"lazyNamespaceLocaleGzipBytes": 30384,
|
||||
"lazyNamespaceLocaleGzipBytes": 31767,
|
||||
"files": [
|
||||
{
|
||||
"path": "houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"sha256": "e5287d777ef8cb19356af3c7205445d3e8cb0fa070a8c1fb4d9c86f0fba4938e",
|
||||
"rawBytes": 55329,
|
||||
"gzipBytes": 18023,
|
||||
"path": "houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"sha256": "141b16e51a818ad137bbf001efb6bed28a20791e8d992b0430edd79bfa3d0bec",
|
||||
"rawBytes": 54425,
|
||||
"gzipBytes": 17699,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"houseplan-assets/settings-ru-yivgZyNN.js"
|
||||
"houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"houseplan-assets/settings-ru-Dm61M7J6.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/de-BX4qFHIX.js",
|
||||
"sha256": "eff45b5f7c398944263edad4d12dcf092f2cb19a7752b631c20c4417edf6f47e",
|
||||
"path": "houseplan-assets/de-Df0SMMtx.js",
|
||||
"sha256": "ce067613e40e29223f9a0e46516035e7bf153bc30145083239945e82096803ab",
|
||||
"rawBytes": 89873,
|
||||
"gzipBytes": 27157,
|
||||
"gzipBytes": 27164,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/editor-PXorykkG.js",
|
||||
"sha256": "de49dbd79ee4e95fc3a5f8ff411743b391fe47e83c94e56132240cf4a2820880",
|
||||
"path": "houseplan-assets/editor-Ber3pzUs.js",
|
||||
"sha256": "9a8614dc89d1f5df419b66152f97872ac3a1cee8aff47bbc190e28ca3dd87317",
|
||||
"rawBytes": 3833,
|
||||
"gzipBytes": 1580,
|
||||
"gzipBytes": 1585,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"sha256": "1da1581c026ed21404ac69f5975793b40aac0eea46c22236dd88d00550d9dfb2",
|
||||
"path": "houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"sha256": "a6fccd3fb4ad315ba51316e958d65b49cf3e4d51707ddd98e47019e83b8467f2",
|
||||
"rawBytes": 1104,
|
||||
"gzipBytes": 579,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"sha256": "d67cd5482adce817b474e68ba31e1d3c0ddec55ff8f7c912e78395a265bb881d",
|
||||
"rawBytes": 25605,
|
||||
"gzipBytes": 5058,
|
||||
"gzipBytes": 5059,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/fr-Cfsy2S88.js",
|
||||
"sha256": "20122ee14aff0368571d664b95fc4ca18dd76ad39f5bee0219f89306ec5c0775",
|
||||
"path": "houseplan-assets/fr-9DZosQeR.js",
|
||||
"sha256": "14738a9cb6f99a1b7c56b425696dd354bb0589c58f569db280bab7aa313dab08",
|
||||
"rawBytes": 92266,
|
||||
"gzipBytes": 26691,
|
||||
"gzipBytes": 26703,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"sha256": "4e1fd4e13ecc5e2592669af1333de2c844df3718a91dcb6e77eebc10512f4380",
|
||||
"path": "houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"sha256": "75937cebabec17ca652b22606bfe3ae511df5a8e44921d05d4f84fe3ab353e74",
|
||||
"rawBytes": 52035,
|
||||
"gzipBytes": 16943,
|
||||
"gzipBytes": 16939,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"sha256": "b1577206faff0d44254faf7fe2f3725346234ee6ac0b31e00dbffb09f32b5fa6",
|
||||
"rawBytes": 1059141,
|
||||
"gzipBytes": 300208,
|
||||
"path": "houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"sha256": "2891b5898e812f6433322a6b750077f5c543a6308c2b04e19e349f3003101830",
|
||||
"rawBytes": 1059200,
|
||||
"gzipBytes": 300237,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/de-BX4qFHIX.js",
|
||||
"houseplan-assets/editor-PXorykkG.js",
|
||||
"houseplan-assets/fr-Cfsy2S88.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js"
|
||||
"houseplan-assets/de-Df0SMMtx.js",
|
||||
"houseplan-assets/editor-Ber3pzUs.js",
|
||||
"houseplan-assets/fr-9DZosQeR.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-DHGIW5cZ.js",
|
||||
"sha256": "15935a500d2cf09d7d6367ce3d2a45115624a561f5c21cc81c481583bbb83d07",
|
||||
"rawBytes": 696207,
|
||||
"gzipBytes": 194763,
|
||||
"path": "houseplan-assets/houseplan-editor-runtime-BMlHsBKo.js",
|
||||
"sha256": "2706f9bbc0201e8902598eb20463ee9e417520e40ebb9536be857098f7b56ca3",
|
||||
"rawBytes": 698926,
|
||||
"gzipBytes": 195577,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-BpRiDfsS.js",
|
||||
"sha256": "6d6f0398771c34f56a9dc64b3b6faddbf596d8832dbcd407453c12840165cf8e",
|
||||
"rawBytes": 15886,
|
||||
"gzipBytes": 4905,
|
||||
"path": "houseplan-assets/houseplan-onboarding-runtime-9BSwcl9-.js",
|
||||
"sha256": "715f8a6fecb9d2772c0184834a4e7fd673fb8ba8e2b19f25e084d5139ab63ff9",
|
||||
"rawBytes": 15930,
|
||||
"gzipBytes": 4932,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/backdrop-pick-pmkHPB61.js",
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/backdrop-pick-rLk02S_E.js",
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-KTuDiq6u.js",
|
||||
"sha256": "acf283f4ebdfef0f31785f14f881b7d10a7678fbb599b30cc54964d83bc488a3",
|
||||
"rawBytes": 12193,
|
||||
"gzipBytes": 4295,
|
||||
"path": "houseplan-assets/hp-zigbee-topology-overlay-BTD4QxJr.js",
|
||||
"sha256": "d4a06ecef69eef43807011f234e9ea4f41525512e3c46cd192f71c7530da5797",
|
||||
"rawBytes": 16715,
|
||||
"gzipBytes": 5525,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/iso-scene-render-Bc7vXe89.js",
|
||||
"sha256": "1c9f594f000cf9b15ee730829deb878169dc057a8911b37367e1fd5f8d535f46",
|
||||
"path": "houseplan-assets/iso-scene-render-D0hnGVLf.js",
|
||||
"sha256": "6865d06163a910a4f641d0bb29bc99cb8215902708b83427de0b466c4d796914",
|
||||
"rawBytes": 36700,
|
||||
"gzipBytes": 12344,
|
||||
"gzipBytes": 12348,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-de-in8-Bixy.js",
|
||||
"sha256": "4b49513a9f51a060a0266d3387a614819cc3b845e840d1e6520af009e41a860d",
|
||||
"path": "houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"sha256": "622c426b50781de7a4be6aadb935cadcc7fa774179b2ef409f65fa64e9064e65",
|
||||
"rawBytes": 1907,
|
||||
"gzipBytes": 919,
|
||||
"gzipBytes": 922,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"sha256": "56c0e03568d0bacf5c9d35bf39061682305458a5e67d8b1202897f2072d2f2d1",
|
||||
"path": "houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"sha256": "1f10f0098bb13ce8ef24f60a1dda556b0aa6f47239a0bfa124d016fc92ede20d",
|
||||
"rawBytes": 1886,
|
||||
"gzipBytes": 904,
|
||||
"gzipBytes": 907,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-ru-BunGriy7.js",
|
||||
"sha256": "bc2777d7d6f1ffbcc44398c7ce23d346b89eb7585deff7a2c779c0eb1a7c8efb",
|
||||
"path": "houseplan-assets/led-ru-BcCmiv05.js",
|
||||
"sha256": "8c367a70a2fd03504863c42afb168803905dd7f16145e489e227f77c0b61e7fe",
|
||||
"rawBytes": 2525,
|
||||
"gzipBytes": 1105,
|
||||
"gzipBytes": 1107,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-editor-BcZ4GB2-.js",
|
||||
"sha256": "d929af6d550f9fe7e11f20c97464977f1af2f74fef7e8cb37ac62e12bb46fd37",
|
||||
"path": "houseplan-assets/led-strip-editor-AS9V253I.js",
|
||||
"sha256": "4f25c8551b2db798fc062c5f9e0a9733d8a18bd6f7d3d03da73c33753623403c",
|
||||
"rawBytes": 21704,
|
||||
"gzipBytes": 7372,
|
||||
"gzipBytes": 7381,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/led-de-in8-Bixy.js",
|
||||
"houseplan-assets/led-fr-B6CPVcRG.js",
|
||||
"houseplan-assets/led-ru-BunGriy7.js"
|
||||
"houseplan-assets/led-de-DAcR1G-Q.js",
|
||||
"houseplan-assets/led-fr-_e9yQX3D.js",
|
||||
"houseplan-assets/led-ru-BcCmiv05.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-field-D9Bcdufv.js",
|
||||
"sha256": "8b362df9a6f1eaafec5cde2d37cb031d4632e86c74a3c4a8bcfe83d8f4a5894e",
|
||||
"path": "houseplan-assets/led-strip-field-DYtgd8wB.js",
|
||||
"sha256": "47fd14662b9836229b7f2aa55fb027f4aa56313b0825be70f5b1a6a674541d17",
|
||||
"rawBytes": 8066,
|
||||
"gzipBytes": 3379,
|
||||
"gzipBytes": 3383,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-geometry-P8XODJa_.js",
|
||||
"sha256": "60ad8036bd5149cbbd337948f869cc1611361e8ee9f7b00961a38b6ddd2b0f8f",
|
||||
"path": "houseplan-assets/led-strip-geometry-CFq4tPIv.js",
|
||||
"sha256": "d59b35b494d23921b63faf4f584f1ab9dea3342e5a43b7399964e3d4732d40fe",
|
||||
"rawBytes": 7055,
|
||||
"gzipBytes": 2912,
|
||||
"gzipBytes": 2914,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/led-strip-runtime-B7P9aAvF.js",
|
||||
"sha256": "5372fffb42da6d3b88505f56f0067f177bd30f8d91421583d400be336239c072",
|
||||
"path": "houseplan-assets/led-strip-runtime-CYCZOpBw.js",
|
||||
"sha256": "2675363403be48fddf536c7101422e2492b1e4172aa701851a15e46ce1f80ce2",
|
||||
"rawBytes": 11248,
|
||||
"gzipBytes": 4382,
|
||||
"gzipBytes": 4387,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/led-strip-geometry-P8XODJa_.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/led-strip-geometry-CFq4tPIv.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/led-strip-field-D9Bcdufv.js"
|
||||
"houseplan-assets/led-strip-field-DYtgd8wB.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/live-interaction-runtime-cYRkRyw6.js",
|
||||
"sha256": "8ce67a99c4a06e7ac1b6c9769f3fa180f431c45a8dcfe7d31a6b1d511bfbbebb",
|
||||
"rawBytes": 8370,
|
||||
"gzipBytes": 3273,
|
||||
"path": "houseplan-assets/live-interaction-runtime-CX7iT0NT.js",
|
||||
"sha256": "744e65ad2f843f7f6e09176ff449b5b4b83e935856a98b2ec128aebdf93ebc8d",
|
||||
"rawBytes": 9694,
|
||||
"gzipBytes": 3782,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/floating-surface-CAk--Y2g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/live-tip-placement-Cmnwu_lZ.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/moon-runtime-BJinnDR5.js",
|
||||
"sha256": "8805e21c3833547d5d675e3a07c63ff2414813ca09e0be84dc58b052455dc2de",
|
||||
"path": "houseplan-assets/live-tip-placement-Cmnwu_lZ.js",
|
||||
"sha256": "597bb1bc933908ff200057dd7ba941f3b5a974c9a2090acc56b0f715da39ad6f",
|
||||
"rawBytes": 1191,
|
||||
"gzipBytes": 683,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/moon-runtime-qD4uu5bk.js",
|
||||
"sha256": "c70c2405448d5aa0444ed2ad0ef9446a568e06981c9e14665a53c7c0af030604",
|
||||
"rawBytes": 30292,
|
||||
"gzipBytes": 11714,
|
||||
"gzipBytes": 11715,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"sha256": "96fd090ad66b4fd88502eeb5a2acef5f0fcf67f758c88e3f546a3d7e3f620088",
|
||||
"path": "houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"sha256": "85197049ab95cd2928a157d8045508cc2e6340dcd8963079dfda1b743b9e910f",
|
||||
"rawBytes": 675,
|
||||
"gzipBytes": 407,
|
||||
"gzipBytes": 410,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/pdf-export-BOjmZ_Tf.js",
|
||||
"sha256": "b718a5d48b9e774649e1e942adc5f1c83928605f2ac10a846770bd2a4d14a217",
|
||||
"path": "houseplan-assets/pdf-export-BLeQ2whw.js",
|
||||
"sha256": "05ce799acc1bb24dc0d283a44beb1bfed7c5791637ebc9c9140c7bda5652b7df",
|
||||
"rawBytes": 236714,
|
||||
"gzipBytes": 109997,
|
||||
"gzipBytes": 109998,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/furniture-plan-art.generated-EMZUHSTG.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/furniture-plan-art.generated-DxnzGS7R.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-de-CCnHghRq.js",
|
||||
"sha256": "766c2d32e011428a85c01471da9863f525d1efa22e95c55409f007ff0e99a3c5",
|
||||
"path": "houseplan-assets/settings-de-D2uOhVdg.js",
|
||||
"sha256": "5185e2fbba6b5ca8384a5b9f8024210dd4f7eae44a208255f8fe142012075890",
|
||||
"rawBytes": 8886,
|
||||
"gzipBytes": 3406,
|
||||
"gzipBytes": 3410,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-fr-DTX_O1kW.js",
|
||||
"sha256": "68fdd0f26382ee70ed9ea20c95578cb696ba9e839655c98342b9817491380743",
|
||||
"path": "houseplan-assets/settings-fr-Dkv1OQnI.js",
|
||||
"sha256": "a1a6ce7597b21f3e8b6bbf41c374dc3fab4e5ae4baf9181d270c90a6fa58f45c",
|
||||
"rawBytes": 9297,
|
||||
"gzipBytes": 3379,
|
||||
"gzipBytes": 3384,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/settings-ru-yivgZyNN.js",
|
||||
"sha256": "a91238540e317153b46c782e28988984184e75f3d67f536f3cb099323a24abfe",
|
||||
"path": "houseplan-assets/settings-ru-Dm61M7J6.js",
|
||||
"sha256": "e1efb00b777f3f386ce2296f96c76cc1970460dc5b9915cf5bca0d667e814f2b",
|
||||
"rawBytes": 12284,
|
||||
"gzipBytes": 3896,
|
||||
"gzipBytes": 3900,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/space-editor-Cma0EHsu.js",
|
||||
"sha256": "e49ba86408175c0ec0642436a811a1105b6c698adcf389b7b7e057e8e7f2e145",
|
||||
"path": "houseplan-assets/space-editor-CSjiCH5v.js",
|
||||
"sha256": "1939fa609e45366525ac5e61cee84cb1aeae7d3a99711fa1744908fda7e9cde6",
|
||||
"rawBytes": 2619,
|
||||
"gzipBytes": 1124,
|
||||
"gzipBytes": 1127,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-editor-Cxzy0-Eo.js",
|
||||
"sha256": "72d514ddaaa223cccc30f44835a69f13ccdee4d21680f089c147c18952850b55",
|
||||
"path": "houseplan-assets/summary-panel-editor-BDa-rBgX.js",
|
||||
"sha256": "abccfc8cfad10984cdbfe5b7b8f416c84c11727640b3fe707b3bb03b168ecc8a",
|
||||
"rawBytes": 14867,
|
||||
"gzipBytes": 3424,
|
||||
"gzipBytes": 3427,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js"
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-metrics-DCWtuw0D.js",
|
||||
"sha256": "0de126c3a3461fe404b8cd9f929c0f8fb7df00a7376b39d677ed5ceb27c5808e",
|
||||
"path": "houseplan-assets/summary-panel-metrics-BiXNDvWo.js",
|
||||
"sha256": "c0a6e64d7805b99c83dd58b3704814dea5b21e47a9c5a4f3c61d0f5582f1ae55",
|
||||
"rawBytes": 2701,
|
||||
"gzipBytes": 1341,
|
||||
"gzipBytes": 1344,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-C4YDg3Cx.js",
|
||||
"sha256": "1c0e52ab60df32e6863b32cf4e6b607cf346baddc8b4dfc2ab7aceb4caf6084d",
|
||||
"path": "houseplan-assets/summary-panel-runtime-loaded-Gm80_eMo.js",
|
||||
"sha256": "b978d47f4babb0564c97a7b3a2d0e505a43a81eab4f49792acb3b39be38d6564",
|
||||
"rawBytes": 73476,
|
||||
"gzipBytes": 20484,
|
||||
"gzipBytes": 20488,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/form-kit.styles-BC5W6ya6.js",
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/form-kit.styles-BXaoYN6g.js",
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/summary-panel-editor-Cxzy0-Eo.js",
|
||||
"houseplan-assets/summary-panel-metrics-DCWtuw0D.js"
|
||||
"houseplan-assets/summary-panel-editor-BDa-rBgX.js",
|
||||
"houseplan-assets/summary-panel-metrics-BiXNDvWo.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-de-Uf7RDNV6.js",
|
||||
"sha256": "3dd1076c8e194970aa07c0abc7ef659ea35084818078db4c95fa6610c1a8460d",
|
||||
"path": "houseplan-assets/support-de-CuOKWMOQ.js",
|
||||
"sha256": "0250ec7cbbcca4f972f612b68bc8dd19fe7ebf6b83014e521c06291d53814416",
|
||||
"rawBytes": 6167,
|
||||
"gzipBytes": 2393,
|
||||
"gzipBytes": 2397,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-fr-B11Ao4y4.js",
|
||||
"sha256": "447051dca94d109223c2262dbc7a9ebec2fd5f3a044b6d58d55b6f31ee5c5b15",
|
||||
"path": "houseplan-assets/support-fr-Cg72SrF2.js",
|
||||
"sha256": "c67ff5b8ddc5c490e292199debc279ccf65c46cecdec2e105ecc7ee06e9c5a90",
|
||||
"rawBytes": 6333,
|
||||
"gzipBytes": 2428,
|
||||
"gzipBytes": 2433,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/support-ru-CmQuSDOj.js",
|
||||
"sha256": "c1670d36d1bd4213bdb5ebb61c7af6a96989e03df3490d97220b009d8628c7a0",
|
||||
"path": "houseplan-assets/support-ru-DE0eoEHZ.js",
|
||||
"sha256": "534214af44ba8e80b6449ad3bc42ecdb6f43103f293fd7d19deae60d1481a52e",
|
||||
"rawBytes": 8376,
|
||||
"gzipBytes": 2874,
|
||||
"gzipBytes": 2877,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-de-DyFDPZbG.js",
|
||||
"sha256": "ddb88d1eff71074f5d4abd4c0104c0d997e732218e90858c63863bd7d4a3bbc9",
|
||||
"path": "houseplan-assets/tools-de-CkfSvdjK.js",
|
||||
"sha256": "205d81de2c9b9b79516e88e7284592c0726e5f4b3a9dd63242cc028b267ee8ce",
|
||||
"rawBytes": 4130,
|
||||
"gzipBytes": 1373,
|
||||
"gzipBytes": 1377,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-fr-CeFR06cU.js",
|
||||
"sha256": "b8204314e3b4b94b9e3b293b82695a0325671768af8ad888495b5a489d4ccba3",
|
||||
"path": "houseplan-assets/tools-fr-CLTqQchi.js",
|
||||
"sha256": "3a3d842ec5befbc252261ec46afefd8cb28b2ab1d805220a55933ddd38831a2c",
|
||||
"rawBytes": 4136,
|
||||
"gzipBytes": 1356,
|
||||
"gzipBytes": 1359,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/tools-ru-DGADw1lV.js",
|
||||
"sha256": "7e18727975a541c8bb20233edbb820328128134ac69f316884a90111641dc03d",
|
||||
"path": "houseplan-assets/tools-ru-uXSPneqf.js",
|
||||
"sha256": "46afb767891262c52bc51658de2db852264b911eb864f03f91a5f10d2573301b",
|
||||
"rawBytes": 5633,
|
||||
"gzipBytes": 1693,
|
||||
"gzipBytes": 1696,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"sha256": "a0c95c17a111567d8b3cc1b27d437ead6bee7461850cf4320046cf9ff7bee783",
|
||||
"rawBytes": 2951,
|
||||
"gzipBytes": 1435,
|
||||
"path": "houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"sha256": "85ed4bb11a34972e23ba51a7bb74a70f7fc30b228f7b140a7a87c780cdfa93aa",
|
||||
"rawBytes": 4237,
|
||||
"gzipBytes": 1889,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"sha256": "0d7d4412a61f74b97a446f52ea977d810016a7225422ad37dfd3c989b000804b",
|
||||
"rawBytes": 3039,
|
||||
"gzipBytes": 1447,
|
||||
"path": "houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"sha256": "67b40ff27301c3aefd69dee454f5e90ff7edf43da084434ce850c3960e7bb65b",
|
||||
"rawBytes": 4321,
|
||||
"gzipBytes": 1871,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/topology-ru-Cv-4NOD4.js",
|
||||
"sha256": "f062fe240df83d46e7a0afed17d325b4027a5bdef7afc61ba1b7b77d98f35fb2",
|
||||
"rawBytes": 4270,
|
||||
"gzipBytes": 1776,
|
||||
"path": "houseplan-assets/topology-ru-DSq63N19.js",
|
||||
"sha256": "21126337f66f9e2af553a999af9cb33a72a3d780daa86b1da8c2b5f92ffb6b85",
|
||||
"rawBytes": 5880,
|
||||
"gzipBytes": 2238,
|
||||
"isEntry": false,
|
||||
"imports": [],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-Cs-828J3.js",
|
||||
"sha256": "e827b48796657593e36f772ae1142a70f21abfb6ad231a7f72f146827f1654f4",
|
||||
"rawBytes": 14847,
|
||||
"gzipBytes": 5601,
|
||||
"path": "houseplan-assets/zigbee-topology-CRIMYnAF.js",
|
||||
"sha256": "1fee965bb50d8d80417cae2e9a6b070a8fe1311b42171b300d83768f911eb9c4",
|
||||
"rawBytes": 15905,
|
||||
"gzipBytes": 5955,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js"
|
||||
],
|
||||
"dynamicImports": [
|
||||
"houseplan-assets/topology-de-DhfPHMLI.js",
|
||||
"houseplan-assets/topology-fr-Cax9J0Ja.js",
|
||||
"houseplan-assets/topology-ru-Cv-4NOD4.js"
|
||||
"houseplan-assets/topology-de-BrwHoXfr.js",
|
||||
"houseplan-assets/topology-fr-gjGrARkP.js",
|
||||
"houseplan-assets/topology-ru-DSq63N19.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-Cf4FEQTO.js",
|
||||
"sha256": "3f1e2c4b58cc97535e83e9a0b011175fef0c5c878c4ee6f9e9de3c03476c4c4a",
|
||||
"rawBytes": 4374,
|
||||
"gzipBytes": 1952,
|
||||
"path": "houseplan-assets/zigbee-topology-runtime-BF4ZBhd8.js",
|
||||
"sha256": "1d76b7f08b7659d6f3a05ba551acc4698ab3a05be495077ac498b212dadb039b",
|
||||
"rawBytes": 7883,
|
||||
"gzipBytes": 2880,
|
||||
"isEntry": false,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js",
|
||||
"houseplan-assets/namespace-language-Cj9GZ2Dl.js",
|
||||
"houseplan-assets/zigbee-topology-Cs-828J3.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js",
|
||||
"houseplan-assets/namespace-language-qIVz1CjX.js",
|
||||
"houseplan-assets/zigbee-topology-CRIMYnAF.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-card.js",
|
||||
"sha256": "085db39e22d81bc69f6552b4d6a7e4d4270bb76b4bf7f0e26e98e438ed060237",
|
||||
"sha256": "b1334be19eb372421b9b2886a9f79a7d86bf68f3dd856cda830865436059ad15",
|
||||
"rawBytes": 1205,
|
||||
"gzipBytes": 799,
|
||||
"gzipBytes": 803,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
},
|
||||
{
|
||||
"path": "houseplan-panel.js",
|
||||
"sha256": "bd1cfdab7b550552450e08d47e699fd65ea3f13ba76ef44df8766897e1dcb380",
|
||||
"sha256": "e1e064634e82387201d3666c7264d26f9aae2df27bd9b1229d8a872738f4ad53",
|
||||
"rawBytes": 6165,
|
||||
"gzipBytes": 2321,
|
||||
"gzipBytes": 2327,
|
||||
"isEntry": true,
|
||||
"imports": [
|
||||
"houseplan-assets/houseplan-card-pPShiPsn.js"
|
||||
"houseplan-assets/houseplan-card-BOhGeQlv.js"
|
||||
],
|
||||
"dynamicImports": []
|
||||
}
|
||||
|
||||
Vendored
+76
-76
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{aG as e,l as o,aJ as t,eE as s,A as a,eF as i,eG as l,eH as n,E as r,c}from"./houseplan-card-pPShiPsn.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__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{aG as e,l as o,aJ as t,eE as s,A as a,eF as i,eG as l,eH as n,E as r,c}from"./houseplan-card-BOhGeQlv.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
|
||||
.hass=${this.hass}
|
||||
.data=${this._formData}
|
||||
.schema=${e}
|
||||
@@ -0,0 +1 @@
|
||||
function t(t){const a=t.visualViewport;return a&&Number.isFinite(a.width)&&Number.isFinite(a.height)?{left:Number(a.offsetLeft)||0,top:Number(a.offsetTop)||0,width:Math.max(0,Number(a.width)||0),height:Math.max(0,Number(a.height)||0)}:{left:0,top:0,width:t.innerWidth,height:t.innerHeight}}function a(t,a,h,e=7,i=8){const o=h.left+i,n=h.top+i,m=Math.max(o,h.left+h.width-i),f=Math.max(n,h.top+h.height-i),r=Math.max(0,m-o),M=Math.max(0,f-n),u=Math.min(Math.max(0,a.width),r),d=Math.min(Math.max(0,a.height),M);let p=t.left;p+u>m&&(p=t.right-u),p=Math.min(Math.max(o,p),Math.max(o,m-u));const x=t.bottom+e,s=t.top-e-d;let b="bottom",l=x;return x+d>f&&s>=n?(b="top",l=Math.min(Math.max(n,s),Math.max(n,f-d))):l=Math.min(Math.max(n,x),Math.max(n,f-d)),{left:Math.round(p),top:Math.round(l),side:b,maxWidth:Math.round(r),maxHeight:Math.round(M)}}function h(t){const a=t.HTMLElement?.prototype;return"function"==typeof a?.showPopover&&"function"==typeof a?.hidePopover}globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{h as a,t as f,a as p};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+10
-10
File diff suppressed because one or more lines are too long
+56
-51
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{l as t,bS as s,A as e,aJ as o,c as a,m as i,d2 as l,d3 as h,d4 as n,bO as r,d5 as c,da as p,d6 as d,d7 as _,d8 as u,d9 as g,db as m,dc as f}from"./houseplan-card-pPShiPsn.js";import{z as b,A as v,C as y,D,E as w,G as S,H as $,I as C,n as M,S as k}from"./backdrop-pick-pmkHPB61.js";import{s as I}from"./namespace-language-Cj9GZ2Dl.js";import"./form-kit.styles-BC5W6ya6.js";const x="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",T=I([k]);class F{constructor(t){this.host=t,this.languageRuntime=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(i){const l=`${i}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,i)&&s(h,l)?a`<hp-help data-help-key=${i}
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{l as t,bS as s,A as e,aJ as o,c as a,m as i,d2 as l,d3 as h,d4 as n,bO as r,d5 as c,da as p,d6 as d,d7 as _,d8 as u,d9 as g,db as m,dc as f}from"./houseplan-card-BOhGeQlv.js";import{x as b,y as v,A as y,B as D,C as w,D as S,E as $,G as C,n as M,S as k}from"./backdrop-pick-rLk02S_E.js";import{s as I}from"./namespace-language-qIVz1CjX.js";import"./form-kit.styles-BXaoYN6g.js";import"./floating-surface-CAk--Y2g.js";const x="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",T=I([k]);class F{constructor(t){this.host=t,this.languageRuntime=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(i){const l=`${i}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,i)&&s(h,l)?a`<hp-help data-help-key=${i}
|
||||
.text=${o(h,i)} .ariaLabel=${o(h,l)}></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=i(e),a=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?l(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:c(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:r({},e.settings),northDegInput:null===r({},e.settings)?"":String(r({},e.settings)),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:o.tempMin,tempMax:o.tempMax,tempMinInput:String(o.tempMin),tempMaxInput:String(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:n(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,...m(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,northDegInput:"",sunRays:null,tempMin:_,tempMax:d,tempMinInput:String(_),tempMaxInput:String(d),showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:n(e,this.host._imperial),cellCmTouched:!1,busy:!1},b(this.host,this.host._spaceDialog)}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const o=await v(this.host,e);o&&this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:o})}_renderBackdropGuard(){return y(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,i=a?.saved?.find(s=>s.name===t);if(o&&a&&i&&i.url===e.url&&i.modified===e.modified&&!i.used_by.length&&i.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":""}">
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"LED-Streifen","led.hint":"Zeichnen Sie den Streifen Punkt für Punkt entlang der Wandflächen oder über den Boden; er rastet am Raster und an Wandflächen ein. Danach wählen Sie das Gerät, das er darstellt.","led.start":"Klicken, um den Streifen zu beginnen","led.start_touch":"Tippen, um den Streifen zu beginnen","led.points":"Punkte: {n} · Umschalt — 45°-Schritte · Esc — fertig · Strg+Z — Punkt entfernen","led.points_touch":"Punkte: {n} · Werkzeug wechseln zum Beenden","led.finish":"Fertig","led.stopped":"Der Streifen stößt an eine Wand","led.unbound":"Streifen ist mit keinem Gerät verbunden","led.bind":"Gerät verbinden","led.change":"Gerät wechseln","led.later":"Später","led.unbind":"Trennen","led.delete":"Streifen löschen","led.settings":"Geräteeinstellungen","led.type_note":"LED-Streifen: Form im Geräte-Editor auf dem Plan bearbeiten","led.show_strip":"Als LED-Streifen zeigen","led.show_icon":"Als Symbol zeigen","led.cancel":"Abbrechen","led.taken":"Bereits mit einem anderen LED-Streifen verbunden","led.space":"Zuerst den LED-Streifen lösen: Er gehört zu seinem Bereich","led.limit_points":"Höchstens 50 Punkte pro Streifen","led.limit_strips":"Höchstens 50 Streifen pro Bereich","led.pick_title":"Gerät für den Streifen wählen","led.pick_new":"Neues Gerät…","led.pick_empty":"Auf diesem Plan gibt es noch keine freien Geräte.","led.saved":"LED-Streifen gespeichert","led.save_failed":"Streifen nicht gespeichert: {err}","led.history_draw":"LED-Streifen","led.history_shape":"Form des LED-Streifens","led.history_view":"Darstellung des Geräts","led.optimize_walls":"Streifen durch Wände: {n} ({spaces})"};const n="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,n as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"LED-Streifen","led.hint":"Zeichnen Sie den Streifen Punkt für Punkt entlang der Wandflächen oder über den Boden; er rastet am Raster und an Wandflächen ein. Danach wählen Sie das Gerät, das er darstellt.","led.start":"Klicken, um den Streifen zu beginnen","led.start_touch":"Tippen, um den Streifen zu beginnen","led.points":"Punkte: {n} · Umschalt — 45°-Schritte · Esc — fertig · Strg+Z — Punkt entfernen","led.points_touch":"Punkte: {n} · Werkzeug wechseln zum Beenden","led.finish":"Fertig","led.stopped":"Der Streifen stößt an eine Wand","led.unbound":"Streifen ist mit keinem Gerät verbunden","led.bind":"Gerät verbinden","led.change":"Gerät wechseln","led.later":"Später","led.unbind":"Trennen","led.delete":"Streifen löschen","led.settings":"Geräteeinstellungen","led.type_note":"LED-Streifen: Form im Geräte-Editor auf dem Plan bearbeiten","led.show_strip":"Als LED-Streifen zeigen","led.show_icon":"Als Symbol zeigen","led.cancel":"Abbrechen","led.taken":"Bereits mit einem anderen LED-Streifen verbunden","led.space":"Zuerst den LED-Streifen lösen: Er gehört zu seinem Bereich","led.limit_points":"Höchstens 50 Punkte pro Streifen","led.limit_strips":"Höchstens 50 Streifen pro Bereich","led.pick_title":"Gerät für den Streifen wählen","led.pick_new":"Neues Gerät…","led.pick_empty":"Auf diesem Plan gibt es noch keine freien Geräte.","led.saved":"LED-Streifen gespeichert","led.save_failed":"Streifen nicht gespeichert: {err}","led.history_draw":"LED-Streifen","led.history_shape":"Form des LED-Streifens","led.history_view":"Darstellung des Geräts","led.optimize_walls":"Streifen durch Wände: {n} ({spaces})"};const n="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,n as fingerprint};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"Ruban LED","led.hint":"Tracez le ruban point par point le long des faces des murs ou sur le sol ; il s’aimante à la grille et aux faces des murs. Ensuite, choisissez l’appareil qu’il représente.","led.start":"Cliquez pour commencer le ruban","led.start_touch":"Touchez pour commencer le ruban","led.points":"Points : {n} · Maj — pas de 45° · Échap — terminer · Ctrl+Z — retirer le point","led.points_touch":"Points : {n} · changez d’outil pour terminer","led.finish":"Terminer","led.stopped":"Le ruban bute contre un mur","led.unbound":"Ruban non lié à un appareil","led.bind":"Lier un appareil","led.change":"Changer d’appareil","led.later":"Plus tard","led.unbind":"Délier","led.delete":"Supprimer le ruban","led.settings":"Réglages de l’appareil","led.type_note":"Ruban LED : modifiez sa forme sur le plan dans l’éditeur d’appareils","led.show_strip":"Afficher en ruban LED","led.show_icon":"Afficher en icône","led.cancel":"Annuler","led.taken":"Déjà lié à un autre ruban LED","led.space":"Détachez d’abord le ruban LED : il appartient à son espace","led.limit_points":"50 points au maximum par ruban","led.limit_strips":"50 rubans au maximum par espace","led.pick_title":"Choisissez l’appareil du ruban","led.pick_new":"Nouvel appareil…","led.pick_empty":"Aucun appareil libre sur ce plan pour l’instant.","led.saved":"Ruban LED enregistré","led.save_failed":"Ruban non enregistré : {err}","led.history_draw":"Ruban LED","led.history_shape":"Forme du ruban LED","led.history_view":"Représentation de l’appareil","led.optimize_walls":"Rubans traversant des murs : {n} ({spaces})"};const a="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,a as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"Ruban LED","led.hint":"Tracez le ruban point par point le long des faces des murs ou sur le sol ; il s’aimante à la grille et aux faces des murs. Ensuite, choisissez l’appareil qu’il représente.","led.start":"Cliquez pour commencer le ruban","led.start_touch":"Touchez pour commencer le ruban","led.points":"Points : {n} · Maj — pas de 45° · Échap — terminer · Ctrl+Z — retirer le point","led.points_touch":"Points : {n} · changez d’outil pour terminer","led.finish":"Terminer","led.stopped":"Le ruban bute contre un mur","led.unbound":"Ruban non lié à un appareil","led.bind":"Lier un appareil","led.change":"Changer d’appareil","led.later":"Plus tard","led.unbind":"Délier","led.delete":"Supprimer le ruban","led.settings":"Réglages de l’appareil","led.type_note":"Ruban LED : modifiez sa forme sur le plan dans l’éditeur d’appareils","led.show_strip":"Afficher en ruban LED","led.show_icon":"Afficher en icône","led.cancel":"Annuler","led.taken":"Déjà lié à un autre ruban LED","led.space":"Détachez d’abord le ruban LED : il appartient à son espace","led.limit_points":"50 points au maximum par ruban","led.limit_strips":"50 rubans au maximum par espace","led.pick_title":"Choisissez l’appareil du ruban","led.pick_new":"Nouvel appareil…","led.pick_empty":"Aucun appareil libre sur ce plan pour l’instant.","led.saved":"Ruban LED enregistré","led.save_failed":"Ruban non enregistré : {err}","led.history_draw":"Ruban LED","led.history_shape":"Forme du ruban LED","led.history_view":"Représentation de l’appareil","led.optimize_walls":"Rubans traversant des murs : {n} ({spaces})"};const a="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,a as fingerprint};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";var e={"led.tool":"LED-лента","led.hint":"Нарисуйте ленту по точкам вдоль граней стен или по полу — она прилипает к сетке и граням. После завершения выберите устройство, которое она показывает.","led.start":"Нажмите, чтобы начать ленту","led.start_touch":"Коснитесь, чтобы начать ленту","led.points":"Точек: {n} · Shift — шаг 45° · Esc — завершить · Ctrl+Z — убрать точку","led.points_touch":"Точек: {n} · смените инструмент, чтобы завершить","led.finish":"Завершить","led.stopped":"Лента упёрлась в стену","led.unbound":"Лента не привязана к устройству","led.bind":"Привязать устройство","led.change":"Сменить устройство","led.later":"Позже","led.unbind":"Отвязать","led.delete":"Удалить ленту","led.settings":"Настройки устройства","led.type_note":"LED-лента: форма редактируется на плане в редакторе устройств","led.show_strip":"Показывать LED-лентой","led.show_icon":"Показывать значком","led.cancel":"Отмена","led.taken":"Уже привязано к другой LED-ленте","led.space":"Сначала отвяжите LED-ленту: она принадлежит своему пространству","led.limit_points":"Не более 50 точек в ленте","led.limit_strips":"Не более 50 лент в пространстве","led.pick_title":"Выберите устройство для ленты","led.pick_new":"Новое устройство…","led.pick_empty":"На этом плане пока нет свободных устройств.","led.saved":"LED-лента сохранена","led.save_failed":"Лента не сохранена: {err}","led.history_draw":"LED-лента","led.history_shape":"Форма LED-ленты","led.history_view":"Вид устройства","led.optimize_walls":"Лент, проходящих сквозь стены: {n} ({spaces})"};const d="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";export{e as dictionary,d as fingerprint};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";var e={"led.tool":"LED-лента","led.hint":"Нарисуйте ленту по точкам вдоль граней стен или по полу — она прилипает к сетке и граням. После завершения выберите устройство, которое она показывает.","led.start":"Нажмите, чтобы начать ленту","led.start_touch":"Коснитесь, чтобы начать ленту","led.points":"Точек: {n} · Shift — шаг 45° · Esc — завершить · Ctrl+Z — убрать точку","led.points_touch":"Точек: {n} · смените инструмент, чтобы завершить","led.finish":"Завершить","led.stopped":"Лента упёрлась в стену","led.unbound":"Лента не привязана к устройству","led.bind":"Привязать устройство","led.change":"Сменить устройство","led.later":"Позже","led.unbind":"Отвязать","led.delete":"Удалить ленту","led.settings":"Настройки устройства","led.type_note":"LED-лента: форма редактируется на плане в редакторе устройств","led.show_strip":"Показывать LED-лентой","led.show_icon":"Показывать значком","led.cancel":"Отмена","led.taken":"Уже привязано к другой LED-ленте","led.space":"Сначала отвяжите LED-ленту: она принадлежит своему пространству","led.limit_points":"Не более 50 точек в ленте","led.limit_strips":"Не более 50 лент в пространстве","led.pick_title":"Выберите устройство для ленты","led.pick_new":"Новое устройство…","led.pick_empty":"На этом плане пока нет свободных устройств.","led.saved":"LED-лента сохранена","led.save_failed":"Лента не сохранена: {err}","led.history_draw":"LED-лента","led.history_shape":"Форма LED-ленты","led.history_view":"Вид устройства","led.optimize_walls":"Лент, проходящих сквозь стены: {n} ({spaces})"};const d="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";export{e as dictionary,d as fingerprint};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{eu as e,eC as t,c6 as s,eJ as o,eK as i,ad as n,ee as a,O as r,eL as l,az as d,ef as c,aL as p,eM as u,eN as h,eO as f,A as m,eP as v}from"./houseplan-card-pPShiPsn.js";import{L as g,v as w,s as $,a as _,b as y,p as k,c as b,d as C,e as P}from"./led-strip-geometry-P8XODJa_.js";const M="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";let F,L=null,U=null;function x(e,t){return L||U||F===e||""===F||(U=(void 0===F?import("./led-strip-field-D9Bcdufv.js"):import(new URL(`./led-strip-field-D9Bcdufv.js?${Date.now()}`,import.meta.url).href)).then(e=>{e.LED_FIELD_FINGERPRINT===o?L=e:F=""},()=>{F=e}).finally(()=>{U=null})),L||U?.then(()=>L&&t()),L}const D=e=>e.some(e=>e.glow&&"on"===e.state),R=e=>e.map(e=>[e[0],e[1]]),E="#383838";function A(o,i){if(!o)return null;const n=Array.isArray(o.masonryGeometry)?o.masonryGeometry:[],a=[...e(o.masonryGeometry),...o.opaqueBodies],r=[];for(const e of a)for(let t=0;t<e.length;t++){const s=e[t],o=e[(t+1)%e.length];s&&o&&r.push({a:[s[0],s[1]],b:[o[0],o[1]]})}const l=25,d=new Map;r.forEach((e,t)=>{const s=Math.floor(Math.min(e.a[0],e.b[0])/l),o=Math.floor(Math.max(e.a[0],e.b[0])/l),i=Math.floor(Math.min(e.a[1],e.b[1])/l),n=Math.floor(Math.max(e.a[1],e.b[1])/l);for(let e=s;e<=o;e++)for(let s=i;s<=n;s++){const o=`${e},${s}`,i=d.get(o);i?i.push(t):d.set(o,[t])}});const c=e=>{let t=1/0,s=1/0,o=-1/0,i=-1/0;for(const n of e)t=Math.min(t,n[0]),s=Math.min(s,n[1]),o=Math.max(o,n[0]),i=Math.max(i,n[1]);return[t,s,o,i]},p=(e,t)=>e[0]>=t[0]&&e[0]<=t[2]&&e[1]>=t[1]&&e[1]<=t[3],u=n.filter(e=>e?.[0]?.length).map(e=>({box:c(e[0]),poly:e})),h=o.opaqueBodies.map(e=>({box:c(e),body:e}));return{faces:r,inside:e=>u.some(({box:s,poly:o})=>p(e,s)&&t([e[0],e[1]],[o]))||h.some(({box:t,body:o})=>p(e,t)&&s([e[0],e[1]],o)),epsilon:i,near:e=>{const t=new Set;for(let s=Math.floor(e[0]/l);s<=Math.floor(e[2]/l);s++)for(let o=Math.floor(e[1]/l);o<=Math.floor(e[3]/l);o++)for(const e of d.get(`${s},${o}`)||[])t.add(e);return[...t].map(e=>r[e])}}}function I(e){const t=e.candidate?.sourceEid||e.device.primary||"",s=t?e.hass?.states?.[t]?.state:void 0,o="unavailable"===s||"unknown"===s||!!t&&!!e.hass&&!e.hass.states?.[t]&&!e.device.virtual,i=Number(e.device.marker?.glow_radius_cm),n=Number.isFinite(i)&&i>0?i/e.cellCm*e.gridPitch:e.defaultRadius,a=o?null:e.candidate?.appearance??null;return{strip:e.strip,device:e.device,state:o?"unavailable":a?"on":"off",glow:e.glow,appearance:a,radius:n}}const T=new WeakMap;function j(e,t,s){const o=P*s;const i=T.get(e);if(i&&i.faces===t&&i.epsilon===t?.epsilon&&i.value.t===o&&i.points.length===e.points.length&&i.points.every((t,s)=>t[0]===e.points[s][0]&&t[1]===e.points[s][1]))return i.value;const n=R(e.points),a=y(n,t,o/2),r={t:o,path:a,d:k(a)};return T.set(e,{faces:t,epsilon:t?.epsilon,points:n,value:r}),r}function G(e){if(!e.views.length)return d``;const t=e.handlers,s=[...e.views].sort((e,t)=>e.strip.id<t.strip.id?1:e.strip.id>t.strip.id?-1:0),o=e.iso;return d`<g class="led-strips" data-hp-led-strips="${s.length}"
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{eu as e,eC as t,c6 as s,eJ as o,eK as i,ad as n,ee as a,O as r,eL as l,az as d,ef as c,aL as p,eM as u,eN as h,eO as f,A as m,eP as v}from"./houseplan-card-BOhGeQlv.js";import{L as g,v as w,s as $,a as y,b as _,p as k,c as b,d as C,e as P}from"./led-strip-geometry-CFq4tPIv.js";const M="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";let F,L=null,U=null;function x(e,t){return L||U||F===e||""===F||(U=(void 0===F?import("./led-strip-field-DYtgd8wB.js"):import(new URL(`./led-strip-field-DYtgd8wB.js?${Date.now()}`,import.meta.url).href)).then(e=>{e.LED_FIELD_FINGERPRINT===o?L=e:F=""},()=>{F=e}).finally(()=>{U=null})),L||U?.then(()=>L&&t()),L}const D=e=>e.some(e=>e.glow&&"on"===e.state),R=e=>e.map(e=>[e[0],e[1]]),E="#383838";function A(o,i){if(!o)return null;const n=Array.isArray(o.masonryGeometry)?o.masonryGeometry:[],a=[...e(o.masonryGeometry),...o.opaqueBodies],r=[];for(const e of a)for(let t=0;t<e.length;t++){const s=e[t],o=e[(t+1)%e.length];s&&o&&r.push({a:[s[0],s[1]],b:[o[0],o[1]]})}const l=25,d=new Map;r.forEach((e,t)=>{const s=Math.floor(Math.min(e.a[0],e.b[0])/l),o=Math.floor(Math.max(e.a[0],e.b[0])/l),i=Math.floor(Math.min(e.a[1],e.b[1])/l),n=Math.floor(Math.max(e.a[1],e.b[1])/l);for(let e=s;e<=o;e++)for(let s=i;s<=n;s++){const o=`${e},${s}`,i=d.get(o);i?i.push(t):d.set(o,[t])}});const c=e=>{let t=1/0,s=1/0,o=-1/0,i=-1/0;for(const n of e)t=Math.min(t,n[0]),s=Math.min(s,n[1]),o=Math.max(o,n[0]),i=Math.max(i,n[1]);return[t,s,o,i]},p=(e,t)=>e[0]>=t[0]&&e[0]<=t[2]&&e[1]>=t[1]&&e[1]<=t[3],u=n.filter(e=>e?.[0]?.length).map(e=>({box:c(e[0]),poly:e})),h=o.opaqueBodies.map(e=>({box:c(e),body:e}));return{faces:r,inside:e=>u.some(({box:s,poly:o})=>p(e,s)&&t([e[0],e[1]],[o]))||h.some(({box:t,body:o})=>p(e,t)&&s([e[0],e[1]],o)),epsilon:i,near:e=>{const t=new Set;for(let s=Math.floor(e[0]/l);s<=Math.floor(e[2]/l);s++)for(let o=Math.floor(e[1]/l);o<=Math.floor(e[3]/l);o++)for(const e of d.get(`${s},${o}`)||[])t.add(e);return[...t].map(e=>r[e])}}}function I(e){const t=e.candidate?.sourceEid||e.device.primary||"",s=t?e.hass?.states?.[t]?.state:void 0,o="unavailable"===s||"unknown"===s||!!t&&!!e.hass&&!e.hass.states?.[t]&&!e.device.virtual,i=Number(e.device.marker?.glow_radius_cm),n=Number.isFinite(i)&&i>0?i/e.cellCm*e.gridPitch:e.defaultRadius,a=o?null:e.candidate?.appearance??null;return{strip:e.strip,device:e.device,state:o?"unavailable":a?"on":"off",glow:e.glow,appearance:a,radius:n}}const T=new WeakMap;function j(e,t,s){const o=P*s;const i=T.get(e);if(i&&i.faces===t&&i.epsilon===t?.epsilon&&i.value.t===o&&i.points.length===e.points.length&&i.points.every((t,s)=>t[0]===e.points[s][0]&&t[1]===e.points[s][1]))return i.value;const n=R(e.points),a=_(n,t,o/2),r={t:o,path:a,d:k(a)};return T.set(e,{faces:t,epsilon:t?.epsilon,points:n,value:r}),r}function G(e){if(!e.views.length)return d``;const t=e.handlers,s=[...e.views].sort((e,t)=>e.strip.id<t.strip.id?1:e.strip.id>t.strip.id?-1:0),o=e.iso;return d`<g class="led-strips" data-hp-led-strips="${s.length}"
|
||||
data-hp-iso=${o?"raised":m}>
|
||||
${o?d`<defs><filter id="hp-led-iso-shadow" filterUnits="userSpaceOnUse"
|
||||
x="-100000" y="-100000" width="200000" height="200000">
|
||||
@@ -44,4 +44,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2
|
||||
@blur=${()=>t.blur(p)}></path>`:m}
|
||||
</g>
|
||||
</g>`})}
|
||||
</g>`}function H(e,t,s,o){return(t?e.find(e=>e.id===t):void 0)??(s?e.find(e=>o(s,e)):void 0)}function N(e){const t=new Map(e.devices.map(e=>[e.id,e])),s=g/e.cellCm*e.gridPitch,o=new Map(i({hass:e.hass,devices:e.devices,virtualLights:e.virtualLights,spaceId:e.space.id,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,defaultRadiusUnits:s,cellCm:e.cellCm,gridPitch:e.gridPitch,position:()=>({x:0,y:0})}).map(e=>[e.key,e])),r=[];for(const i of e.space.led_strips||[]){if(!1===i?.active||!i.marker||!w(i.points))continue;const a={...i,points:i.points.map(e=>[e[0]*n,e[1]*n])},l=t.get(a.marker);if(!l||l.space!==e.space.id)continue;if(l.hidden&&!e.showHidden)continue;const d=H(e.space.rooms,l.marker?.room_id,$(R(a.points)),e.inRoom);r.push(I({strip:a,device:l,candidate:o.get(`${e.space.id}|${l.id}`)??null,hass:e.hass,glow:!!d&&e.glowFor(d),defaultRadius:s,cellCm:e.cellCm,gridPitch:e.gridPitch}))}const l=_/e.cellCm*e.gridPitch;return{views:r,faces:A(e.scene,l),d:e.iconPct/100*a(e.space),scene:e.scene,polygons:e.polygons}}const q=new WeakMap;function B(e){for(const t of q.get(e)?.frame.views??[])T.delete(t.strip);q.delete(e),L?.releaseLedField(e)}function S(e){return{shapes:q.get(e)?.frame.views.length??0,...L?.ledFieldStats(e)??{visibility:0,sources:0,visibilityPaths:0,pathChars:0,recomputes:0}}}function O(e,t,s){const o=t.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),i=o.length?e._lightBarriers(t,o.map(({room:e,poly:t})=>({r:e,poly:t}))):null,n=[t,e._renderDevices,e._renderPlanHass,s,i,e._mode,e._showAll],a=q.get(e);if(a&&a.key.every((e,t)=>e===n[t]))return a.frame;for(const e of a?.frame.views??[])T.delete(e.strip);const d=e._config?.icon_size??2.5,c=N({space:t,devices:e._renderDevices,hass:e._renderPlanHass,virtualLights:e._virtualLights,defaultColor:e._fillColors.glow_light.c,paletteAlpha:e._fillColors.glow_light.a,cellCm:e._cellCm,gridPitch:e._gridPitch,iconPct:d>8?2.5:d,scene:i,polygons:o,glowFor:e=>l(s,e),inRoom:(t,s)=>e._pointInRoom(t,s),showHidden:"devices"===e._mode&&e._showAll});return!1!==e.isConnected&&q.set(e,{key:n,frame:c}),c}function W(e,t,s,o){const i=O(e,t,s),n=e._stageEl?.clientWidth,a="iso"===e._renderProjection&&"view"===e._mode,r=a?i.d*c:i.d,l="theme-dark"===p(e._renderPlanHass)?"dark":"light",m=!!e._isoLightFloors?.size,v=u(l,m),g=G({views:i.views,d:r,iso:a?{lift:f.lift*r,depth:f.depth*r,edge:h(E,l,m),shadow:{dx:v.dx*r,dy:v.dy*r,sigma:v.sigma*r,opacity:v.opacityWhite}}:null,faces:i.faces,perUnit:n&&o.w?n/o.w:1,handlers:"view"===e._mode?{click:(t,s)=>e._clickDevice(t,s),keydown:(t,s)=>e._keyDevice(t,s),contextmenu:(t,s)=>e._ctxDevice(t,s),pointerdown:(t,s)=>e._pointerDown(t,s),pointermove:(t,s)=>{const o=e._pointerMove(t,s);o&&e._showDeviceTip(t,o)},pointerup:(t,s)=>e._pointerUp(t,s),pointercancel:(t,s)=>e._pointerCancel(t,s),pointerover:(t,s)=>e._showDeviceTip(t,s),pointerleave:()=>e._clearPointerHover(),focus:(t,s)=>e._showDeviceFocusTip(t,s),blur:t=>e._hideDeviceFocusTip(t.id),label:e=>e.name}:null});return"plan"===e._mode||"decor"===e._mode?d`<g class="led-passive" opacity="0.45" pointer-events="none">${g}</g>`:g}function z(e,t,s){if(!1===e.isConnected)return d``;const o=O(e,t,s),i=o.scene&&(D(o.views)||L?.hasLedField(e))?L||x(t.id,()=>!1!==e.isConnected&&e.requestUpdate()):null;return i?i.renderLedField({views:o.views,scene:o.scene,polygons:o.polygons,faces:o.faces,spaceId:t.id,owner:e,requestUpdate:()=>e.requestUpdate(),isConnected:()=>!1!==e.isConnected}):d``}function Y(e){const t=e.space.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),s=N({space:e.space,devices:e.devices,hass:e.hass,virtualLights:e.virtualLights,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,cellCm:e.cellCm,gridPitch:e.gridPitch,iconPct:e.iconPct,scene:e.scene,polygons:t,glowFor:e.glowFor,inRoom:e.inRoom,showHidden:!1}),o=e.live?s.views:s.views.map(e=>({...e,state:"off",appearance:null,glow:!1})),i=A({masonryGeometry:e.bodies.masonryGeometry,opaqueBodies:e.bodies.opaqueBodies},_/e.cellCm*e.gridPitch),n=e.isConnected()&&e.scene&&e.live&&(D(o)||L?.hasLedField(e.owner))?x(e.space.id,()=>e.isConnected()&&e.ready()):null;return n||L?.releaseLedField(e.owner),d`${n?n.renderLedField({views:o,scene:e.scene,polygons:t,faces:i,spaceId:e.space.id,owner:e.owner,requestUpdate:e.ready,isConnected:e.isConnected}):m}${G({views:o,d:s.d,faces:i,perUnit:e.perUnit,handlers:null})}`}export{M as LED_RUNTIME_FINGERPRINT,A as faceContext,x as ledField,N as ledFrame,O as ledFrameFor,S as ledStats,I as ledStripView,j as ledStripePath,B as releaseLed,z as renderLedFieldFor,W as renderLedLayerFor,G as renderLedStripes,Y as renderStaticLed,H as stripRoom};
|
||||
</g>`}function H(e,t,s,o){return(t?e.find(e=>e.id===t):void 0)??(s?e.find(e=>o(s,e)):void 0)}function N(e){const t=new Map(e.devices.map(e=>[e.id,e])),s=g/e.cellCm*e.gridPitch,o=new Map(i({hass:e.hass,devices:e.devices,virtualLights:e.virtualLights,spaceId:e.space.id,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,defaultRadiusUnits:s,cellCm:e.cellCm,gridPitch:e.gridPitch,position:()=>({x:0,y:0})}).map(e=>[e.key,e])),r=[];for(const i of e.space.led_strips||[]){if(!1===i?.active||!i.marker||!w(i.points))continue;const a={...i,points:i.points.map(e=>[e[0]*n,e[1]*n])},l=t.get(a.marker);if(!l||l.space!==e.space.id)continue;if(l.hidden&&!e.showHidden)continue;const d=H(e.space.rooms,l.marker?.room_id,$(R(a.points)),e.inRoom);r.push(I({strip:a,device:l,candidate:o.get(`${e.space.id}|${l.id}`)??null,hass:e.hass,glow:!!d&&e.glowFor(d),defaultRadius:s,cellCm:e.cellCm,gridPitch:e.gridPitch}))}const l=y/e.cellCm*e.gridPitch;return{views:r,faces:A(e.scene,l),d:e.iconPct/100*a(e.space),scene:e.scene,polygons:e.polygons}}const q=new WeakMap;function B(e){for(const t of q.get(e)?.frame.views??[])T.delete(t.strip);q.delete(e),L?.releaseLedField(e)}function S(e){return{shapes:q.get(e)?.frame.views.length??0,...L?.ledFieldStats(e)??{visibility:0,sources:0,visibilityPaths:0,pathChars:0,recomputes:0}}}function O(e,t,s){const o=t.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),i=o.length?e._lightBarriers(t,o.map(({room:e,poly:t})=>({r:e,poly:t}))):null,n=[t,e._renderDevices,e._renderPlanHass,s,i,e._mode,e._showAll],a=q.get(e);if(a&&a.key.every((e,t)=>e===n[t]))return a.frame;for(const e of a?.frame.views??[])T.delete(e.strip);const d=e._config?.icon_size??2.5,c=N({space:t,devices:e._renderDevices,hass:e._renderPlanHass,virtualLights:e._virtualLights,defaultColor:e._fillColors.glow_light.c,paletteAlpha:e._fillColors.glow_light.a,cellCm:e._cellCm,gridPitch:e._gridPitch,iconPct:d>8?2.5:d,scene:i,polygons:o,glowFor:e=>l(s,e),inRoom:(t,s)=>e._pointInRoom(t,s),showHidden:"devices"===e._mode&&e._showAll});return!1!==e.isConnected&&q.set(e,{key:n,frame:c}),c}function W(e,t,s,o){const i=O(e,t,s),n=e._stageEl?.clientWidth,a="iso"===e._renderProjection&&"view"===e._mode,r=a?i.d*c:i.d,l="theme-dark"===p(e._renderPlanHass)?"dark":"light",m=!!e._isoLightFloors?.size,v=u(l,m),g=G({views:i.views,d:r,iso:a?{lift:f.lift*r,depth:f.depth*r,edge:h(E,l,m),shadow:{dx:v.dx*r,dy:v.dy*r,sigma:v.sigma*r,opacity:v.opacityWhite}}:null,faces:i.faces,perUnit:n&&o.w?n/o.w:1,handlers:"view"===e._mode?{click:(t,s)=>e._clickDevice(t,s),keydown:(t,s)=>e._keyDevice(t,s),contextmenu:(t,s)=>e._ctxDevice(t,s),pointerdown:(t,s)=>e._pointerDown(t,s),pointermove:(t,s)=>{const o=e._pointerMove(t,s);o&&e._showDeviceTip(t,o)},pointerup:(t,s)=>e._pointerUp(t,s),pointercancel:(t,s)=>e._pointerCancel(t,s),pointerover:(t,s)=>e._showDeviceTip(t,s),pointerleave:()=>e._clearPointerHover(),focus:(t,s)=>e._showDeviceFocusTip(t,s),blur:t=>e._hideDeviceFocusTip(t.id),label:e=>e.name}:null});return"plan"===e._mode||"decor"===e._mode?d`<g class="led-passive" opacity="0.45" pointer-events="none">${g}</g>`:g}function z(e,t,s){if(!1===e.isConnected)return d``;const o=O(e,t,s),i=o.scene&&(D(o.views)||L?.hasLedField(e))?L||x(t.id,()=>!1!==e.isConnected&&e.requestUpdate()):null;return i?i.renderLedField({views:o.views,scene:o.scene,polygons:o.polygons,faces:o.faces,spaceId:t.id,owner:e,requestUpdate:()=>e.requestUpdate(),isConnected:()=>!1!==e.isConnected}):d``}function Y(e){const t=e.space.rooms.flatMap(e=>{const t=r(e);return t?[{room:e,poly:t}]:[]}),s=N({space:e.space,devices:e.devices,hass:e.hass,virtualLights:e.virtualLights,defaultColor:e.defaultColor,paletteAlpha:e.paletteAlpha,cellCm:e.cellCm,gridPitch:e.gridPitch,iconPct:e.iconPct,scene:e.scene,polygons:t,glowFor:e.glowFor,inRoom:e.inRoom,showHidden:!1}),o=e.live?s.views:s.views.map(e=>({...e,state:"off",appearance:null,glow:!1})),i=A({masonryGeometry:e.bodies.masonryGeometry,opaqueBodies:e.bodies.opaqueBodies},y/e.cellCm*e.gridPitch),n=e.isConnected()&&e.scene&&e.live&&(D(o)||L?.hasLedField(e.owner))?x(e.space.id,()=>e.isConnected()&&e.ready()):null;return n||L?.releaseLedField(e.owner),d`${n?n.renderLedField({views:o,scene:e.scene,polygons:t,faces:i,spaceId:e.space.id,owner:e.owner,requestUpdate:e.ready,isConnected:e.isConnected}):m}${G({views:o,d:s.d,faces:i,perUnit:e.perUnit,handlers:null})}`}export{M as LED_RUNTIME_FINGERPRINT,A as faceContext,x as ledField,N as ledFrame,O as ledFrameFor,S as ledStats,I as ledStripView,j as ledStripePath,B as releaseLed,z as renderLedFieldFor,W as renderLedLayerFor,G as renderLedStripes,Y as renderStaticLed,H as stripRoom};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";const t=t=>[t.left,t.top,t.right,t.bottom,t.width,t.height].every(Number.isFinite)&&t.right>=t.left&&t.bottom>=t.top&&t.width>=0&&t.height>=0;function o(o){const{preferred:e,size:i,bounds:h,blockers:r,gap:f=8,edge:n=8}=o;if(![e.x,e.y,i.width,i.height,f,n].every(Number.isFinite)||i.width<=0||i.height<=0||f<0||n<0||!t(h)||r.some(o=>!t(o)))return null;const s=h.left+n,d=h.right-n-i.width,l=h.top+n,a=h.bottom-n-i.height;if(![s,d,l,a].every(Number.isFinite)||d<s||a<l)return null;const b=r.filter(t=>t.right>t.left&&t.bottom>t.top).map(t=>({left:t.left-f-i.width,right:t.right+f,top:t.top-f-i.height,bottom:t.bottom+f})),g=(t,o,e)=>Math.max(o,Math.min(e,t)),m=new Set([s,d,g(e.x,s,d)]),p=new Set([l,a,g(e.y,l,a)]);for(const t of b)m.add(g(t.left,s,d)),m.add(g(t.right,s,d)),p.add(g(t.top,l,a)),p.add(g(t.bottom,l,a));const c=[...m].sort((t,o)=>t-o),u=[...p].sort((t,o)=>t-o);let w=null,y=1/0;for(const t of u)for(const o of c){if(b.some(e=>o>e.left&&o<e.right&&t>e.top&&t<e.bottom))continue;const i=Math.hypot(o-e.x,t-e.y);(!w||i<y)&&(w={left:o,top:t},y=i)}return w}export{o as p};
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{eR as a,eS as e,eG as n}from"./houseplan-card-pPShiPsn.js";function c(n,c){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:c.ru},{code:"de",loadDictionary:c.de},{code:"fr",loadDictionary:c.fr}],"dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a",console.warn,e)}function d(a){return function(a,e){return{state:n=>{const c=a.state(n);return"pending"!==c&&e.some(a=>"pending"===a.state(n))?"pending":c},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{c as n,d as s};
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{eR as a,eS as e,eG as n}from"./houseplan-card-BOhGeQlv.js";function o(n,o){return new a([{code:"en",dictionary:n},{code:"ru",loadDictionary:o.ru},{code:"de",loadDictionary:o.de},{code:"fr",loadDictionary:o.fr}],"2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83",console.warn,e)}function r(a){return function(a,e){return{state:n=>{const o=a.state(n);return"pending"!==o&&e.some(a=>"pending"===a.state(n))?"pending":o},dictionary:e=>a.dictionary(e),ensure:n=>Promise.all([a,...e].map(a=>a.ensure(n))).then(()=>{})}}(n,a)}export{o as n,r as s};
|
||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
@@ -1,6 +1,6 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{aG as e,l as t,aJ as s,A as a,eF as o,eG as i,eH as n,E as c,eQ as l,c as r}from"./houseplan-card-pPShiPsn.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!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}))}catch{this._spaces=[]}finally{this._spacesLoading=!1}}}get _lang(){return t(this.hass,this._config?.language)}get _schema(){const e=this._spaces||[];return[e.length?{name:"space",selector:{select:{mode:"dropdown",options:e}}}:{name:"space",selector:{text:{}}},{name:"title",selector:{text:{}}},{name:"fit",selector:{select:{mode:"dropdown",options:[{value:"content",label:s(this._lang,"editor.fit_content")},{value:"house",label:s(this._lang,"editor.fit_house")}]}}},{name:"show_button",selector:{boolean:{}}},{name:"button_label",selector:{text:{}}},{name:"button_target",selector:{text:{}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"light_pools",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}}]}render(){if(!this.hass||!this._config)return a;const e=o(this,i,t(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return c;this._loadSpaces();const h=this._lang,_={space:s(h,"editor.space"),title:s(h,"editor.title"),fit:s(h,"editor.framing"),show_button:s(h,"editor.show_button"),button_label:s(h,"editor.button_label"),button_target:s(h,"editor.button_target"),icon_size:s(h,"editor.icon_size"),show_temperature:s(h,"editor.show_temperature"),live_states:s(h,"editor.live_states"),light_pools:s(h,"editor.light_pools"),show_signal:s(h,"editor.show_signal")};return r`<ha-form
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{aG as e,l as t,aJ as s,A as a,eF as o,eG as i,eH as n,E as l,eQ as c,c as r}from"./houseplan-card-BOhGeQlv.js";class h extends e{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!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}))}catch{this._spaces=[]}finally{this._spacesLoading=!1}}}get _lang(){return t(this.hass,this._config?.language)}get _schema(){const e=this._spaces||[];return[e.length?{name:"space",selector:{select:{mode:"dropdown",options:e}}}:{name:"space",selector:{text:{}}},{name:"title",selector:{text:{}}},{name:"fit",selector:{select:{mode:"dropdown",options:[{value:"content",label:s(this._lang,"editor.fit_content")},{value:"house",label:s(this._lang,"editor.fit_house")}]}}},{name:"show_button",selector:{boolean:{}}},{name:"button_label",selector:{text:{}}},{name:"button_target",selector:{text:{}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"light_pools",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}}]}render(){if(!this.hass||!this._config)return a;const e=o(this,i,t(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return l;this._loadSpaces();const h=this._lang,_={space:s(h,"editor.space"),title:s(h,"editor.title"),fit:s(h,"editor.framing"),show_button:s(h,"editor.show_button"),button_label:s(h,"editor.button_label"),button_target:s(h,"editor.button_target"),icon_size:s(h,"editor.icon_size"),show_temperature:s(h,"editor.show_temperature"),live_states:s(h,"editor.live_states"),light_pools:s(h,"editor.light_pools"),show_signal:s(h,"editor.show_signal")};return r`<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{...this._config,fit:l(this._config.fit)}}
|
||||
.data=${{...this._config,fit:c(this._config.fit)}}
|
||||
.schema=${this._schema}
|
||||
.computeLabel=${e=>_[e.name]||e.name}
|
||||
@value-changed=${this._valueChanged}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{c as a,A as s}from"./houseplan-card-pPShiPsn.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-C4YDg3Cx.js";import"./form-kit.styles-BC5W6ya6.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{c as a,A as s}from"./houseplan-card-BOhGeQlv.js";import{s as e,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-Gm80_eMo.js";import"./form-kit.styles-BXaoYN6g.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!e(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(s=>s.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`<label class="summary-switch" for="summary-local-show">
|
||||
<span class="summary-switch-caption"><strong>${b("summary.show_local")}</strong>
|
||||
<small id="summary-local-show-hint">${b("summary.show_local_hint")}</small></span>
|
||||
<input id="summary-local-show" data-summary-local-show type="checkbox"
|
||||
+1
-1
@@ -1 +1 @@
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="dc3dfa138b65dd4dbfbcf5c445aaca4447e2f81c3885f5c63a9f380a1bfa2a1a";import{e$ as e,O as t,b5 as n,M as i,af as o,ad as r,cf as s,f0 as a,ce as c,b4 as l,b3 as d,b6 as u,f1 as f,f2 as m,ch as g,f3 as v}from"./houseplan-card-pPShiPsn.js";function y(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,c="entity"===r?e.registry.entities?.[s]:null,l="device"===r?s:c?.device_id,d="device"===r?a?.area_id:c?.area_id||l&&e.registry.devices?.[l]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;l&&e.registry.devices?.[l]&&e.spaceIds.has(f)&&(!n.devices.has(l)||"entity"===r&&n.liveEntities.has(s))&&t.add(l)}return t}function _(e,t){return e?.length?t?.length?v(e,t):e:t}function h(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:d(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*p(l,d,u=h){try{let f=0;for(const m of d){const d=l.spaces.find(e=>String(e?.id)===m.id);if(!d)continue;const g=e(d,m),v=u(m,g);let y=null;for(const e of m.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const c=n(m.rooms,e.id,g.walls,g.openCuts,i,g.cellCm,o,r,v.roomGeom,v.multiWallNodes)||a;y=_(y,s(c,g.physicalBodies)),yield}const h=a(y||[],m.stairs);let p=h.next();for(;!p.done;)yield,p=h.next();y=p.value;const b=g.cellCm/o;f+=c(y)*b*b/1e4}return f}catch{return null}}function b(e,t,n=h){const i=p(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function S(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:g(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function C(e,t){const n=e?.states?.[t];if(!n)return null;const i=f(e,t);return i?m(i,String(n.attributes?.unit_of_measurement||"")):null}export{p as cleanFloorAreaSteps,y as representedHaDeviceIds,h as spaceWallGeometry,C as summaryEntityValue,S as summarySystemValue,b as totalCleanFloorAreaM2};
|
||||
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="2b8ff615f3468a97d8f68ae4207e75d7cbb972f222fa241ba26a675f2d433a83";import{e$ as e,O as t,b5 as n,M as i,af as o,ad as r,cf as s,f0 as a,ce as l,b4 as c,b3 as d,b6 as u,f1 as f,f2 as m,ch as g,f3 as v}from"./houseplan-card-BOhGeQlv.js";function y(e){if(!e.registry.authoritative)return null;const t=new Set,n=u(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const o=String(i.binding||"").indexOf(":");if(o<1)continue;const r=i.binding.slice(0,o),s=i.binding.slice(o+1),a="device"===r?e.registry.devices?.[s]:null,l="entity"===r?e.registry.entities?.[s]:null,c="device"===r?s:l?.device_id,d="device"===r?a?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function _(e,t){return e?.length?t?.length?v(e,t):e:t}function h(e,t){const n=c(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:d(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*p(c,d,u=h){try{let f=0;for(const m of d){const d=c.spaces.find(e=>String(e?.id)===m.id);if(!d)continue;const g=e(d,m),v=u(m,g);let y=null;for(const e of m.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const l=n(m.rooms,e.id,g.walls,g.openCuts,i,g.cellCm,o,r,v.roomGeom,v.multiWallNodes)||a;y=_(y,s(l,g.physicalBodies)),yield}const h=a(y||[],m.stairs);let p=h.next();for(;!p.done;)yield,p=h.next();y=p.value;const b=g.cellCm/o;f+=l(y)*b*b/1e4}return f}catch{return null}}function b(e,t,n=h){const i=p(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function S(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:g(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function C(e,t){const n=e?.states?.[t];if(!n)return null;const i=f(e,t);return i?m(i,String(n.attributes?.unit_of_measurement||"")):null}export{p as cleanFloorAreaSteps,y as representedHaDeviceIds,h as spaceWallGeometry,C as summaryEntityValue,S as summarySystemValue,b as totalCleanFloorAreaM2};
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user