boneio 1.5.0.dev14__tar.gz → 1.5.0.dev16__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.5.0.dev14/boneio.egg-info → boneio-1.5.0.dev16}/PKG-INFO +1 -1
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/detectors.py +68 -6
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/event.py +13 -5
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/remote.py +4 -2
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/yaml_util.py +11 -5
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/manager.py +25 -6
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/input/manager.py +47 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/schema.yaml +3 -2
- boneio-1.5.0.dev16/boneio/version.py +2 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/app.py +4 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/BindingMatrix-aj3riWWZ.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/BindingMatrix-N4U3h23x.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/ConfigEditor-Blrg9Au1.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/ConfigEditor-7lrI515C.js +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/EditItemDialog-oy_RxyLT.js +66 -0
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/EntityCard-CFNwM6yD.js +1 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/EntityGrid-B6mC4OZ8.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/EntityGrid-Dx1159Xv.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/HelpView-Dv8mWMWx.js +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/InputsView-BZXrHZ3a.js +1 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/LogViewer-U1DEZ2mc.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/LogViewer-CTJgb29a.js +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/LongPressWrapper-dK08bxTq.js +1 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/ModbusView-MqeWOSDT.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/ModbusView-BYUDUuBY.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/NodeRedView-CNPh9Kak.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/NodeRedView-D51S6jJz.js +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/OutputsView-CP8T6Qup.js +1 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/SearchableEntityPicker-BkToxzQ2.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/SensorView-DW85dbP7.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/SensorView-CmIHZhYj.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/SudoPasswordDialog-C9jQ6QtB.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/SudoPasswordDialog-Bs3QsVht.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/SystemState-A6TNdNT0.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/SystemState-C4-cP7PG.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/TemplatesView-Bmu7KfpS.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/TemplatesView-CGVDVkNz.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/Tools-C-qgHesX.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/Tools-CYJ9Ktdm.js +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/UISettings-C4VOOiNr.js +38 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/dialog-Dj_HN1ZA.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/dialog-BU8NEGDX.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/gi-Dt8p1sub.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/gi-vR5MbJTo.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/index-Dr8Eea_x.css +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/index-CyBZuJ67.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/index-TqLppANT.js +2 -2
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +1 -0
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D8uh5ILp.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-zKyE4dME.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/select-Bxh-o8g9.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/select-BCf3z8Z2.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/tabs-box-Bjw4Iwcm.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/tabs-box-BEUKm2Md.js +1 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/useTranslation-Blvt5Lad.js +2 -2
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/utils-BmlJVtvk.js → boneio-1.5.0.dev16/boneio/webui/frontend-dist/assets/utils-Blsvr7Ya.js +1 -1
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/index.html +3 -3
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/config.schema.json +1 -1
- {boneio-1.5.0.dev14/boneio/webui → boneio-1.5.0.dev16/boneio/webui/frontend-dist}/schema/event.schema.json +1 -1
- boneio-1.5.0.dev16/boneio/webui/frontend-dist/sw.js +1 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/__init__.py +2 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/config.py +15 -13
- boneio-1.5.0.dev16/boneio/webui/routes/mqtt_reference.py +363 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/config.schema.json +1 -1
- {boneio-1.5.0.dev14/boneio/webui/frontend-dist → boneio-1.5.0.dev16/boneio/webui}/schema/event.schema.json +1 -1
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio.egg-info/SOURCES.txt +30 -28
- boneio-1.5.0.dev14/boneio/version.py +0 -2
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/EditItemDialog-cJc7C25R.js +0 -66
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/EntityCard-CVnjkl2Y.js +0 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/InputsView-C09ulmeN.js +0 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +0 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/OutputsView-uXH9nyRR.js +0 -1
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/assets/UISettings-B_Vt1ikn.js +0 -38
- boneio-1.5.0.dev14/boneio/webui/frontend-dist/sw.js +0 -1
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/LICENSE +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/MANIFEST.in +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/README.md +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/bonecli.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/cover/cover.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/group/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/group/output_group.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/basic.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/mcp.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/pca.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/output/pcf.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/template/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/const.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/package.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/discovery.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/events/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/events/bus.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/covers.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/display.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/remote.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/templates.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/manager/update.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/local.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/can.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/wled.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/sensor/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/sensor/system.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/state/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/state/manager.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/system/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/system/host_data.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/system/monitor.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/filter.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/logger.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/core/utils/util.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/exceptions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/client.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/node.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/integration/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/integration/interlock.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/integration/lox_template.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/actions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/runner.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/cli.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/client.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/modbus/utils.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/actions.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/events.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/files.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/logs.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/mqtt.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/models/state.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/runner.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/actions.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/condition.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/filters.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/id.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/action_validation.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/can.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/system.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/routes/update.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/services/logs.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/web_server.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/pyproject.toml +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/setup.cfg +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/setup.py +0 -0
- {boneio-1.5.0.dev14 → boneio-1.5.0.dev16}/tests/test_py313_compatibility.py +0 -0
|
@@ -65,6 +65,9 @@ class MultiClickDetector:
|
|
|
65
65
|
Based on multiclick_detector.py from tests.
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
|
+
# How often (in seconds) to verify physical GPIO state during long press
|
|
69
|
+
_GPIO_READBACK_INTERVAL_S = 3.0
|
|
70
|
+
|
|
68
71
|
def __init__(
|
|
69
72
|
self,
|
|
70
73
|
loop: asyncio.AbstractEventLoop,
|
|
@@ -78,7 +81,7 @@ class MultiClickDetector:
|
|
|
78
81
|
enable_triple_click: bool = False,
|
|
79
82
|
name: str = "unknown",
|
|
80
83
|
pin: str = "unknown",
|
|
81
|
-
max_long_press_seconds: float =
|
|
84
|
+
max_long_press_seconds: float = 30.0,
|
|
82
85
|
):
|
|
83
86
|
"""Initialize multiclick detector.
|
|
84
87
|
|
|
@@ -94,7 +97,7 @@ class MultiClickDetector:
|
|
|
94
97
|
enable_triple_click: Enable triple click detection (default: False)
|
|
95
98
|
name: Name of the input
|
|
96
99
|
pin: Pin name for logging
|
|
97
|
-
max_long_press_seconds: Safety timeout for long press in seconds (default:
|
|
100
|
+
max_long_press_seconds: Safety timeout for long press in seconds (default: 30s)
|
|
98
101
|
"""
|
|
99
102
|
self._loop = loop
|
|
100
103
|
self._callback = callback
|
|
@@ -107,9 +110,19 @@ class MultiClickDetector:
|
|
|
107
110
|
self._enable_triple_click = enable_triple_click
|
|
108
111
|
self._name = name
|
|
109
112
|
self._pin = pin
|
|
110
|
-
self._max_long_press_seconds = max_long_press_seconds
|
|
113
|
+
self._max_long_press_seconds = min(max_long_press_seconds, 30.0)
|
|
111
114
|
self._state = ClickState()
|
|
112
115
|
self._boot_press_suppressed = False # Set by GpioManager._seed_initial_states
|
|
116
|
+
# Optional GPIO readback function: returns True if pin is HIGH (released)
|
|
117
|
+
# Set by GpioManager after startup to enable physical state verification
|
|
118
|
+
self._gpio_readback_fn: Callable[[], bool | None] | None = None
|
|
119
|
+
# Track last readback time to avoid reading GPIO too often
|
|
120
|
+
self._last_readback_time: float = 0.0
|
|
121
|
+
|
|
122
|
+
_LOGGER.debug(
|
|
123
|
+
"MultiClickDetector init: %s (%s) max_long_press=%.1fs",
|
|
124
|
+
name, pin, self._max_long_press_seconds,
|
|
125
|
+
)
|
|
113
126
|
|
|
114
127
|
# Pre-compute which click types should be delayed in exclusive mode
|
|
115
128
|
# based on enabled sequences
|
|
@@ -363,15 +376,20 @@ class MultiClickDetector:
|
|
|
363
376
|
def _detect_long_press(self) -> None:
|
|
364
377
|
"""Detect and report a long press and start periodic updates."""
|
|
365
378
|
if not self._state.last_press_loop_ts:
|
|
379
|
+
_LOGGER.debug(
|
|
380
|
+
"_detect_long_press called for %s but no last_press_loop_ts — ignoring",
|
|
381
|
+
self._name,
|
|
382
|
+
)
|
|
366
383
|
return
|
|
367
384
|
|
|
368
385
|
# Reset executed actions for new long press
|
|
369
386
|
self._state.executed_long_actions = set()
|
|
370
387
|
self._state.last_repeat_times = {}
|
|
388
|
+
self._last_readback_time = self._loop.time() # Reset readback timer
|
|
371
389
|
|
|
372
390
|
duration = self._loop.time() - self._state.last_press_loop_ts
|
|
373
391
|
|
|
374
|
-
_LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
|
|
392
|
+
_LOGGER.info("Detected LONG press on %s (%s), duration=%.3fs", self._name, self._pin, duration)
|
|
375
393
|
|
|
376
394
|
self._state.click_count = 0 # Reset click counter
|
|
377
395
|
self._state.long_press_timer = None
|
|
@@ -385,14 +403,29 @@ class MultiClickDetector:
|
|
|
385
403
|
0.2, # 200ms
|
|
386
404
|
self._send_periodic_long_event
|
|
387
405
|
)
|
|
406
|
+
_LOGGER.debug(
|
|
407
|
+
"Started periodic long timer for %s (interval=200ms, max=%.0fs)",
|
|
408
|
+
self._name, self._max_long_press_seconds,
|
|
409
|
+
)
|
|
388
410
|
|
|
389
411
|
def _send_periodic_long_event(self) -> None:
|
|
390
|
-
"""Send periodic 'long' event with updated duration.
|
|
412
|
+
"""Send periodic 'long' event with updated duration.
|
|
413
|
+
|
|
414
|
+
Every _GPIO_READBACK_INTERVAL_S seconds, also reads the physical
|
|
415
|
+
GPIO state to detect missed RELEASE edge events.
|
|
416
|
+
"""
|
|
391
417
|
if not self._state.last_press_loop_ts or self._state.last_release_ts:
|
|
392
418
|
# Button released or invalid state
|
|
419
|
+
_LOGGER.debug(
|
|
420
|
+
"Periodic long skipped for %s: press_ts=%s, release_ts=%s",
|
|
421
|
+
self._name,
|
|
422
|
+
self._state.last_press_loop_ts is not None,
|
|
423
|
+
self._state.last_release_ts,
|
|
424
|
+
)
|
|
393
425
|
return
|
|
394
426
|
|
|
395
|
-
|
|
427
|
+
now = self._loop.time()
|
|
428
|
+
duration = now - self._state.last_press_loop_ts
|
|
396
429
|
|
|
397
430
|
# Safety timeout: stop periodic events if duration exceeds max
|
|
398
431
|
if duration > self._max_long_press_seconds:
|
|
@@ -407,6 +440,35 @@ class MultiClickDetector:
|
|
|
407
440
|
self._force_stop_long_press()
|
|
408
441
|
return
|
|
409
442
|
|
|
443
|
+
# GPIO readback check: every _GPIO_READBACK_INTERVAL_S, verify physical
|
|
444
|
+
# pin state to catch missed RELEASE edge events (EMI, kernel bugs, etc.)
|
|
445
|
+
if (
|
|
446
|
+
self._gpio_readback_fn is not None
|
|
447
|
+
and (now - self._last_readback_time) >= self._GPIO_READBACK_INTERVAL_S
|
|
448
|
+
):
|
|
449
|
+
self._last_readback_time = now
|
|
450
|
+
try:
|
|
451
|
+
pin_is_high = self._gpio_readback_fn()
|
|
452
|
+
if pin_is_high is not None and pin_is_high:
|
|
453
|
+
# Pin is HIGH = button released (pull-up), but we never got RISING_EDGE
|
|
454
|
+
_LOGGER.warning(
|
|
455
|
+
"GPIO readback: %s (%s) pin is HIGH (released) but no RELEASE event received! "
|
|
456
|
+
"duration=%.1fs. Forcing stop — likely missed RISING_EDGE.",
|
|
457
|
+
self._name,
|
|
458
|
+
self._pin,
|
|
459
|
+
duration,
|
|
460
|
+
)
|
|
461
|
+
self._force_stop_long_press()
|
|
462
|
+
return
|
|
463
|
+
_LOGGER.debug(
|
|
464
|
+
"GPIO readback: %s (%s) pin is LOW (still pressed), duration=%.1fs",
|
|
465
|
+
self._name, self._pin, duration,
|
|
466
|
+
)
|
|
467
|
+
except Exception as exc:
|
|
468
|
+
_LOGGER.debug(
|
|
469
|
+
"GPIO readback failed for %s: %s", self._name, exc,
|
|
470
|
+
)
|
|
471
|
+
|
|
410
472
|
_LOGGER.debug(
|
|
411
473
|
"Periodic long event on %s (%s), duration=%.3fs",
|
|
412
474
|
self._name,
|
|
@@ -80,24 +80,32 @@ class GpioEventButton(GpioBaseClass):
|
|
|
80
80
|
# Get enable_triple_click setting (default: False)
|
|
81
81
|
enable_triple_click = kwargs.get("enable_triple_click", False)
|
|
82
82
|
|
|
83
|
-
# Safety timeout for long press (default:
|
|
83
|
+
# Safety timeout for long press (default: 30s, hard max: 30s)
|
|
84
84
|
max_long_press_seconds = (
|
|
85
85
|
_to_milliseconds(
|
|
86
86
|
kwargs.get("max_long_press_duration"),
|
|
87
|
-
|
|
87
|
+
30 * 1000, # 30s default
|
|
88
88
|
)
|
|
89
89
|
/ 1000.0
|
|
90
90
|
)
|
|
91
|
-
#
|
|
91
|
+
# Clamp to hard maximum of 30s — no one holds a button longer
|
|
92
|
+
if max_long_press_seconds > 30.0:
|
|
93
|
+
_LOGGER.info(
|
|
94
|
+
"max_long_press_duration for %s clamped from %.1fs to 30s (hard max)",
|
|
95
|
+
kwargs.get("name", "unknown"),
|
|
96
|
+
max_long_press_seconds,
|
|
97
|
+
)
|
|
98
|
+
max_long_press_seconds = 30.0
|
|
99
|
+
# Guard: if resolved to < 0.8s (misconfigured or zero), use default 30s
|
|
92
100
|
if max_long_press_seconds < 0.8:
|
|
93
101
|
raw = kwargs.get("max_long_press_duration")
|
|
94
102
|
if raw is not None:
|
|
95
103
|
_LOGGER.warning(
|
|
96
|
-
"max_long_press_duration for %s resolved to %.1fs (too small), using default
|
|
104
|
+
"max_long_press_duration for %s resolved to %.1fs (too small), using default 30s",
|
|
97
105
|
kwargs.get("name", "unknown"),
|
|
98
106
|
max_long_press_seconds,
|
|
99
107
|
)
|
|
100
|
-
max_long_press_seconds =
|
|
108
|
+
max_long_press_seconds = 30.0
|
|
101
109
|
_LOGGER.debug(
|
|
102
110
|
"max_long_press_seconds for %s = %.1fs",
|
|
103
111
|
kwargs.get("name", "unknown"),
|
|
@@ -79,6 +79,7 @@ class RemoteOutputBase:
|
|
|
79
79
|
duration_min: float = 1.0,
|
|
80
80
|
duration_max: float = 3600.0,
|
|
81
81
|
duration_unit: str = "s",
|
|
82
|
+
supports_brightness: bool = False,
|
|
82
83
|
) -> None:
|
|
83
84
|
self._id = id
|
|
84
85
|
self._name = name
|
|
@@ -117,6 +118,7 @@ class RemoteOutputBase:
|
|
|
117
118
|
self._state: str = OFF
|
|
118
119
|
self._last_timestamp: float = 0.0
|
|
119
120
|
self._available: bool = False
|
|
121
|
+
self._supports_brightness: bool = supports_brightness
|
|
120
122
|
self._brightness: int | None = None # 0-255, None if not a dimmable light
|
|
121
123
|
self._loop: asyncio.AbstractEventLoop | None = None
|
|
122
124
|
|
|
@@ -233,9 +235,9 @@ class RemoteOutputBase:
|
|
|
233
235
|
)
|
|
234
236
|
return
|
|
235
237
|
|
|
236
|
-
# If
|
|
238
|
+
# If output supports brightness, initialize brightness to 0 so the
|
|
237
239
|
# slider renders immediately (will update on first state event).
|
|
238
|
-
if self.
|
|
240
|
+
if self._supports_brightness:
|
|
239
241
|
self._brightness = 0
|
|
240
242
|
_LOGGER.debug(
|
|
241
243
|
"Initialized brightness=0 for remote light '%s' (no state yet)",
|
|
@@ -302,22 +302,28 @@ def normalize_board_name(name: str) -> str:
|
|
|
302
302
|
return name
|
|
303
303
|
|
|
304
304
|
|
|
305
|
-
def normalize_version(version: str) -> str:
|
|
305
|
+
def normalize_version(version: str | float | int) -> str:
|
|
306
306
|
"""Normalize version to major.minor format.
|
|
307
307
|
|
|
308
|
+
Handles both string and numeric versions (YAML may parse
|
|
309
|
+
``version: 0.7`` as float 0.7 instead of string "0.7").
|
|
310
|
+
|
|
308
311
|
Examples:
|
|
309
312
|
0.7.1 -> 0.7
|
|
310
313
|
0.8.2 -> 0.8
|
|
311
314
|
0.9 -> 0.9
|
|
312
315
|
"""
|
|
313
|
-
if not version:
|
|
314
|
-
return version
|
|
316
|
+
if not version and version != 0:
|
|
317
|
+
return str(version) if version is not None else ""
|
|
318
|
+
|
|
319
|
+
# YAML may parse e.g. 0.7 as float — convert to string first
|
|
320
|
+
version_str = str(version)
|
|
315
321
|
|
|
316
322
|
# Split by dot and take only the first two parts (major.minor)
|
|
317
|
-
parts =
|
|
323
|
+
parts = version_str.split(".")
|
|
318
324
|
if len(parts) >= 2:
|
|
319
325
|
return f"{parts[0]}.{parts[1]}"
|
|
320
|
-
return
|
|
326
|
+
return version_str
|
|
321
327
|
|
|
322
328
|
|
|
323
329
|
def merge_board_config(config: dict) -> dict:
|
|
@@ -53,8 +53,10 @@ from boneio.core.manager.update import UpdateManager
|
|
|
53
53
|
from boneio.core.messaging import MessageBus
|
|
54
54
|
from boneio.core.state import StateManager
|
|
55
55
|
from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
|
|
56
|
+
from boneio.components.output.remote import RemoteOutputBase
|
|
57
|
+
from boneio.core.remote.wled import WLEDRemoteDevice
|
|
56
58
|
from boneio.hardware.i2c.bus import SMBus2I2C
|
|
57
|
-
from boneio.migrations import MigrationRunner
|
|
59
|
+
from boneio.migrations import MigrationRunner
|
|
58
60
|
|
|
59
61
|
if TYPE_CHECKING:
|
|
60
62
|
pass
|
|
@@ -854,13 +856,13 @@ class Manager:
|
|
|
854
856
|
OutputManager, so they are resolved via ``entity_type='output'``.
|
|
855
857
|
|
|
856
858
|
Args:
|
|
857
|
-
entity_type: Entity type ('binary_sensor', 'cover', 'output', 'light')
|
|
859
|
+
entity_type: Entity type ('binary_sensor', 'cover', 'output', 'light', 'remote_output')
|
|
858
860
|
entity_id: Entity ID
|
|
859
861
|
|
|
860
862
|
Returns:
|
|
861
863
|
Entity object or None if not found
|
|
862
864
|
"""
|
|
863
|
-
if entity_type in ("output", "light"):
|
|
865
|
+
if entity_type in ("output", "light", "remote_output"):
|
|
864
866
|
return self.outputs.get_output(entity_id) or self.outputs.get_output_group(entity_id)
|
|
865
867
|
if entity_type == "cover":
|
|
866
868
|
return self.covers.get_cover(entity_id)
|
|
@@ -1357,8 +1359,6 @@ class Manager:
|
|
|
1357
1359
|
:class:`OutputManager` so they are available for irrigation,
|
|
1358
1360
|
output groups, and frontend display.
|
|
1359
1361
|
"""
|
|
1360
|
-
from boneio.components.output.remote import RemoteOutputBase
|
|
1361
|
-
|
|
1362
1362
|
config = self._config_helper.get_config()
|
|
1363
1363
|
remote_outputs_config: list[dict] = config.get("remote_outputs", [])
|
|
1364
1364
|
|
|
@@ -1397,7 +1397,6 @@ class Manager:
|
|
|
1397
1397
|
|
|
1398
1398
|
# Adjustable duration
|
|
1399
1399
|
adjustable_duration_enabled = bool(out_cfg.get("adjustable_duration", False))
|
|
1400
|
-
from boneio.core.utils.timeperiod import parse_time_to_seconds
|
|
1401
1400
|
|
|
1402
1401
|
dur_default = parse_time_to_seconds(out_cfg.get("duration_default"), 60.0)
|
|
1403
1402
|
dur_min = max(1.0, parse_time_to_seconds(out_cfg.get("duration_min"), 1.0))
|
|
@@ -1412,6 +1411,22 @@ class Manager:
|
|
|
1412
1411
|
)
|
|
1413
1412
|
continue
|
|
1414
1413
|
|
|
1414
|
+
# Determine brightness support from device entity data
|
|
1415
|
+
sup_brightness = False
|
|
1416
|
+
if output_type == "light":
|
|
1417
|
+
device = self.remote_devices.get_device(device_id)
|
|
1418
|
+
if device is not None:
|
|
1419
|
+
# WLED: all outputs support brightness
|
|
1420
|
+
if isinstance(device, WLEDRemoteDevice):
|
|
1421
|
+
sup_brightness = True
|
|
1422
|
+
else:
|
|
1423
|
+
# ESPHome: check _lights list for supports_brightness flag
|
|
1424
|
+
lights_list: list[dict] = getattr(device, "_lights", [])
|
|
1425
|
+
for light in lights_list:
|
|
1426
|
+
if light.get("id") == output_id:
|
|
1427
|
+
sup_brightness = bool(light.get("supports_brightness", False))
|
|
1428
|
+
break
|
|
1429
|
+
|
|
1415
1430
|
remote_output = RemoteOutputBase(
|
|
1416
1431
|
id=entity_id,
|
|
1417
1432
|
name=name,
|
|
@@ -1435,6 +1450,7 @@ class Manager:
|
|
|
1435
1450
|
duration_min=dur_min,
|
|
1436
1451
|
duration_max=dur_max,
|
|
1437
1452
|
duration_unit=dur_unit,
|
|
1453
|
+
supports_brightness=sup_brightness,
|
|
1438
1454
|
)
|
|
1439
1455
|
|
|
1440
1456
|
# Register in shared interlock manager
|
|
@@ -1590,6 +1606,9 @@ class Manager:
|
|
|
1590
1606
|
self._config_helper.set_areas(config.get("areas", []))
|
|
1591
1607
|
except Exception as e:
|
|
1592
1608
|
_LOGGER.error(f"Failed to reload config: {e}")
|
|
1609
|
+
# Safety net: if fast-reload fails, force-clear cache so the next
|
|
1610
|
+
# get_config() re-reads from disk (via full validation as fallback).
|
|
1611
|
+
self._config_helper._config_cache = None
|
|
1593
1612
|
return {"status": "error", "message": str(e), "reloaded_sections": [], "failed_sections": []}
|
|
1594
1613
|
|
|
1595
1614
|
reloaded_sections = []
|
|
@@ -354,6 +354,53 @@ class GpioManager:
|
|
|
354
354
|
"Armed boot press suppression on %d GPIO detector(s)", seeded
|
|
355
355
|
)
|
|
356
356
|
|
|
357
|
+
# Install GPIO readback callbacks on detectors for missed-RELEASE detection.
|
|
358
|
+
# During long press, detectors periodically call this to verify the physical
|
|
359
|
+
# pin state hasn't changed without an edge event.
|
|
360
|
+
self._install_gpio_readback()
|
|
361
|
+
|
|
362
|
+
def _install_gpio_readback(self) -> None:
|
|
363
|
+
"""Install GPIO readback callbacks on MultiClickDetectors.
|
|
364
|
+
|
|
365
|
+
Creates a closure for each detector that reads the physical GPIO line state
|
|
366
|
+
via gpiod get_values(). The detector calls this every ~3s during long press
|
|
367
|
+
to catch missed RISING_EDGE events (EMI, kernel bugs, etc.).
|
|
368
|
+
"""
|
|
369
|
+
from boneio.components.input.detectors import MultiClickDetector
|
|
370
|
+
|
|
371
|
+
installed = 0
|
|
372
|
+
for chip, request in self._requests.items():
|
|
373
|
+
for (c, line), detector in self._detectors.items():
|
|
374
|
+
if c != chip:
|
|
375
|
+
continue
|
|
376
|
+
if not isinstance(detector, MultiClickDetector):
|
|
377
|
+
continue
|
|
378
|
+
|
|
379
|
+
# Create a closure capturing this specific chip/line/request
|
|
380
|
+
def make_readback(req: gpiod.LineRequest, ln: int) -> Callable[[], bool | None]:
|
|
381
|
+
"""Create readback function for a specific GPIO line.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
req: gpiod LineRequest for this chip.
|
|
385
|
+
ln: Line offset within the chip.
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
Function returning True if pin is HIGH (released), False if LOW.
|
|
389
|
+
"""
|
|
390
|
+
def readback() -> bool | None:
|
|
391
|
+
values = req.get_values([ln])
|
|
392
|
+
return bool(values[0])
|
|
393
|
+
return readback
|
|
394
|
+
|
|
395
|
+
detector._gpio_readback_fn = make_readback(request, line)
|
|
396
|
+
installed += 1
|
|
397
|
+
|
|
398
|
+
if installed:
|
|
399
|
+
_LOGGER.info(
|
|
400
|
+
"Installed GPIO readback on %d MultiClickDetector(s) for missed-RELEASE detection",
|
|
401
|
+
installed,
|
|
402
|
+
)
|
|
403
|
+
|
|
357
404
|
def _handle_gpiod_events(self, chip: int, request: gpiod.LineRequest) -> None:
|
|
358
405
|
"""Handle GPIO events from libgpiod.
|
|
359
406
|
|
|
@@ -1279,13 +1279,14 @@ event:
|
|
|
1279
1279
|
- str
|
|
1280
1280
|
- positive_time_period
|
|
1281
1281
|
required: False
|
|
1282
|
-
default: '
|
|
1282
|
+
default: '30s'
|
|
1283
1283
|
meta:
|
|
1284
1284
|
label: Max Long Press Duration
|
|
1285
1285
|
description: |
|
|
1286
|
-
Safety timeout for long press
|
|
1286
|
+
Safety timeout for long press (hard max: 30s).
|
|
1287
1287
|
If a long press exceeds this duration, it is automatically stopped.
|
|
1288
1288
|
Prevents infinite long press events when RELEASE edge is missed (e.g., due to EMI or hardware issues).
|
|
1289
|
+
Values above 30s are clamped to 30s.
|
|
1289
1290
|
mqtt_sequences:
|
|
1290
1291
|
required: False
|
|
1291
1292
|
type: dict
|
|
@@ -55,6 +55,7 @@ from boneio.webui.routes import (
|
|
|
55
55
|
irrigation_router,
|
|
56
56
|
migrations_router,
|
|
57
57
|
modbus_router,
|
|
58
|
+
mqtt_reference_router,
|
|
58
59
|
outputs_router,
|
|
59
60
|
remote_devices_router,
|
|
60
61
|
sensors_router,
|
|
@@ -156,6 +157,7 @@ app.include_router(remote_devices_router)
|
|
|
156
157
|
app.include_router(templates_router)
|
|
157
158
|
app.include_router(tools_router)
|
|
158
159
|
app.include_router(migrations_router)
|
|
160
|
+
app.include_router(mqtt_reference_router)
|
|
159
161
|
|
|
160
162
|
app.include_router(dev_fake_device_router)
|
|
161
163
|
|
|
@@ -166,6 +168,7 @@ from boneio.webui.routes import dashboard as dashboard_module
|
|
|
166
168
|
from boneio.webui.routes import irrigation as irrigation_module
|
|
167
169
|
from boneio.webui.routes import migrations as migrations_module
|
|
168
170
|
from boneio.webui.routes import modbus as modbus_module
|
|
171
|
+
from boneio.webui.routes import mqtt_reference as mqtt_reference_module
|
|
169
172
|
from boneio.webui.routes import outputs as outputs_module
|
|
170
173
|
from boneio.webui.routes import remote_devices as remote_devices_module
|
|
171
174
|
from boneio.webui.routes import sensors as sensors_module
|
|
@@ -185,6 +188,7 @@ app.dependency_overrides[update_module.get_manager] = get_manager
|
|
|
185
188
|
app.dependency_overrides[migrations_module._get_manager] = get_manager
|
|
186
189
|
app.dependency_overrides[templates_module.get_manager] = get_manager
|
|
187
190
|
app.dependency_overrides[tools_module.get_manager] = get_manager
|
|
191
|
+
app.dependency_overrides[mqtt_reference_module.get_manager] = get_manager
|
|
188
192
|
|
|
189
193
|
from boneio.webui.routes import dev_fake_device as dev_fake_device_module
|
|
190
194
|
app.dependency_overrides[dev_fake_device_module.get_manager] = get_manager
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{y as n}from"./vendor-DjFmndpd.js";import{t as r}from"./useTranslation-DWIecEyP.js";import{$ as i,B as a,C as o,I as s,It as c,N as l,Pt as u,U as d,Ut as f,Wt as p,b as m,s as h,ut as g,y as _,z as v}from"./index-CyBZuJ67.js";import{t as y}from"./EditItemDialog-cJc7C25R.js";var b=e(t(),1);function x(e){return p({tag:`svg`,attr:{viewBox:`0 0 512 512`},child:[{tag:`path`,attr:{d:`M224 0c17.7 0 32 14.3 32 32l0 12 96-12c17.7 0 32 14.3 32 32s-14.3 32-32 32L256 84l-31-3.9-1-.1-1 .1L192 84 96 96C78.3 96 64 81.7 64 64s14.3-32 32-32l96 12 0-12c0-17.7 14.3-32 32-32zM0 224c0-17.7 14.3-32 32-32l96 0 22.6-22.6c6-6 14.1-9.4 22.6-9.4l18.7 0 0-43.8 32-4 32 4 0 43.8 18.7 0c8.5 0 16.6 3.4 22.6 9.4L320 192l32 0c88.4 0 160 71.6 160 160c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32s-14.3-32-32-32l-36.1 0c-20.2 29-53.9 48-91.9 48s-71.7-19-91.9-48L32 320c-17.7 0-32-14.3-32-32l0-64zM436.8 423.4c1.9-4.5 6.3-7.4 11.2-7.4s9.2 2.9 11.2 7.4l18.2 42.4c1.8 4.1 2.7 8.6 2.7 13.1l0 1.2c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-1.2c0-4.5 .9-8.9 2.7-13.1l18.2-42.4z`},child:[]}]})(e)}var S=n();function C({outputType:e,className:t}){switch(e){case`light`:return(0,S.jsx)(i,{className:h(`text-warning`,t)});case`switch`:return(0,S.jsx)(c,{className:h(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:h(`text-accent`,t)});case`cover`:return(0,S.jsx)(l,{className:h(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:h(`text-secondary`,t)});default:return null}}var w={single:`1×`,double:`2×`,triple:`3×`,long:`L`,pressed:`P`,released:`R`,double_then_long:`2×L`,single_then_long:`1×L`,double_then_single:`2×1`},T={TOGGLE:`short_toggle`,ON:`short_on`,OFF:`short_off`,OPEN:`short_open`,CLOSE:`short_close`,STOP:`short_stop`},E=[{key:`single`,labelKey:`binding_matrix.legend_single`,icon:`1×`},{key:`double`,labelKey:`binding_matrix.legend_double`,icon:`2×`},{key:`triple`,labelKey:`binding_matrix.legend_triple`,icon:`3×`},{key:`long`,labelKey:`binding_matrix.legend_long`,icon:`L`},{key:`pressed`,labelKey:`binding_matrix.legend_pressed`,icon:`P`},{key:`released`,labelKey:`binding_matrix.legend_released`,icon:`R`}],D=[{labelKey:`actions.toggle`,shortKey:`actions.short_toggle`},{labelKey:`actions.on`,shortKey:`actions.short_on`},{labelKey:`actions.off`,shortKey:`actions.short_off`},{labelKey:`actions.open`,shortKey:`actions.short_open`},{labelKey:`actions.close`,shortKey:`actions.short_close`},{labelKey:`actions.stop`,shortKey:`actions.short_stop`}],O={single:`single`,double:`double`,triple:`triple`,long:`long`,pressed:`basic`,released:`basic`,double_then_long:`sequences`,single_then_long:`sequences`,double_then_single:`sequences`};function k(e,t){let n=w[e.clickType]||e.clickType,r=T[e.actionValue];return`${n} ${r?t(`actions.${r}`):e.actionValue}`}function A(e,t){let n=`actions.${e.actionValue.toLowerCase()}`,r=t(n),i=r===n?e.actionValue:r;return`${e.clickType} → ${i}`}function j(e){let t=e.action||`output`,n=``,r=``,i;switch(t){case`output`:n=e.boneio_output||``,r=e.action_output||`TOGGLE`;break;case`cover`:n=e.boneio_cover||``,r=e.action_cover||`TOGGLE`;break;case`remote_output`:i=e.boneio_id||``,n=i?`${i}/${e.output_id||``}`:e.output_id||``,r=e.action_output||`TOGGLE`;break;case`remote_cover`:i=e.boneio_id||``,n=i?`${i}/${e.cover_id||``}`:e.cover_id||``,r=e.action_cover||`TOGGLE`;break;default:n=``,r=e.action_output||e.action_cover||``;break}return{targetId:n,actionType:t,actionValue:r,remoteDevice:i}}function M(e){let t=[],n=[`single`,`double`,`triple`,`long`,`pressed`,`released`,`double_then_long`,`single_then_long`,`double_then_single`],r=e.local_inputs||[];for(let e=0;e<r.length;e++){let i=r[e],a=i.id||i.pin||`local_${e}`,o=[];for(let e of n){let t=i.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&o.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:a,name:i.name||i.id||i.pin||a,area:i.area||void 0,type:`local`,bindings:o})}let i=e.remote_inputs||[];for(let e=0;e<i.length;e++){let r=i[e],a=r.boneio_id||r.remote_device||``,o=r.id||r.entity_id||``,s=a?`${a}/${o}`:o||`remote_${e}`,c=[];for(let e of n){let t=r.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&c.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:s,name:r.name||r.id||o,area:r.area||void 0,type:`remote`,remoteDevice:a,bindings:c})}return t}function N(e){let t=[],n=e.output||[];for(let e=0;e<n.length;e++){let r=n[e];if(r.output_type===`cover`||r.output_type===`none`)continue;let i=r.id||`output_${e}`;t.push({id:i,name:r.name||r.id||i,area:r.area||void 0,type:`output`,outputType:r.output_type})}let r=e.cover||[];for(let e=0;e<r.length;e++){let n=r[e],i=n.id||`cover_${e}`;t.push({id:i,name:n.name||n.id||i,area:n.area||void 0,type:`cover`,outputType:n.device_class||`cover`})}let i=e.remote_outputs||[];for(let e=0;e<i.length;e++){let n=i[e],r=n.boneio_id||n.remote_device||``,a=n.id||n.output_id||``,o=r?`${r}/${a}`:a||`remote_out_${e}`;t.push({id:o,name:n.name||n.id||a,area:n.area||void 0,type:`remote_output`,remoteDevice:r,outputType:n.output_type})}return t}function P({inputs:e,outputs:t,t:n}){let r=e.filter(e=>e.type===`local`),i=e.filter(e=>e.type===`remote`),a=t.filter(e=>e.type===`output`),o=t.filter(e=>e.type===`cover`),s=t.filter(e=>e.type===`remote_output`||e.type===`remote_cover`),c=r.filter(e=>e.bindings.length>0),l=i.filter(e=>e.bindings.length>0),u=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),d=a.filter(e=>u.has(e.id)),f=o.filter(e=>u.has(e.id)),p=s.filter(e=>u.has(e.id)),m=e.reduce((e,t)=>e+t.bindings.length,0);return(0,S.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3 mb-4`,children:[(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50`,children:n(`binding_matrix.local`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,r.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,r.length-c.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`💡 `,n(`binding_matrix.outputs`),`: `,a.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,a.length-d.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`🚪 `,n(`binding_matrix.covers`),`: `,o.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`bg-info/5 rounded-xl p-3 border border-info/20 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-info/70`,children:n(`binding_matrix.remote`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,i.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,i.length-l.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📡 `,n(`binding_matrix.outputs`),`: `,s.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`bg-primary/5 rounded-xl p-3 border border-primary/20 flex flex-col justify-center`,children:[(0,S.jsx)(`p`,{className:`text-2xl font-extrabold text-primary`,children:m}),(0,S.jsx)(`p`,{className:`text-xs font-medium text-primary/70`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50 mb-1.5`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-0.5`,children:E.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:e.icon}),` `,n(e.labelKey)]},e.key))}),(0,S.jsx)(`div`,{className:`border-t border-base-300 mt-1.5 pt-1.5 grid grid-cols-3 gap-x-2 gap-y-0.5`,children:D.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:n(e.shortKey)}),` `,n(e.labelKey)]},e.shortKey))})]})]})}function F({inputs:e,outputs:t,t:n}){let[r,i]=(0,b.useState)(!0),[a,c]=(0,b.useState)(!0),l=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),u=e.filter(e=>e.type===`local`&&e.bindings.length===0),d=t.filter(e=>e.type===`output`&&!l.has(e.id)),f=t.filter(e=>e.type===`cover`&&!l.has(e.id)),p=e.filter(e=>e.type===`remote`&&e.bindings.length===0),h=t.filter(e=>(e.type===`remote_output`||e.type===`remote_cover`)&&!l.has(e.id)),g=u.length>0||d.length>0||f.length>0,_=p.length>0||h.length>0;return!g&&!_?null:(0,S.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[g&&(0,S.jsxs)(`div`,{className:`border border-warning/20 rounded-xl bg-warning/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-warning hover:bg-warning/10 transition-colors`,onClick:()=>i(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[u.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_inputs`)} (${u.length})`,items:u.map(e=>({id:e.id,name:e.name,area:e.area}))}),d.length>0&&(0,S.jsx)(I,{title:`💡 ${n(`binding_matrix.free_outputs`)} (${d.length})`,items:d.map(e=>({id:e.id,name:e.name,area:e.area}))}),f.length>0&&(0,S.jsx)(I,{title:`🚪 ${n(`binding_matrix.free_covers`)} (${f.length})`,items:f.map(e=>({id:e.id,name:e.name,area:e.area}))})]})]}),_&&(0,S.jsxs)(`div`,{className:`border border-info/20 rounded-xl bg-info/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-info hover:bg-info/10 transition-colors`,onClick:()=>c(!a),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),a?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),a&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[p.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_remote_inputs`)} (${p.length})`,items:p.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))}),h.length>0&&(0,S.jsx)(I,{title:`📡 ${n(`binding_matrix.free_remote_outputs`)} (${h.length})`,items:h.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))})]})]})]})}function I({title:e,items:t}){return(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`text-xs font-semibold text-base-content/60 mb-1`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`badge badge-sm badge-ghost text-xxs font-mono gap-1`,title:e.id,children:[e.name,e.area&&(0,S.jsxs)(`span`,{className:`text-base-content/40`,children:[`(`,e.area,`)`]}),e.badge&&(0,S.jsxs)(`span`,{className:`text-info/60`,children:[`[`,e.badge,`]`]})]},e.id))})]})}function ee({inputs:e,outputs:t,areaFilter:n,hideEmpty:r,t:i,onEditInput:a,onEditOutput:o}){let[s,c]=(0,b.useState)(null),[l,u]=(0,b.useState)(null),d=(0,b.useRef)(null),f=(0,b.useRef)(!1),p=(0,b.useRef)(!1),m=(0,b.useRef)(0),_=(0,b.useRef)(0),[v,y]=(0,b.useState)(null),x=(0,b.useRef)(null),w=(0,b.useCallback)((e,t,n)=>{n||(e.preventDefault(),y({x:e.clientX,y:e.clientY,row:t}))},[]),T=(0,b.useCallback)((e,t,n)=>{if(n)return;let r=`touches`in e?{x:e.touches[0].clientX,y:e.touches[0].clientY}:{x:e.clientX,y:e.clientY};x.current=setTimeout(()=>{y({...r,row:t}),x.current=null},500)},[]),D=(0,b.useCallback)(()=>{x.current&&=(clearTimeout(x.current),null)},[]);(0,b.useEffect)(()=>{if(!v)return;let e=null,t=requestAnimationFrame(()=>{let t=()=>y(null);window.addEventListener(`click`,t,{capture:!0}),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t,{capture:!0}),window.removeEventListener(`contextmenu`,t,{capture:!0}),window.removeEventListener(`scroll`,t,!0)}});return()=>{cancelAnimationFrame(t),e?.()}},[v]);let O=(0,b.useMemo)(()=>{let e=new Map;for(let n of t)e.set(n.id,n.area);return e},[t]),j=(0,b.useMemo)(()=>{let t=e;return n.size>0&&(t=t.filter(e=>{let t=e.area||`__none__`;return n.has(t)?!0:e.bindings.some(e=>{let t=O.get(e.targetId)||`__none__`;return n.has(t)})})),r&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,r,O]),M=(0,b.useMemo)(()=>new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),[e]),N=(0,b.useMemo)(()=>{let t=new Map;for(let n of e){let e=n.area||`__none__`;for(let r of n.bindings)t.has(r.targetId)||t.set(r.targetId,new Set),t.get(r.targetId).add(e)}return t},[e]),P=(0,b.useMemo)(()=>{let e=t;return n.size>0&&(e=e.filter(e=>{let t=e.area||`__none__`;if(n.has(t))return!0;let r=N.get(e.id);if(r){for(let e of r)if(n.has(e))return!0}return!1})),r&&(e=e.filter(e=>M.has(e.id))),e},[t,n,r,M,N]),F=(0,b.useMemo)(()=>{let e=new Map;for(let t of j){let n=new Map;for(let e of t.bindings){let t=n.get(e.targetId)||[];t.push(e),n.set(e.targetId,t)}e.set(t.id,n)}return e},[j]);return j.length===0||P.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:i(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:d,className:`overflow-x-auto rounded-xl border border-base-300 cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{f.current=!0,p.current=!1,m.current=e.clientX,_.current=d.current?.scrollLeft||0},onMouseMove:e=>{if(!f.current||!d.current)return;let t=e.clientX-m.current;!p.current&&Math.abs(t)>5&&(p.current=!0),p.current&&(d.current.scrollLeft=_.current-t)},onMouseUp:()=>{f.current=!1,p.current=!1},onMouseLeave:()=>{f.current=!1,p.current=!1},onClickCapture:e=>{p.current&&(e.stopPropagation(),e.preventDefault())},children:[(0,S.jsxs)(`table`,{className:`table table-xs w-auto`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{className:`sticky left-0 z-20 bg-base-200 border-r border-base-300 min-w-[120px]`}),P.map(e=>(0,S.jsxs)(`th`,{className:h(`text-center text-xxs font-bold px-2 py-2 min-w-[80px] border-r border-base-300 bg-base-200 cursor-pointer group/col whitespace-nowrap`,l===e.id&&`bg-primary/10`),onMouseEnter:()=>u(e.id),onMouseLeave:()=>u(null),onClick:()=>o(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-center gap-1`,children:[(0,S.jsx)(C,{outputType:e.outputType,className:`w-3 h-3 shrink-0`}),(0,S.jsx)(`span`,{className:`whitespace-nowrap`,children:e.name}),(0,S.jsx)(g,{className:`w-2 h-2 opacity-0 group-hover/col:opacity-40 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs font-normal text-info/50 truncate`,children:e.remoteDevice})]},e.id))]})}),(0,S.jsx)(`tbody`,{children:j.map(e=>{let t=F.get(e.id);return(0,S.jsxs)(`tr`,{className:h(`hover:bg-base-200/50`,s===e.id&&`bg-base-200/40`),onMouseEnter:()=>c(e.id),onMouseLeave:()=>c(null),children:[(0,S.jsxs)(`td`,{className:h(`sticky left-0 z-10 bg-base-100 border-r border-base-300 font-medium text-xs cursor-pointer group/row`,s===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>a(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`font-bold truncate max-w-[120px] flex items-center gap-1`,title:e.id,children:[e.name,(0,S.jsx)(g,{className:`w-2.5 h-2.5 opacity-0 group-hover/row:opacity-40 transition-opacity shrink-0`})]}),e.area&&(0,S.jsx)(`div`,{className:`text-xxs text-base-content/40`,children:e.area}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs text-info/50`,children:e.remoteDevice})]}),P.map(n=>{let r=t?.get(n.id)||[],o=s===e.id||l===n.id;return(0,S.jsx)(`td`,{className:h(`text-center text-xs border-r border-base-300 px-1 py-1`,r.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,o&&r.length>0&&`bg-success/25`,o&&r.length===0&&`bg-base-200/40`),onMouseEnter:()=>u(n.id),onMouseLeave:()=>{u(null),D()},onContextMenu:t=>w(t,e,r.length>0),onMouseDown:t=>{t.button===0&&T(t,e,r.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,r.length>0),onTouchEnd:D,onTouchMove:D,children:r.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:r.map((t,n)=>(0,S.jsx)(`button`,{className:`whitespace-nowrap cursor-pointer hover:bg-success/30 rounded px-0.5 transition-colors text-left`,onClick:()=>a(e,t.clickType),title:`${A(t,i)}\n${i(`binding_matrix.click_to_edit`)}`,children:k(t,i)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[180px] animate-in fade-in zoom-in-95 duration-100`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 text-xxs font-semibold text-base-content/40 uppercase tracking-wider`,children:i(`binding_matrix.add_action`)}),E.map(e=>(0,S.jsxs)(`button`,{className:`w-full text-left px-3 py-1.5 text-sm hover:bg-primary/10 transition-colors flex items-center gap-2`,onClick:()=>{a(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),i(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:r,onEditInput:i}){let[a,s]=(0,b.useState)(null),c=(0,b.useMemo)(()=>{let r=e;return t.size>0&&(r=r.filter(e=>{let n=e.area||`__none__`;return t.has(n)})),n&&(r=r.filter(e=>e.bindings.length>0)),r},[e,t,n]),l=(0,b.useCallback)(e=>{s(t=>t===e?null:e)},[]);return c.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:r(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:c.map(e=>{let t=a===e.id,n=e.bindings.length>0,s=new Map;for(let t of e.bindings){let e=s.get(t.targetId)||[];e.push(t),s.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:h(`rounded-xl border overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm hover:bg-base-200/30 transition-colors`,onClick:()=>n&&l(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(_,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(u,{className:`w-3.5 h-3.5 text-base-content/20 shrink-0`}),(0,S.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,S.jsx)(`span`,{className:h(`font-semibold truncate block`,!n&&`text-base-content/30`),children:e.name}),e.area&&(0,S.jsx)(`span`,{className:`text-xxs text-base-content/40`,children:e.area})]})]}),(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[n&&(0,S.jsx)(`span`,{className:`badge badge-sm badge-success font-bold`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`badge badge-xs badge-info font-mono`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(o,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`border-t border-base-300 p-3 space-y-2 bg-base-100/50`,children:[[...s.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/70 shrink-0 mt-0.5`,children:`→`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`span`,{className:`font-semibold`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:t.map((e,t)=>(0,S.jsx)(`span`,{className:`badge badge-xs badge-success font-mono gap-0.5`,children:k(e,r)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`btn btn-xs btn-primary btn-outline gap-1 mt-1`,onClick:t=>{t.stopPropagation(),i(e)},children:[(0,S.jsx)(g,{className:`w-2.5 h-2.5`}),r(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:i})=>{let{t:o}=r(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[h,g]=(0,b.useState)(!1),[_,x]=(0,b.useState)(null),[C,w]=(0,b.useState)(``),[T,E]=(0,b.useState)(-1),[D,k]=(0,b.useState)(`basic`),[A,j]=(0,b.useState)(!1),[I,L]=(0,b.useState)(!1),R=(0,b.useRef)(null),[ne,z]=(0,b.useState)(!1),[B,V]=(0,b.useState)(null),[H,re]=(0,b.useState)(``),[U,ie]=(0,b.useState)(-1),[ae,W]=(0,b.useState)(!1),G=(0,b.useRef)(null),K=(0,b.useCallback)((t,n)=>{let r=t.type===`remote`?`remote_inputs`:`local_inputs`,i=e[r]||[],a=i.findIndex((e,n)=>{if(t.type===`remote`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.entity_id||``;return(r?`${r}/${i}`:i||`remote_${n}`)===t.id}return(e.id||e.pin||`local_${n}`)===t.id});a<0||(w(r),E(a),x(JSON.parse(JSON.stringify(i[a]))),R.current=JSON.stringify(i[a]),k(n&&O[n]||`basic`),j(!1),g(!0))},[e]),oe=(0,b.useCallback)(async()=>{if(A||T<0||!_)return;let t=[...e[C]||[]];t[T]=_,L(!0);try{i(C,t),await n(C,t),g(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[_,T,C,e,A,n,i]),se=(0,b.useCallback)(()=>{g(!1),x(null)},[]),q=(0,b.useMemo)(()=>M(e),[e]),J=(0,b.useMemo)(()=>N(e),[e]),ce=(0,b.useMemo)(()=>{let e=new Set;return q.forEach(t=>{t.area&&e.add(t.area)}),J.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[q,J]),le=(0,b.useMemo)(()=>q.some(e=>!e.area)||J.some(e=>!e.area),[q,J]),Y=(0,b.useMemo)(()=>e.output||[],[e.output]),X=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Z=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),ue=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),Q=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),fe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),he=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),ge=(0,b.useCallback)(t=>{let n={output:`output`,cover:`cover`,remote_output:`remote_outputs`,remote_cover:`remote_covers`}[t.type]||`output`,r=e[n]||[],i=r.findIndex((e,n)=>{if(t.type===`remote_output`||t.type===`remote_cover`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.output_id||``;return(r?`${r}/${i}`:i||`remote_out_${n}`)===t.id}return(e.id||``)===t.id});i<0||(re(n),ie(i),V(JSON.parse(JSON.stringify(r[i]))),G.current=JSON.stringify(r[i]),z(!0))},[e]),_e=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,W(!0);try{i(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{W(!1)}},[B,U,H,e,n,i]),ve=(0,b.useCallback)(()=>{z(!1),V(null)},[]),ye=_&&R.current&&JSON.stringify(_)!==R.current,be=B&&G.current&&JSON.stringify(B)!==G.current;return(0,S.jsxs)(`div`,{className:`p-4 md:p-6 max-w-full`,children:[(0,S.jsxs)(`div`,{className:`mb-4`,children:[(0,S.jsx)(`h2`,{className:`text-xl font-extrabold tracking-tight`,children:o(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:o(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:q,outputs:J,t:o}),(0,S.jsxs)(`div`,{className:`flex flex-wrap gap-3 mb-4 items-center`,children:[(0,S.jsxs)(`div`,{className:`relative flex items-center gap-2`,children:[(0,S.jsx)(d,{className:`w-3 h-3 text-base-content/40`}),(0,S.jsxs)(`button`,{className:`btn btn-sm btn-outline gap-1 min-w-[160px] justify-between`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`truncate text-xs`,children:s.size===0?o(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?o(`binding_matrix.no_area`):[...s][0]:o(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(m,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`absolute top-full left-0 mt-1 z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[200px] max-h-[300px] overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.size===0,onChange:()=>c(new Set)}),(0,S.jsx)(`span`,{className:`text-xs font-semibold`,children:o(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`border-t border-base-300 my-0.5`}),le&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(`__none__`),onChange:()=>{let e=new Set(s);e.has(`__none__`)?e.delete(`__none__`):e.add(`__none__`),c(e)}}),(0,S.jsx)(`span`,{className:`text-xs italic text-base-content/50`,children:o(`binding_matrix.no_area`)})]}),ce.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(e),onChange:()=>{let t=new Set(s);t.has(e)?t.delete(e):t.add(e),c(t)}}),(0,S.jsx)(`span`,{className:`text-xs`,children:e})]},e))]})]})]}),(0,S.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-sm checkbox-primary`,checked:f,onChange:e=>p(e.target.checked)}),(0,S.jsxs)(`span`,{className:`text-xs font-medium text-base-content/60 flex items-center gap-1`,children:[f?(0,S.jsx)(a,{className:`w-3 h-3`}):(0,S.jsx)(v,{className:`w-3 h-3`}),o(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:q,outputs:J,areaFilter:s,hideEmpty:f,t:o,onEditInput:K,onEditOutput:ge})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:q,areaFilter:s,hideEmpty:f,t:o,onEditInput:K})}),(0,S.jsx)(F,{inputs:q,outputs:J,t:o}),(0,S.jsx)(y,{open:h,onOpenChange:g,editingItem:_,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:fe,allBinarySensors:de,allEvents:Q,allOutputs:Y,allOutputGroups:Z,allCovers:X,allAreas:$,allRemoteDevices:ue,savedOutputs:Y,savedOutputGroups:Z,savedCovers:X,onChange:x,onSave:oe,onCancel:se,onValidationChange:j,saveDisabled:A||!ye,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?he:pe,uiSchema:H===`cover`?void 0:me,allOutputs:Y,allCovers:X,allAreas:$,onChange:V,onSave:_e,onCancel:ve,saveDisabled:!be,isSaving:ae})]})};export{L as default};
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{y as n}from"./vendor-DjFmndpd.js";import{t as r}from"./useTranslation-Blvt5Lad.js";import{$ as i,B as a,C as o,I as s,It as c,N as l,Pt as u,U as d,Ut as f,Wt as p,b as m,s as h,ut as g,y as _,z as v}from"./index-TqLppANT.js";import{t as y}from"./EditItemDialog-oy_RxyLT.js";var b=e(t(),1);function x(e){return p({tag:`svg`,attr:{viewBox:`0 0 512 512`},child:[{tag:`path`,attr:{d:`M224 0c17.7 0 32 14.3 32 32l0 12 96-12c17.7 0 32 14.3 32 32s-14.3 32-32 32L256 84l-31-3.9-1-.1-1 .1L192 84 96 96C78.3 96 64 81.7 64 64s14.3-32 32-32l96 12 0-12c0-17.7 14.3-32 32-32zM0 224c0-17.7 14.3-32 32-32l96 0 22.6-22.6c6-6 14.1-9.4 22.6-9.4l18.7 0 0-43.8 32-4 32 4 0 43.8 18.7 0c8.5 0 16.6 3.4 22.6 9.4L320 192l32 0c88.4 0 160 71.6 160 160c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32s-14.3-32-32-32l-36.1 0c-20.2 29-53.9 48-91.9 48s-71.7-19-91.9-48L32 320c-17.7 0-32-14.3-32-32l0-64zM436.8 423.4c1.9-4.5 6.3-7.4 11.2-7.4s9.2 2.9 11.2 7.4l18.2 42.4c1.8 4.1 2.7 8.6 2.7 13.1l0 1.2c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-1.2c0-4.5 .9-8.9 2.7-13.1l18.2-42.4z`},child:[]}]})(e)}var S=n();function C({outputType:e,className:t}){switch(e){case`light`:return(0,S.jsx)(i,{className:h(`text-warning`,t)});case`switch`:return(0,S.jsx)(c,{className:h(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:h(`text-accent`,t)});case`cover`:return(0,S.jsx)(l,{className:h(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:h(`text-secondary`,t)});default:return null}}var w={single:`1×`,double:`2×`,triple:`3×`,long:`L`,pressed:`P`,released:`R`,double_then_long:`2×L`,single_then_long:`1×L`,double_then_single:`2×1`},T={TOGGLE:`short_toggle`,ON:`short_on`,OFF:`short_off`,OPEN:`short_open`,CLOSE:`short_close`,STOP:`short_stop`},E=[{key:`single`,labelKey:`binding_matrix.legend_single`,icon:`1×`},{key:`double`,labelKey:`binding_matrix.legend_double`,icon:`2×`},{key:`triple`,labelKey:`binding_matrix.legend_triple`,icon:`3×`},{key:`long`,labelKey:`binding_matrix.legend_long`,icon:`L`},{key:`pressed`,labelKey:`binding_matrix.legend_pressed`,icon:`P`},{key:`released`,labelKey:`binding_matrix.legend_released`,icon:`R`}],D=[{labelKey:`actions.toggle`,shortKey:`actions.short_toggle`},{labelKey:`actions.on`,shortKey:`actions.short_on`},{labelKey:`actions.off`,shortKey:`actions.short_off`},{labelKey:`actions.open`,shortKey:`actions.short_open`},{labelKey:`actions.close`,shortKey:`actions.short_close`},{labelKey:`actions.stop`,shortKey:`actions.short_stop`}],O={single:`single`,double:`double`,triple:`triple`,long:`long`,pressed:`basic`,released:`basic`,double_then_long:`sequences`,single_then_long:`sequences`,double_then_single:`sequences`};function k(e,t){let n=w[e.clickType]||e.clickType,r=T[e.actionValue];return`${n} ${r?t(`actions.${r}`):e.actionValue}`}function A(e,t){let n=`actions.${e.actionValue.toLowerCase()}`,r=t(n),i=r===n?e.actionValue:r;return`${e.clickType} → ${i}`}function j(e){let t=e.action||`output`,n=``,r=``,i;switch(t){case`output`:n=e.boneio_output||``,r=e.action_output||`TOGGLE`;break;case`cover`:n=e.boneio_cover||``,r=e.action_cover||`TOGGLE`;break;case`remote_output`:i=e.boneio_id||``,n=i?`${i}/${e.output_id||``}`:e.output_id||``,r=e.action_output||`TOGGLE`;break;case`remote_cover`:i=e.boneio_id||``,n=i?`${i}/${e.cover_id||``}`:e.cover_id||``,r=e.action_cover||`TOGGLE`;break;default:n=``,r=e.action_output||e.action_cover||``;break}return{targetId:n,actionType:t,actionValue:r,remoteDevice:i}}function M(e){let t=[],n=[`single`,`double`,`triple`,`long`,`pressed`,`released`,`double_then_long`,`single_then_long`,`double_then_single`],r=e.local_inputs||[];for(let e=0;e<r.length;e++){let i=r[e],a=i.id||i.pin||`local_${e}`,o=[];for(let e of n){let t=i.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&o.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:a,name:i.name||i.id||i.pin||a,area:i.area||void 0,type:`local`,bindings:o})}let i=e.remote_inputs||[];for(let e=0;e<i.length;e++){let r=i[e],a=r.boneio_id||r.remote_device||``,o=r.id||r.entity_id||``,s=a?`${a}/${o}`:o||`remote_${e}`,c=[];for(let e of n){let t=r.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&c.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:s,name:r.name||r.id||o,area:r.area||void 0,type:`remote`,remoteDevice:a,bindings:c})}return t}function N(e){let t=[],n=e.output||[];for(let e=0;e<n.length;e++){let r=n[e];if(r.output_type===`cover`||r.output_type===`none`)continue;let i=r.id||`output_${e}`;t.push({id:i,name:r.name||r.id||i,area:r.area||void 0,type:`output`,outputType:r.output_type})}let r=e.cover||[];for(let e=0;e<r.length;e++){let n=r[e],i=n.id||`cover_${e}`;t.push({id:i,name:n.name||n.id||i,area:n.area||void 0,type:`cover`,outputType:n.device_class||`cover`})}let i=e.remote_outputs||[];for(let e=0;e<i.length;e++){let n=i[e],r=n.boneio_id||n.remote_device||``,a=n.id||n.output_id||``,o=r?`${r}/${a}`:a||`remote_out_${e}`;t.push({id:o,name:n.name||n.id||a,area:n.area||void 0,type:`remote_output`,remoteDevice:r,outputType:n.output_type})}return t}function P({inputs:e,outputs:t,t:n}){let r=e.filter(e=>e.type===`local`),i=e.filter(e=>e.type===`remote`),a=t.filter(e=>e.type===`output`),o=t.filter(e=>e.type===`cover`),s=t.filter(e=>e.type===`remote_output`||e.type===`remote_cover`),c=r.filter(e=>e.bindings.length>0),l=i.filter(e=>e.bindings.length>0),u=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),d=a.filter(e=>u.has(e.id)),f=o.filter(e=>u.has(e.id)),p=s.filter(e=>u.has(e.id)),m=e.reduce((e,t)=>e+t.bindings.length,0);return(0,S.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3 mb-4`,children:[(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50`,children:n(`binding_matrix.local`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,r.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,r.length-c.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`💡 `,n(`binding_matrix.outputs`),`: `,a.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,a.length-d.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`🚪 `,n(`binding_matrix.covers`),`: `,o.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`bg-info/5 rounded-xl p-3 border border-info/20 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-info/70`,children:n(`binding_matrix.remote`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,i.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,i.length-l.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📡 `,n(`binding_matrix.outputs`),`: `,s.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`bg-primary/5 rounded-xl p-3 border border-primary/20 flex flex-col justify-center`,children:[(0,S.jsx)(`p`,{className:`text-2xl font-extrabold text-primary`,children:m}),(0,S.jsx)(`p`,{className:`text-xs font-medium text-primary/70`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50 mb-1.5`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-0.5`,children:E.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:e.icon}),` `,n(e.labelKey)]},e.key))}),(0,S.jsx)(`div`,{className:`border-t border-base-300 mt-1.5 pt-1.5 grid grid-cols-3 gap-x-2 gap-y-0.5`,children:D.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:n(e.shortKey)}),` `,n(e.labelKey)]},e.shortKey))})]})]})}function F({inputs:e,outputs:t,t:n}){let[r,i]=(0,b.useState)(!0),[a,c]=(0,b.useState)(!0),l=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),u=e.filter(e=>e.type===`local`&&e.bindings.length===0),d=t.filter(e=>e.type===`output`&&!l.has(e.id)),f=t.filter(e=>e.type===`cover`&&!l.has(e.id)),p=e.filter(e=>e.type===`remote`&&e.bindings.length===0),h=t.filter(e=>(e.type===`remote_output`||e.type===`remote_cover`)&&!l.has(e.id)),g=u.length>0||d.length>0||f.length>0,_=p.length>0||h.length>0;return!g&&!_?null:(0,S.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[g&&(0,S.jsxs)(`div`,{className:`border border-warning/20 rounded-xl bg-warning/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-warning hover:bg-warning/10 transition-colors`,onClick:()=>i(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[u.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_inputs`)} (${u.length})`,items:u.map(e=>({id:e.id,name:e.name,area:e.area}))}),d.length>0&&(0,S.jsx)(I,{title:`💡 ${n(`binding_matrix.free_outputs`)} (${d.length})`,items:d.map(e=>({id:e.id,name:e.name,area:e.area}))}),f.length>0&&(0,S.jsx)(I,{title:`🚪 ${n(`binding_matrix.free_covers`)} (${f.length})`,items:f.map(e=>({id:e.id,name:e.name,area:e.area}))})]})]}),_&&(0,S.jsxs)(`div`,{className:`border border-info/20 rounded-xl bg-info/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-info hover:bg-info/10 transition-colors`,onClick:()=>c(!a),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),a?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),a&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[p.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_remote_inputs`)} (${p.length})`,items:p.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))}),h.length>0&&(0,S.jsx)(I,{title:`📡 ${n(`binding_matrix.free_remote_outputs`)} (${h.length})`,items:h.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))})]})]})]})}function I({title:e,items:t}){return(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`text-xs font-semibold text-base-content/60 mb-1`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`badge badge-sm badge-ghost text-xxs font-mono gap-1`,title:e.id,children:[e.name,e.area&&(0,S.jsxs)(`span`,{className:`text-base-content/40`,children:[`(`,e.area,`)`]}),e.badge&&(0,S.jsxs)(`span`,{className:`text-info/60`,children:[`[`,e.badge,`]`]})]},e.id))})]})}function ee({inputs:e,outputs:t,areaFilter:n,hideEmpty:r,t:i,onEditInput:a,onEditOutput:o}){let[s,c]=(0,b.useState)(null),[l,u]=(0,b.useState)(null),d=(0,b.useRef)(null),f=(0,b.useRef)(!1),p=(0,b.useRef)(!1),m=(0,b.useRef)(0),_=(0,b.useRef)(0),[v,y]=(0,b.useState)(null),x=(0,b.useRef)(null),w=(0,b.useCallback)((e,t,n)=>{n||(e.preventDefault(),y({x:e.clientX,y:e.clientY,row:t}))},[]),T=(0,b.useCallback)((e,t,n)=>{if(n)return;let r=`touches`in e?{x:e.touches[0].clientX,y:e.touches[0].clientY}:{x:e.clientX,y:e.clientY};x.current=setTimeout(()=>{y({...r,row:t}),x.current=null},500)},[]),D=(0,b.useCallback)(()=>{x.current&&=(clearTimeout(x.current),null)},[]);(0,b.useEffect)(()=>{if(!v)return;let e=null,t=requestAnimationFrame(()=>{let t=()=>y(null);window.addEventListener(`click`,t,{capture:!0}),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t,{capture:!0}),window.removeEventListener(`contextmenu`,t,{capture:!0}),window.removeEventListener(`scroll`,t,!0)}});return()=>{cancelAnimationFrame(t),e?.()}},[v]);let O=(0,b.useMemo)(()=>{let e=new Map;for(let n of t)e.set(n.id,n.area);return e},[t]),j=(0,b.useMemo)(()=>{let t=e;return n.size>0&&(t=t.filter(e=>{let t=e.area||`__none__`;return n.has(t)?!0:e.bindings.some(e=>{let t=O.get(e.targetId)||`__none__`;return n.has(t)})})),r&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,r,O]),M=(0,b.useMemo)(()=>new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),[e]),N=(0,b.useMemo)(()=>{let t=new Map;for(let n of e){let e=n.area||`__none__`;for(let r of n.bindings)t.has(r.targetId)||t.set(r.targetId,new Set),t.get(r.targetId).add(e)}return t},[e]),P=(0,b.useMemo)(()=>{let e=t;return n.size>0&&(e=e.filter(e=>{let t=e.area||`__none__`;if(n.has(t))return!0;let r=N.get(e.id);if(r){for(let e of r)if(n.has(e))return!0}return!1})),r&&(e=e.filter(e=>M.has(e.id))),e},[t,n,r,M,N]),F=(0,b.useMemo)(()=>{let e=new Map;for(let t of j){let n=new Map;for(let e of t.bindings){let t=n.get(e.targetId)||[];t.push(e),n.set(e.targetId,t)}e.set(t.id,n)}return e},[j]);return j.length===0||P.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:i(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:d,className:`overflow-x-auto rounded-xl border border-base-300 cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{f.current=!0,p.current=!1,m.current=e.clientX,_.current=d.current?.scrollLeft||0},onMouseMove:e=>{if(!f.current||!d.current)return;let t=e.clientX-m.current;!p.current&&Math.abs(t)>5&&(p.current=!0),p.current&&(d.current.scrollLeft=_.current-t)},onMouseUp:()=>{f.current=!1,p.current=!1},onMouseLeave:()=>{f.current=!1,p.current=!1},onClickCapture:e=>{p.current&&(e.stopPropagation(),e.preventDefault())},children:[(0,S.jsxs)(`table`,{className:`table table-xs w-auto`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{className:`sticky left-0 z-20 bg-base-200 border-r border-base-300 min-w-[120px]`}),P.map(e=>(0,S.jsxs)(`th`,{className:h(`text-center text-xxs font-bold px-2 py-2 min-w-[80px] border-r border-base-300 bg-base-200 cursor-pointer group/col whitespace-nowrap`,l===e.id&&`bg-primary/10`),onMouseEnter:()=>u(e.id),onMouseLeave:()=>u(null),onClick:()=>o(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-center gap-1`,children:[(0,S.jsx)(C,{outputType:e.outputType,className:`w-3 h-3 shrink-0`}),(0,S.jsx)(`span`,{className:`whitespace-nowrap`,children:e.name}),(0,S.jsx)(g,{className:`w-2 h-2 opacity-0 group-hover/col:opacity-40 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs font-normal text-info/50 truncate`,children:e.remoteDevice})]},e.id))]})}),(0,S.jsx)(`tbody`,{children:j.map(e=>{let t=F.get(e.id);return(0,S.jsxs)(`tr`,{className:h(`hover:bg-base-200/50`,s===e.id&&`bg-base-200/40`),onMouseEnter:()=>c(e.id),onMouseLeave:()=>c(null),children:[(0,S.jsxs)(`td`,{className:h(`sticky left-0 z-10 bg-base-100 border-r border-base-300 font-medium text-xs cursor-pointer group/row`,s===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>a(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`font-bold truncate max-w-[120px] flex items-center gap-1`,title:e.id,children:[e.name,(0,S.jsx)(g,{className:`w-2.5 h-2.5 opacity-0 group-hover/row:opacity-40 transition-opacity shrink-0`})]}),e.area&&(0,S.jsx)(`div`,{className:`text-xxs text-base-content/40`,children:e.area}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs text-info/50`,children:e.remoteDevice})]}),P.map(n=>{let r=t?.get(n.id)||[],o=s===e.id||l===n.id;return(0,S.jsx)(`td`,{className:h(`text-center text-xs border-r border-base-300 px-1 py-1`,r.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,o&&r.length>0&&`bg-success/25`,o&&r.length===0&&`bg-base-200/40`),onMouseEnter:()=>u(n.id),onMouseLeave:()=>{u(null),D()},onContextMenu:t=>w(t,e,r.length>0),onMouseDown:t=>{t.button===0&&T(t,e,r.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,r.length>0),onTouchEnd:D,onTouchMove:D,children:r.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:r.map((t,n)=>(0,S.jsx)(`button`,{className:`whitespace-nowrap cursor-pointer hover:bg-success/30 rounded px-0.5 transition-colors text-left`,onClick:()=>a(e,t.clickType),title:`${A(t,i)}\n${i(`binding_matrix.click_to_edit`)}`,children:k(t,i)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[180px] animate-in fade-in zoom-in-95 duration-100`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 text-xxs font-semibold text-base-content/40 uppercase tracking-wider`,children:i(`binding_matrix.add_action`)}),E.map(e=>(0,S.jsxs)(`button`,{className:`w-full text-left px-3 py-1.5 text-sm hover:bg-primary/10 transition-colors flex items-center gap-2`,onClick:()=>{a(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),i(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:r,onEditInput:i}){let[a,s]=(0,b.useState)(null),c=(0,b.useMemo)(()=>{let r=e;return t.size>0&&(r=r.filter(e=>{let n=e.area||`__none__`;return t.has(n)})),n&&(r=r.filter(e=>e.bindings.length>0)),r},[e,t,n]),l=(0,b.useCallback)(e=>{s(t=>t===e?null:e)},[]);return c.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:r(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:c.map(e=>{let t=a===e.id,n=e.bindings.length>0,s=new Map;for(let t of e.bindings){let e=s.get(t.targetId)||[];e.push(t),s.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:h(`rounded-xl border overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm hover:bg-base-200/30 transition-colors`,onClick:()=>n&&l(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(_,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(u,{className:`w-3.5 h-3.5 text-base-content/20 shrink-0`}),(0,S.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,S.jsx)(`span`,{className:h(`font-semibold truncate block`,!n&&`text-base-content/30`),children:e.name}),e.area&&(0,S.jsx)(`span`,{className:`text-xxs text-base-content/40`,children:e.area})]})]}),(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[n&&(0,S.jsx)(`span`,{className:`badge badge-sm badge-success font-bold`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`badge badge-xs badge-info font-mono`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(o,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`border-t border-base-300 p-3 space-y-2 bg-base-100/50`,children:[[...s.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/70 shrink-0 mt-0.5`,children:`→`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`span`,{className:`font-semibold`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:t.map((e,t)=>(0,S.jsx)(`span`,{className:`badge badge-xs badge-success font-mono gap-0.5`,children:k(e,r)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`btn btn-xs btn-primary btn-outline gap-1 mt-1`,onClick:t=>{t.stopPropagation(),i(e)},children:[(0,S.jsx)(g,{className:`w-2.5 h-2.5`}),r(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:i})=>{let{t:o}=r(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[h,g]=(0,b.useState)(!1),[_,x]=(0,b.useState)(null),[C,w]=(0,b.useState)(``),[T,E]=(0,b.useState)(-1),[D,k]=(0,b.useState)(`basic`),[A,j]=(0,b.useState)(!1),[I,L]=(0,b.useState)(!1),R=(0,b.useRef)(null),[ne,z]=(0,b.useState)(!1),[B,V]=(0,b.useState)(null),[H,re]=(0,b.useState)(``),[U,ie]=(0,b.useState)(-1),[ae,W]=(0,b.useState)(!1),G=(0,b.useRef)(null),K=(0,b.useCallback)((t,n)=>{let r=t.type===`remote`?`remote_inputs`:`local_inputs`,i=e[r]||[],a=i.findIndex((e,n)=>{if(t.type===`remote`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.entity_id||``;return(r?`${r}/${i}`:i||`remote_${n}`)===t.id}return(e.id||e.pin||`local_${n}`)===t.id});a<0||(w(r),E(a),x(JSON.parse(JSON.stringify(i[a]))),R.current=JSON.stringify(i[a]),k(n&&O[n]||`basic`),j(!1),g(!0))},[e]),oe=(0,b.useCallback)(async()=>{if(A||T<0||!_)return;let t=[...e[C]||[]];t[T]=_,L(!0);try{i(C,t),await n(C,t),g(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[_,T,C,e,A,n,i]),se=(0,b.useCallback)(()=>{g(!1),x(null)},[]),q=(0,b.useMemo)(()=>M(e),[e]),J=(0,b.useMemo)(()=>N(e),[e]),ce=(0,b.useMemo)(()=>{let e=new Set;return q.forEach(t=>{t.area&&e.add(t.area)}),J.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[q,J]),le=(0,b.useMemo)(()=>q.some(e=>!e.area)||J.some(e=>!e.area),[q,J]),Y=(0,b.useMemo)(()=>e.output||[],[e.output]),X=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Z=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),ue=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),Q=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),fe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),he=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),ge=(0,b.useCallback)(t=>{let n={output:`output`,cover:`cover`,remote_output:`remote_outputs`,remote_cover:`remote_covers`}[t.type]||`output`,r=e[n]||[],i=r.findIndex((e,n)=>{if(t.type===`remote_output`||t.type===`remote_cover`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.output_id||``;return(r?`${r}/${i}`:i||`remote_out_${n}`)===t.id}return(e.id||``)===t.id});i<0||(re(n),ie(i),V(JSON.parse(JSON.stringify(r[i]))),G.current=JSON.stringify(r[i]),z(!0))},[e]),_e=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,W(!0);try{i(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{W(!1)}},[B,U,H,e,n,i]),ve=(0,b.useCallback)(()=>{z(!1),V(null)},[]),ye=_&&R.current&&JSON.stringify(_)!==R.current,be=B&&G.current&&JSON.stringify(B)!==G.current;return(0,S.jsxs)(`div`,{className:`p-4 md:p-6 max-w-full`,children:[(0,S.jsxs)(`div`,{className:`mb-4`,children:[(0,S.jsx)(`h2`,{className:`text-xl font-extrabold tracking-tight`,children:o(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:o(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:q,outputs:J,t:o}),(0,S.jsxs)(`div`,{className:`flex flex-wrap gap-3 mb-4 items-center`,children:[(0,S.jsxs)(`div`,{className:`relative flex items-center gap-2`,children:[(0,S.jsx)(d,{className:`w-3 h-3 text-base-content/40`}),(0,S.jsxs)(`button`,{className:`btn btn-sm btn-outline gap-1 min-w-[160px] justify-between`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`truncate text-xs`,children:s.size===0?o(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?o(`binding_matrix.no_area`):[...s][0]:o(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(m,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`absolute top-full left-0 mt-1 z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[200px] max-h-[300px] overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.size===0,onChange:()=>c(new Set)}),(0,S.jsx)(`span`,{className:`text-xs font-semibold`,children:o(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`border-t border-base-300 my-0.5`}),le&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(`__none__`),onChange:()=>{let e=new Set(s);e.has(`__none__`)?e.delete(`__none__`):e.add(`__none__`),c(e)}}),(0,S.jsx)(`span`,{className:`text-xs italic text-base-content/50`,children:o(`binding_matrix.no_area`)})]}),ce.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(e),onChange:()=>{let t=new Set(s);t.has(e)?t.delete(e):t.add(e),c(t)}}),(0,S.jsx)(`span`,{className:`text-xs`,children:e})]},e))]})]})]}),(0,S.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-sm checkbox-primary`,checked:f,onChange:e=>p(e.target.checked)}),(0,S.jsxs)(`span`,{className:`text-xs font-medium text-base-content/60 flex items-center gap-1`,children:[f?(0,S.jsx)(a,{className:`w-3 h-3`}):(0,S.jsx)(v,{className:`w-3 h-3`}),o(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:q,outputs:J,areaFilter:s,hideEmpty:f,t:o,onEditInput:K,onEditOutput:ge})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:q,areaFilter:s,hideEmpty:f,t:o,onEditInput:K})}),(0,S.jsx)(F,{inputs:q,outputs:J,t:o}),(0,S.jsx)(y,{open:h,onOpenChange:g,editingItem:_,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:fe,allBinarySensors:de,allEvents:Q,allOutputs:Y,allOutputGroups:Z,allCovers:X,allAreas:$,allRemoteDevices:ue,savedOutputs:Y,savedOutputGroups:Z,savedCovers:X,onChange:x,onSave:oe,onCancel:se,onValidationChange:j,saveDisabled:A||!ye,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?he:pe,uiSchema:H===`cover`?void 0:me,allOutputs:Y,allCovers:X,allAreas:$,onChange:V,onSave:_e,onCancel:ve,saveDisabled:!be,isSaving:ae})]})};export{L as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,c as n,i as r,n as i,o as a,r as o,t as s}from"./monaco-61yH0vfd.js";import{y as c}from"./vendor-DjFmndpd.js";import{r as l,t as u}from"./useTranslation-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,c as n,i as r,n as i,o as a,r as o,t as s}from"./monaco-61yH0vfd.js";import{y as c}from"./vendor-DjFmndpd.js";import{r as l,t as u}from"./useTranslation-Blvt5Lad.js";import{S as d,Wt as f,_t as p,b as m,gt as h,vt as g}from"./index-TqLppANT.js";var _=e(n(),1);function v(){let[e,t]=(0,_.useState)(`dark`);return(0,_.useEffect)(()=>{t(localStorage.getItem(`theme`)||`dark`);let e=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`data-theme`&&t(document.documentElement.getAttribute(`data-theme`)||`dark`)})});return e.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]}),()=>e.disconnect()},[]),e}function y(e){return f({tag:`svg`,attr:{viewBox:`0 0 24 24`},child:[{tag:`path`,attr:{d:`M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z`},child:[]},{tag:`path`,attr:{d:`M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z`},child:[]}]})(e)}var b=c();function x({isOpen:e,onClose:t}){let{t:n}=u(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await l.get(`/api/check_configuration`);o({status:e.data.status,message:e.data.message})}catch{o({status:`error`,message:n(`config_check.failed`)})}finally{i(!1)}};return e?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4`,children:[(0,b.jsx)(`h2`,{className:`text-2xl font-bold mb-6`,children:n(`config_check.title`)}),r?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-8`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg`}),(0,b.jsx)(`p`,{className:`text-lg`,children:n(`config_check.checking`)})]}):a?(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsx)(`div`,{className:`text-lg font-semibold ${a.status===`success`?`text-success`:`text-error`}`,children:a.status===`success`?n(`config_check.valid`):n(`config_check.error`)}),a.message&&(0,b.jsx)(`pre`,{className:`bg-base-300 p-4 rounded-lg whitespace-pre-wrap`,children:a.message}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4 mt-6`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{o(null),t()},children:n(`common.close`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:()=>{o(null),s()},children:n(`config_check.check_again`)})]})]}):(0,b.jsxs)(`div`,{className:`space-y-6`,children:[(0,b.jsx)(`p`,{className:`text-base-content/70`,children:n(`config_check.description`)}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:t,children:n(`common.cancel`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:s,children:n(`config_check.check_button`)})]})]})]})}):null}function S(e){return new Worker(`/assets/yaml.worker-BKRoXlmz.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new s:new i}},a.config({monaco:r});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[a,s]=(0,_.useState)(``),[c,u]=(0,_.useState)(!1),[f,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await l.get(`/api/files`)).data.items)}catch(e){console.error(`Error loading directory:`,e)}},A=async e=>{try{let t=`/api/files/${encodeURIComponent(e)}`,n=await l.get(t);i(e),s(n.data.content),localStorage.setItem(`lastOpenedFile`,e)}catch(e){console.error(`Error loading file:`,e)}},j=async()=>{if(r)try{await l.put(`/api/files/${encodeURIComponent(r)}`,{content:a}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await l.get(`/schema/config.schema.json`)).data;C=await o(e,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+`/schema/config.schema.json`,fileMatch:[`config.yaml`,`config.yml`],schema:t},...Object.keys(t.properties).map(e=>({uri:window.location.origin+`/schema/${e}.schema.json`,fileMatch:[`${e}.yaml`,`${e}.yml`],schema:t.properties[e]}))],validate:!0})}},N=async(e,t)=>{e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>{j()})},P=e=>{n(t=>{let n=t=>t.map(t=>t.path===e?{...t,isOpen:!t.isOpen}:t.children?{...t,children:n(t.children)}:t);return n(t)})},F=(e,t=0)=>e.map(e=>{let n=t==0||e.isOpen;return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${r===e.path?`bg-primary/10`:``}`,style:{paddingLeft:`${t*16+8}px`},onClick:()=>e.type===`file`?A(e.path):P(e.path),children:[e.type===`directory`&&(0,b.jsx)(`span`,{className:`text-xs`,children:n?(0,b.jsx)(m,{}):(0,b.jsx)(d,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(g,{}):(0,b.jsx)(p,{}):(0,b.jsx)(h,{})}),(0,b.jsx)(`span`,{className:`text-sm truncate`,children:e.name})]}),e.type===`directory`&&n&&e.children&&F(e.children,t+1)]},e.path)}),I=async()=>{try{return await l.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(u(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),u(!1),k();break}await new Promise(e=>setTimeout(e,1e3))}};return(0,_.useEffect)(()=>{(async()=>{await k();let e=localStorage.getItem(`lastOpenedFile`);e&&A(e)})()},[]),(0,b.jsxs)(`div`,{className:`flex h-full bg-base-300`,children:[c?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg text-center`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg mb-4`}),(0,b.jsxs)(`h2`,{className:`text-xl font-bold mb-4`,children:[f===`waiting`&&`Restarting Service...`,f===`checking`&&`Waiting for Service...`,f===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[f===`waiting`&&`Initiating service restart`,f===`checking`&&`Checking if service is back online`,f===`ready`&&`Redirecting...`]})]})}):null,(0,b.jsxs)(`div`,{className:`${w?`w-64`:`w-0`} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`p-2 text-sm font-semibold text-base-content/70 uppercase`,children:`Explorer`}),(0,b.jsx)(`div`,{className:`overflow-y-auto`,children:F(e)})]}),(0,b.jsxs)(`div`,{className:`flex-1 overflow-hidden flex flex-col h-full max-h-screen`,children:[(0,b.jsxs)(`div`,{className:`flex items-center p-2 border-b border-base-content/10`,children:[(0,b.jsx)(`button`,{onClick:()=>T(!w),className:`btn btn-ghost btn-sm p-1`,title:w?`Hide file tree`:`Show file tree`,children:(0,b.jsx)(y,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${w?``:`rotate-180`}`})}),r&&(0,b.jsx)(`span`,{className:`ml-2 text-sm opacity-70`,children:r})]}),(0,b.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,b.jsx)(t,{height:`100%`,width:`100%`,defaultLanguage:`yaml`,path:r||`config.yaml`,theme:O===`light`?`vs-light`:`vs-dark`,value:a,onChange:e=>s(e||``),onMount:N,beforeMount:M,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),(0,b.jsxs)(`div`,{className:`h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4`,children:[(0,b.jsx)(`button`,{onClick:j,disabled:!r,className:`btn btn-primary btn-sm`,children:`Save`}),(0,b.jsx)(`button`,{onClick:()=>D(!0),className:`btn btn-primary btn-sm`,children:`Check Config`}),(0,b.jsx)(`button`,{onClick:async()=>{await j();try{if((await l.post(`/api/restart`)).data.status===`not available`){let e=document.getElementById(`toast`);e&&(e.classList.remove(`hidden`),setTimeout(()=>{e.classList.add(`hidden`)},5e3))}else console.log(`Service restarted successfully`),L()}catch(e){console.error(`Error restarting service:`,e)}},disabled:!r,className:`btn btn-secondary btn-sm`,children:`Save and Restart`})]})]}),(0,b.jsx)(`div`,{id:`toast`,className:`toast toast-end hidden`,children:(0,b.jsx)(`div`,{className:`alert alert-warning`,children:(0,b.jsx)(`span`,{children:`Restart not possible. Application is not running as systemd service. Restart manually.`})})}),(0,b.jsx)(x,{isOpen:E,onClose:()=>D(!1)})]})}export{w as default};
|