boneio 1.5.0.dev11__tar.gz → 1.5.0.dev13__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.dev11/boneio.egg-info → boneio-1.5.0.dev13}/PKG-INFO +1 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/gate_cover.py +6 -2
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/__init__.py +3 -1
- boneio-1.5.0.dev13/boneio/core/config/migrations/v4_wled_cache.py +219 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/yaml_util.py +12 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/inputs.py +9 -7
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/remote.py +9 -2
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/__init__.py +4 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/gate_cover.py +53 -11
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates.py +40 -10
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/wled.py +60 -5
- boneio-1.5.0.dev13/boneio/core/remote/wled_cache.py +143 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_devices.yaml +2 -78
- boneio-1.5.0.dev13/boneio/version.py +2 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/app.py +6 -0
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/BindingMatrix-sPbnkk3q.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/BindingMatrix-aj3riWWZ.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/ConfigEditor-BW5p6czH.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ConfigEditor-Blrg9Au1.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EditItemDialog-EXSzv1h-.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EditItemDialog-cJc7C25R.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EntityCard-Baa34yvR.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityCard-CVnjkl2Y.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EntityGrid-ZMMQCacx.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityGrid-B6mC4OZ8.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/InputsView-3TWtNuVX.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/InputsView-C09ulmeN.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/LogViewer-k5Gt8k2O.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/LogViewer-U1DEZ2mc.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/ModbusView-DtvRzQPY.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ModbusView-MqeWOSDT.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/NodeRedView-BPEkkqIb.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/NodeRedView-CNPh9Kak.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/OutputsView-DUnA3EG0.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/OutputsView-uXH9nyRR.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SensorView-WmoZT5VM.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SensorView-DW85dbP7.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SudoPasswordDialog-fC4HRGtE.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SudoPasswordDialog-C9jQ6QtB.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SystemState-BRigO9Bc.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SystemState-A6TNdNT0.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/TemplatesView-CAXj1gAG.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/TemplatesView-Bmu7KfpS.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/Tools-DfTLLXUx.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/Tools-C-qgHesX.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/UISettings-CEZ5cjTg.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/UISettings-B_Vt1ikn.js +3 -3
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/dialog-DaAuWrWH.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/dialog-Dj_HN1ZA.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/gi-B6VoRVMX.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/gi-Dt8p1sub.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/index-mUeR1ZYi.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/index-CyBZuJ67.js +2 -2
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-DAG4PZPN.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D8uh5ILp.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/select-CT8v8aH8.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/select-Bxh-o8g9.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/tabs-box-DdJPCk-r.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/tabs-box-Bjw4Iwcm.js +1 -1
- boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/utils-BgjkKFNC.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/utils-BmlJVtvk.js +1 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/index.html +1 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/config.schema.json +0 -144
- {boneio-1.5.0.dev11/boneio/webui → boneio-1.5.0.dev13/boneio/webui/frontend-dist}/schema/remote_devices.schema.json +0 -144
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/config.py +13 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/remote_devices.py +36 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/config.schema.json +0 -144
- {boneio-1.5.0.dev11/boneio/webui/frontend-dist → boneio-1.5.0.dev13/boneio/webui}/schema/remote_devices.schema.json +0 -144
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/SOURCES.txt +25 -23
- boneio-1.5.0.dev11/boneio/version.py +0 -2
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/LICENSE +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/MANIFEST.in +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/README.md +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/bonecli.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/cover.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/group/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/group/output_group.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/detectors.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/event.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/basic.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/mcp.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/pca.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/pcf.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/remote.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/const.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/package.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/discovery.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/events/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/events/bus.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/covers.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/display.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/manager.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/update.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/local.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/can.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/system.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/state/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/state/manager.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/host_data.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/monitor.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/filter.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/logger.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/util.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/exceptions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/client.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/node.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/interlock.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/lox_template.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/actions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/runner.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/cli.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/client.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/utils.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/actions.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/events.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/files.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/logs.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/mqtt.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/state.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/runner.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/condition.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/filters.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/id.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/schema.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/action_validation.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/can.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/system.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/update.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/services/logs.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/web_server.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/pyproject.toml +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/setup.cfg +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/setup.py +0 -0
- {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/tests/test_py313_compatibility.py +0 -0
|
@@ -191,10 +191,14 @@ class BoneIOGateCover:
|
|
|
191
191
|
# -- MQTT ----------------------------------------------------------------
|
|
192
192
|
|
|
193
193
|
async def start(self) -> None:
|
|
194
|
-
"""Subscribe to MQTT command topic.
|
|
194
|
+
"""Subscribe to MQTT command topic and publish current state.
|
|
195
|
+
|
|
196
|
+
Initial sensor state is already set by TemplateManager during
|
|
197
|
+
configuration, so start() just subscribes and publishes.
|
|
198
|
+
"""
|
|
195
199
|
await self._message_bus.subscribe_and_listen(self._cmd_topic, self.handle_command)
|
|
196
200
|
self._publish_state()
|
|
197
|
-
_LOGGER.info("GateCover %s started, subscribed to %s", self._id, self._cmd_topic)
|
|
201
|
+
_LOGGER.info("GateCover %s started (state=%s), subscribed to %s", self._id, self._state, self._cmd_topic)
|
|
198
202
|
|
|
199
203
|
async def stop(self) -> None:
|
|
200
204
|
"""Unsubscribe from MQTT and cancel timers."""
|
|
@@ -17,7 +17,7 @@ from dataclasses import dataclass, field
|
|
|
17
17
|
_LOGGER = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
19
|
# Current schema version — bump this when adding new migrations
|
|
20
|
-
CURRENT_SCHEMA_VERSION =
|
|
20
|
+
CURRENT_SCHEMA_VERSION = 4
|
|
21
21
|
|
|
22
22
|
# Minimum app version that introduced each schema version.
|
|
23
23
|
# Used by the WebUI to warn before rolling back to an incompatible version.
|
|
@@ -26,6 +26,7 @@ SCHEMA_VERSION_APP_MAP: dict[int, str] = {
|
|
|
26
26
|
1: "1.2.0dev1", # proxy_port rename
|
|
27
27
|
2: "1.3.0dev1", # transition timeperiod
|
|
28
28
|
3: "1.3.0dev7", # irrigation section
|
|
29
|
+
4: "1.5.0dev13", # WLED effects/palettes → JSON cache
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
|
|
@@ -230,4 +231,5 @@ def _persist_config_version(config_file: str, version: int) -> None:
|
|
|
230
231
|
from boneio.core.config.migrations import (
|
|
231
232
|
v1_proxy_port, # noqa: E402, F401
|
|
232
233
|
v2_transition, # noqa: E402, F401
|
|
234
|
+
v4_wled_cache, # noqa: E402, F401
|
|
233
235
|
)
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"""Migration v4: Extract WLED effects/palettes/segments from config to JSON cache.
|
|
2
|
+
|
|
3
|
+
Before: WLED effects (219 items), palettes (72 items), and segments are stored
|
|
4
|
+
inline in each remote_device's ``wled`` section inside config.yaml.
|
|
5
|
+
This causes 3-5 second YAML serialization delays on ARM hardware.
|
|
6
|
+
|
|
7
|
+
After: These fields are stripped from config and saved to a lightweight
|
|
8
|
+
``.wled_cache.json`` file. The cache auto-regenerates from WLED API
|
|
9
|
+
on device connect, so no data is permanently lost.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import logging
|
|
16
|
+
import re
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
from boneio.core.config.migrations import register_migration
|
|
20
|
+
|
|
21
|
+
_LOGGER = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
# Fields to strip from each WLED device config — these are device metadata,
|
|
24
|
+
# not user configuration.
|
|
25
|
+
_WLED_CACHE_FIELDS = ("effects", "palettes", "segments")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _persist_wled_cache_strip(config_file: str) -> None:
|
|
29
|
+
"""Strip effects/palettes/segments from WLED devices in the YAML file.
|
|
30
|
+
|
|
31
|
+
Reads the config file(s), extracts WLED metadata into a JSON cache,
|
|
32
|
+
and rewrites the YAML without those bulky lists.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
config_file: Path to the main config.yaml file.
|
|
36
|
+
"""
|
|
37
|
+
config_dir = Path(config_file).parent
|
|
38
|
+
|
|
39
|
+
# First, find and extract WLED data from the in-memory parse
|
|
40
|
+
# to save into .wled_cache.json before removing from YAML
|
|
41
|
+
try:
|
|
42
|
+
from yaml import SafeLoader, load
|
|
43
|
+
|
|
44
|
+
class IncludeLoader(SafeLoader):
|
|
45
|
+
"""YAML loader that preserves !include tags."""
|
|
46
|
+
|
|
47
|
+
def _include_constructor(
|
|
48
|
+
loader: IncludeLoader, node: object
|
|
49
|
+
) -> object:
|
|
50
|
+
filename = loader.construct_scalar(node) # type: ignore[arg-type]
|
|
51
|
+
return type(
|
|
52
|
+
"Include", (), {"filename": filename, "tag": "!include"}
|
|
53
|
+
)()
|
|
54
|
+
|
|
55
|
+
IncludeLoader.add_constructor("!include", _include_constructor)
|
|
56
|
+
|
|
57
|
+
with open(config_file, encoding="utf-8") as f:
|
|
58
|
+
config = load(f, Loader=IncludeLoader) # noqa: S506
|
|
59
|
+
|
|
60
|
+
if not config:
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
# Determine where remote_devices lives
|
|
64
|
+
rd_section = config.get("remote_devices")
|
|
65
|
+
if rd_section is None:
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
# If it's an !include, load the included file
|
|
69
|
+
if hasattr(rd_section, "tag") and rd_section.tag == "!include":
|
|
70
|
+
include_path = config_dir / rd_section.filename
|
|
71
|
+
if include_path.exists():
|
|
72
|
+
with open(include_path, encoding="utf-8") as f:
|
|
73
|
+
rd_list = load(f, Loader=SafeLoader) # noqa: S506
|
|
74
|
+
_strip_wled_fields_from_file(include_path, rd_list, config_dir)
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
# Inline remote_devices — strip from main config file
|
|
78
|
+
if isinstance(rd_section, list):
|
|
79
|
+
_strip_wled_fields_from_file(
|
|
80
|
+
Path(config_file), rd_section, config_dir
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
except Exception as exc:
|
|
84
|
+
_LOGGER.error("Failed to strip WLED cache fields from file: %s", exc)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _strip_wled_fields_from_file(
|
|
88
|
+
yaml_path: Path, devices: list[dict] | None, config_dir: Path
|
|
89
|
+
) -> None:
|
|
90
|
+
"""Extract WLED metadata to JSON cache, then strip from YAML file.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
yaml_path: Path to the YAML file containing remote_devices.
|
|
94
|
+
devices: Parsed list of remote device dicts.
|
|
95
|
+
config_dir: Config directory for placing the cache file.
|
|
96
|
+
"""
|
|
97
|
+
if not devices:
|
|
98
|
+
return
|
|
99
|
+
|
|
100
|
+
# Extract cache data
|
|
101
|
+
cache_data: dict[str, dict[str, list[dict[str, str | int]]]] = {}
|
|
102
|
+
has_data = False
|
|
103
|
+
|
|
104
|
+
for device in devices:
|
|
105
|
+
if not isinstance(device, dict):
|
|
106
|
+
continue
|
|
107
|
+
wled = device.get("wled")
|
|
108
|
+
if not isinstance(wled, dict):
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
device_id = device.get("id", "")
|
|
112
|
+
if not device_id:
|
|
113
|
+
continue
|
|
114
|
+
|
|
115
|
+
device_cache: dict[str, list[dict[str, str | int]]] = {}
|
|
116
|
+
for field in _WLED_CACHE_FIELDS:
|
|
117
|
+
if field in wled and isinstance(wled[field], list) and wled[field]:
|
|
118
|
+
device_cache[field] = wled[field]
|
|
119
|
+
has_data = True
|
|
120
|
+
if device_cache:
|
|
121
|
+
cache_data[device_id] = device_cache
|
|
122
|
+
|
|
123
|
+
# Save extracted data to JSON cache
|
|
124
|
+
if has_data:
|
|
125
|
+
cache_path = config_dir / ".wled_cache.json"
|
|
126
|
+
try:
|
|
127
|
+
# Merge with existing cache (other migrations may have run)
|
|
128
|
+
existing: dict[str, dict[str, list[dict[str, str | int]]]] = {}
|
|
129
|
+
if cache_path.exists():
|
|
130
|
+
with open(cache_path, encoding="utf-8") as f:
|
|
131
|
+
existing = json.load(f)
|
|
132
|
+
|
|
133
|
+
existing.update(cache_data)
|
|
134
|
+
|
|
135
|
+
with open(cache_path, "w", encoding="utf-8") as f:
|
|
136
|
+
json.dump(existing, f, indent=2, ensure_ascii=False)
|
|
137
|
+
|
|
138
|
+
_LOGGER.info(
|
|
139
|
+
"Saved WLED metadata for %d device(s) to %s",
|
|
140
|
+
len(cache_data),
|
|
141
|
+
cache_path,
|
|
142
|
+
)
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
_LOGGER.warning("Failed to write WLED cache: %s", exc)
|
|
145
|
+
|
|
146
|
+
# Now strip the fields from the YAML file using regex
|
|
147
|
+
# This is safer than re-serializing the entire file
|
|
148
|
+
with open(yaml_path, encoding="utf-8") as f:
|
|
149
|
+
content = f.read()
|
|
150
|
+
|
|
151
|
+
original_content = content
|
|
152
|
+
|
|
153
|
+
# Remove effects/palettes/segments blocks from YAML
|
|
154
|
+
# Pattern: indented key followed by a list of dicts
|
|
155
|
+
for field in _WLED_CACHE_FIELDS:
|
|
156
|
+
# Match the field key line and all following lines that are more indented
|
|
157
|
+
# or are list items (- ) at deeper indent
|
|
158
|
+
pattern = re.compile(
|
|
159
|
+
rf"^( +){field}:\s*\n" # field key line
|
|
160
|
+
rf"((?:\1 .+\n|\1- .+\n)*)", # indented content below
|
|
161
|
+
re.MULTILINE,
|
|
162
|
+
)
|
|
163
|
+
content = pattern.sub("", content)
|
|
164
|
+
|
|
165
|
+
if content != original_content:
|
|
166
|
+
with open(yaml_path, "w", encoding="utf-8") as f:
|
|
167
|
+
f.write(content)
|
|
168
|
+
_LOGGER.info(
|
|
169
|
+
"Stripped WLED cache fields from %s (saved %d bytes)",
|
|
170
|
+
yaml_path.name,
|
|
171
|
+
len(original_content) - len(content),
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@register_migration(
|
|
176
|
+
version=4,
|
|
177
|
+
name="Extract WLED effects/palettes/segments to JSON cache",
|
|
178
|
+
migrate_file=_persist_wled_cache_strip,
|
|
179
|
+
)
|
|
180
|
+
def migrate(doc: dict) -> dict:
|
|
181
|
+
"""Strip effects, palettes, and segments from remote_devices in memory.
|
|
182
|
+
|
|
183
|
+
These fields are device metadata auto-discovered from the WLED API,
|
|
184
|
+
not user configuration. Storing them in config.yaml causes slow saves
|
|
185
|
+
on ARM hardware due to YAML serialization overhead (~64KB per 7 devices).
|
|
186
|
+
|
|
187
|
+
After migration, this data lives in ``.wled_cache.json`` and is
|
|
188
|
+
auto-populated from the WLED API on device connect.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
doc: Raw config dict.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Migrated config dict with WLED metadata fields removed.
|
|
195
|
+
"""
|
|
196
|
+
remote_devices = doc.get("remote_devices")
|
|
197
|
+
if not isinstance(remote_devices, list):
|
|
198
|
+
return doc
|
|
199
|
+
|
|
200
|
+
for device in remote_devices:
|
|
201
|
+
if not isinstance(device, dict):
|
|
202
|
+
continue
|
|
203
|
+
wled = device.get("wled")
|
|
204
|
+
if not isinstance(wled, dict):
|
|
205
|
+
continue
|
|
206
|
+
|
|
207
|
+
for field in _WLED_CACHE_FIELDS:
|
|
208
|
+
if field in wled:
|
|
209
|
+
items = wled[field]
|
|
210
|
+
count = len(items) if isinstance(items, list) else 0
|
|
211
|
+
_LOGGER.info(
|
|
212
|
+
"Stripping wled.%s (%d items) from device '%s'",
|
|
213
|
+
field,
|
|
214
|
+
count,
|
|
215
|
+
device.get("id", "?"),
|
|
216
|
+
)
|
|
217
|
+
del wled[field]
|
|
218
|
+
|
|
219
|
+
return doc
|
|
@@ -1246,6 +1246,18 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
|
|
|
1246
1246
|
with contextlib.suppress(ValueError):
|
|
1247
1247
|
entry["address"] = int(addr, 10)
|
|
1248
1248
|
|
|
1249
|
+
# Strip WLED device metadata (effects/palettes/segments) from remote_devices.
|
|
1250
|
+
# These are auto-discovered from WLED API and cached in .wled_cache.json,
|
|
1251
|
+
# NOT stored in config.yaml (defense in depth).
|
|
1252
|
+
if section == "remote_devices" and isinstance(data, list):
|
|
1253
|
+
_wled_cache_fields = ("effects", "palettes", "segments")
|
|
1254
|
+
for entry in data:
|
|
1255
|
+
if isinstance(entry, dict):
|
|
1256
|
+
wled = entry.get("wled")
|
|
1257
|
+
if isinstance(wled, dict):
|
|
1258
|
+
for field in _wled_cache_fields:
|
|
1259
|
+
wled.pop(field, None)
|
|
1260
|
+
|
|
1249
1261
|
# Strip default values to keep YAML clean
|
|
1250
1262
|
cleaned_data = strip_default_values(data, {}, section)
|
|
1251
1263
|
_LOGGER.info(f"Cleaned data (defaults removed): {cleaned_data}")
|
|
@@ -801,16 +801,18 @@ class InputManager:
|
|
|
801
801
|
# Send event to MQTT for Home Assistant
|
|
802
802
|
self._publish_input_event_to_mqtt(input_instance, event)
|
|
803
803
|
|
|
804
|
-
#
|
|
805
|
-
#
|
|
806
|
-
#
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
# If publish_only is set, skip action execution (used for initial state sync)
|
|
804
|
+
# If publish_only is set, skip action execution AND template routing.
|
|
805
|
+
# publish_only events come from initial state sync (binary_sensor
|
|
806
|
+
# initial_send) — routing them to gate covers would cause spurious
|
|
807
|
+
# state transitions that trigger HA automations on every restart.
|
|
808
|
+
# Gate covers read sensor state silently during their own start().
|
|
810
809
|
if event.publish_only:
|
|
811
|
-
_LOGGER.debug("Skipping
|
|
810
|
+
_LOGGER.debug("Skipping actions and template routing for %s (publish_only=True)", event.entity_id)
|
|
812
811
|
return
|
|
813
812
|
|
|
813
|
+
# Route to template entities (gate covers, alarm panels)
|
|
814
|
+
self._manager.templates.on_input_event(event.entity_id, event.click_type)
|
|
815
|
+
|
|
814
816
|
# Cancel pending delayed actions if this event matches delay_cancel_on
|
|
815
817
|
# Check ALL click types' actions for delay_cancel_on (not just current click_type)
|
|
816
818
|
self._cancel_delayed_if_matching(input_instance, event.entity_id, event.click_type)
|
|
@@ -473,7 +473,11 @@ class RemoteDeviceManager:
|
|
|
473
473
|
action=action,
|
|
474
474
|
)
|
|
475
475
|
|
|
476
|
-
# For WLED devices, use HTTP JSON API
|
|
476
|
+
# For WLED devices, use fire-and-forget HTTP JSON API.
|
|
477
|
+
# WLED HTTP requests can stall for seconds when the device is
|
|
478
|
+
# unreachable (DNS timeout on .local), which blocks the EventBus
|
|
479
|
+
# worker and freezes ALL input events. Fire-and-forget schedules
|
|
480
|
+
# the request as a background task so the caller returns immediately.
|
|
477
481
|
if device.protocol == RemoteDeviceProtocol.WLED:
|
|
478
482
|
_LOGGER.debug("Controlling WLED '%s' segment '%s' on device '%s'", output_id, action, device_id)
|
|
479
483
|
# Parse segment_id - "main" means whole device, otherwise it's segment ID
|
|
@@ -482,7 +486,9 @@ class RemoteDeviceManager:
|
|
|
482
486
|
wled_rgb: tuple[int, int, int] | None = None
|
|
483
487
|
if rgb and len(rgb) >= 3:
|
|
484
488
|
wled_rgb = (rgb[0], rgb[1], rgb[2])
|
|
485
|
-
|
|
489
|
+
from boneio.core.remote.wled import WLEDRemoteDevice
|
|
490
|
+
wled_device = cast(WLEDRemoteDevice, device)
|
|
491
|
+
wled_device.control_light_fire_and_forget(
|
|
486
492
|
segment_id=segment_id,
|
|
487
493
|
action=action,
|
|
488
494
|
brightness=brightness,
|
|
@@ -494,6 +500,7 @@ class RemoteDeviceManager:
|
|
|
494
500
|
effect_speed=effect_speed,
|
|
495
501
|
effect_intensity=effect_intensity,
|
|
496
502
|
)
|
|
503
|
+
return True # Optimistic: task is scheduled
|
|
497
504
|
|
|
498
505
|
# For MQTT devices, use standard control_output
|
|
499
506
|
return await device.control_output(
|
|
@@ -145,6 +145,9 @@ class TemplateManager:
|
|
|
145
145
|
for alarm in self._alarms.items:
|
|
146
146
|
await alarm.start()
|
|
147
147
|
for gate in self._gates.items:
|
|
148
|
+
# Sync sensor state silently before start() publishes state.
|
|
149
|
+
# Done here (not in configure()) because GPIO manager is now running.
|
|
150
|
+
self._gates.sync_initial_state(gate)
|
|
148
151
|
await gate.start()
|
|
149
152
|
_LOGGER.info("TemplateManager started all entities")
|
|
150
153
|
|
|
@@ -242,6 +245,7 @@ class TemplateManager:
|
|
|
242
245
|
continue
|
|
243
246
|
gate = self._gates.get(eid)
|
|
244
247
|
if gate:
|
|
248
|
+
self._gates.sync_initial_state(gate)
|
|
245
249
|
await gate.start()
|
|
246
250
|
|
|
247
251
|
# Re-register all sensor EventBus listeners (clean slate)
|
|
@@ -143,10 +143,6 @@ class GateCoverManager:
|
|
|
143
143
|
self._input_map[sensor_id] = []
|
|
144
144
|
self._input_map[sensor_id].append(gate)
|
|
145
145
|
|
|
146
|
-
# Read current sensor states to set correct initial gate state.
|
|
147
|
-
# Without this, gate defaults to CLOSED which may be wrong.
|
|
148
|
-
self._sync_initial_state(closed_sensor_id, open_sensor_id)
|
|
149
|
-
|
|
150
146
|
# Publish HA discovery
|
|
151
147
|
self._publish_discovery(gate)
|
|
152
148
|
|
|
@@ -159,23 +155,69 @@ class GateCoverManager:
|
|
|
159
155
|
|
|
160
156
|
def _sync_initial_state(
|
|
161
157
|
self,
|
|
158
|
+
gate: BoneIOGateCover,
|
|
162
159
|
closed_sensor_id: str | None,
|
|
163
160
|
open_sensor_id: str | None,
|
|
164
161
|
) -> None:
|
|
165
|
-
"""
|
|
162
|
+
"""Read current sensor GPIO state and set gate cover's initial state.
|
|
166
163
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
164
|
+
Reads the binary sensor's ``is_active`` property directly —
|
|
165
|
+
no EventBus events are fired, no MQTT messages are published.
|
|
166
|
+
Gate cover's ``start()`` will publish the correct state later.
|
|
170
167
|
|
|
171
168
|
Args:
|
|
169
|
+
gate: The gate cover instance to initialize.
|
|
172
170
|
closed_sensor_id: ID of the closed contact sensor (or None).
|
|
173
171
|
open_sensor_id: ID of the open contact sensor (or None).
|
|
174
172
|
"""
|
|
173
|
+
from boneio.components.input.binary_sensor import GpioInputBinarySensor
|
|
174
|
+
from boneio.components.template.gate_cover import CYCLE_CLOSE, CYCLE_OPEN
|
|
175
|
+
from boneio.const import CLOSED, IDLE, OPEN
|
|
176
|
+
|
|
175
177
|
input_mgr = self._manager.inputs
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
|
|
179
|
+
if closed_sensor_id:
|
|
180
|
+
sensor = input_mgr._inputs.get(closed_sensor_id)
|
|
181
|
+
if sensor and isinstance(sensor, GpioInputBinarySensor):
|
|
182
|
+
is_closed = sensor.is_active
|
|
183
|
+
_LOGGER.debug(
|
|
184
|
+
"Gate %s: initial closed_sensor %s is_active=%s",
|
|
185
|
+
gate.id, closed_sensor_id, is_closed,
|
|
186
|
+
)
|
|
187
|
+
if is_closed:
|
|
188
|
+
gate._state = CLOSED
|
|
189
|
+
gate._current_operation = IDLE
|
|
190
|
+
gate._cycle_next = CYCLE_OPEN
|
|
191
|
+
elif not gate._has_open_sensor:
|
|
192
|
+
gate._state = OPEN
|
|
193
|
+
gate._current_operation = IDLE
|
|
194
|
+
|
|
195
|
+
if open_sensor_id:
|
|
196
|
+
sensor = input_mgr._inputs.get(open_sensor_id)
|
|
197
|
+
if sensor and isinstance(sensor, GpioInputBinarySensor):
|
|
198
|
+
is_open = sensor.is_active
|
|
199
|
+
_LOGGER.debug(
|
|
200
|
+
"Gate %s: initial open_sensor %s is_active=%s",
|
|
201
|
+
gate.id, open_sensor_id, is_open,
|
|
202
|
+
)
|
|
203
|
+
if is_open:
|
|
204
|
+
gate._state = OPEN
|
|
205
|
+
gate._current_operation = IDLE
|
|
206
|
+
gate._cycle_next = CYCLE_CLOSE
|
|
207
|
+
|
|
208
|
+
def sync_initial_state(self, gate: BoneIOGateCover) -> None:
|
|
209
|
+
"""Public entry point for setting gate's initial state from sensor GPIO.
|
|
210
|
+
|
|
211
|
+
Called by TemplateManager during start() when GPIO manager is ready.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
gate: Gate cover to sync.
|
|
215
|
+
"""
|
|
216
|
+
self._sync_initial_state(
|
|
217
|
+
gate,
|
|
218
|
+
gate._closed_sensor_id,
|
|
219
|
+
gate._open_sensor_id,
|
|
220
|
+
)
|
|
179
221
|
|
|
180
222
|
# -- Removal -------------------------------------------------------------
|
|
181
223
|
|
|
@@ -17,9 +17,9 @@ from boneio.components.template.alarm_panel import (
|
|
|
17
17
|
BoneIOAlarmPanel,
|
|
18
18
|
ZoneInput,
|
|
19
19
|
)
|
|
20
|
-
from boneio.components.template.gate_cover import BoneIOGateCover
|
|
20
|
+
from boneio.components.template.gate_cover import BoneIOGateCover, CYCLE_CLOSE, CYCLE_OPEN
|
|
21
21
|
from boneio.components.template.thermostat import BoneIOThermostat
|
|
22
|
-
from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, COVER
|
|
22
|
+
from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, CLOSED, COVER, IDLE, OPEN
|
|
23
23
|
from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
@@ -365,7 +365,7 @@ class TemplateManager:
|
|
|
365
365
|
|
|
366
366
|
# Read current sensor states to set correct initial gate state.
|
|
367
367
|
# Without this, gate defaults to CLOSED which may be wrong.
|
|
368
|
-
self._sync_gate_initial_state(closed_sensor_id, open_sensor_id)
|
|
368
|
+
self._sync_gate_initial_state(gate, closed_sensor_id, open_sensor_id)
|
|
369
369
|
|
|
370
370
|
# Publish HA discovery
|
|
371
371
|
self._publish_gate_cover_discovery(gate)
|
|
@@ -379,23 +379,53 @@ class TemplateManager:
|
|
|
379
379
|
|
|
380
380
|
def _sync_gate_initial_state(
|
|
381
381
|
self,
|
|
382
|
+
gate: BoneIOGateCover,
|
|
382
383
|
closed_sensor_id: str | None,
|
|
383
384
|
open_sensor_id: str | None,
|
|
384
385
|
) -> None:
|
|
385
|
-
"""
|
|
386
|
+
"""Read current sensor GPIO state and set gate cover's initial state.
|
|
386
387
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
388
|
+
Reads the binary sensor's ``is_active`` property directly —
|
|
389
|
+
no EventBus events are fired, no MQTT messages are published.
|
|
390
|
+
Gate cover's ``start()`` will publish the correct state later.
|
|
390
391
|
|
|
391
392
|
Args:
|
|
393
|
+
gate: The gate cover instance to initialize.
|
|
392
394
|
closed_sensor_id: ID of the closed contact sensor (or None).
|
|
393
395
|
open_sensor_id: ID of the open contact sensor (or None).
|
|
394
396
|
"""
|
|
397
|
+
from boneio.components.input.binary_sensor import GpioInputBinarySensor
|
|
398
|
+
|
|
395
399
|
input_mgr = self._manager.inputs
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
400
|
+
|
|
401
|
+
if closed_sensor_id:
|
|
402
|
+
sensor = input_mgr._inputs.get(closed_sensor_id)
|
|
403
|
+
if sensor and isinstance(sensor, GpioInputBinarySensor):
|
|
404
|
+
is_closed = sensor.is_active
|
|
405
|
+
_LOGGER.debug(
|
|
406
|
+
"Gate %s: initial closed_sensor %s is_active=%s",
|
|
407
|
+
gate.id, closed_sensor_id, is_closed,
|
|
408
|
+
)
|
|
409
|
+
if is_closed:
|
|
410
|
+
gate._state = CLOSED
|
|
411
|
+
gate._current_operation = IDLE
|
|
412
|
+
gate._cycle_next = CYCLE_OPEN
|
|
413
|
+
elif not gate._has_open_sensor:
|
|
414
|
+
gate._state = OPEN
|
|
415
|
+
gate._current_operation = IDLE
|
|
416
|
+
|
|
417
|
+
if open_sensor_id:
|
|
418
|
+
sensor = input_mgr._inputs.get(open_sensor_id)
|
|
419
|
+
if sensor and isinstance(sensor, GpioInputBinarySensor):
|
|
420
|
+
is_open = sensor.is_active
|
|
421
|
+
_LOGGER.debug(
|
|
422
|
+
"Gate %s: initial open_sensor %s is_active=%s",
|
|
423
|
+
gate.id, open_sensor_id, is_open,
|
|
424
|
+
)
|
|
425
|
+
if is_open:
|
|
426
|
+
gate._state = OPEN
|
|
427
|
+
gate._current_operation = IDLE
|
|
428
|
+
gate._cycle_next = CYCLE_CLOSE
|
|
399
429
|
|
|
400
430
|
# -- HA Discovery --------------------------------------------------------
|
|
401
431
|
|
|
@@ -169,10 +169,25 @@ class WLEDRemoteDevice(RemoteDevice):
|
|
|
169
169
|
_LOGGER.debug("Closed session for WLED '%s'", self._name)
|
|
170
170
|
|
|
171
171
|
async def _get_session(self) -> aiohttp.ClientSession:
|
|
172
|
-
"""Get or create aiohttp session.
|
|
172
|
+
"""Get or create aiohttp session.
|
|
173
|
+
|
|
174
|
+
Uses ``ThreadedResolver`` (system ``getaddrinfo`` via NSS) so that
|
|
175
|
+
mDNS ``.local`` hostnames are resolved correctly through Avahi.
|
|
176
|
+
The default aiohttp resolver (``AsyncResolver`` / c-ares) bypasses
|
|
177
|
+
NSS entirely, causing ``Name or service not known`` errors for
|
|
178
|
+
``.local`` names even when ``ping`` from the same host works fine.
|
|
179
|
+
|
|
180
|
+
Timeout is kept short (3s total, 2s connect) so that unreachable
|
|
181
|
+
devices do not block the caller.
|
|
182
|
+
"""
|
|
173
183
|
if self._session is None or self._session.closed:
|
|
174
|
-
timeout = aiohttp.ClientTimeout(total=
|
|
175
|
-
|
|
184
|
+
timeout = aiohttp.ClientTimeout(total=3, connect=2)
|
|
185
|
+
resolver = aiohttp.resolver.ThreadedResolver()
|
|
186
|
+
connector = aiohttp.TCPConnector(resolver=resolver)
|
|
187
|
+
self._session = aiohttp.ClientSession(
|
|
188
|
+
timeout=timeout,
|
|
189
|
+
connector=connector,
|
|
190
|
+
)
|
|
176
191
|
return self._session
|
|
177
192
|
|
|
178
193
|
async def _send_state(self, state: dict[str, Any]) -> bool:
|
|
@@ -366,6 +381,34 @@ class WLEDRemoteDevice(RemoteDevice):
|
|
|
366
381
|
)
|
|
367
382
|
|
|
368
383
|
return await self._send_state(state)
|
|
384
|
+
|
|
385
|
+
def control_light_fire_and_forget(
|
|
386
|
+
self,
|
|
387
|
+
**kwargs: Any,
|
|
388
|
+
) -> None:
|
|
389
|
+
"""Schedule ``control_light`` as a background task.
|
|
390
|
+
|
|
391
|
+
Use this when the caller must not be blocked by network I/O
|
|
392
|
+
(e.g. when called from the EventBus action handler). The task
|
|
393
|
+
runs independently; failures are logged but do not propagate.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
**kwargs: Forwarded to :meth:`control_light`.
|
|
397
|
+
"""
|
|
398
|
+
asyncio.create_task(
|
|
399
|
+
self._control_light_safe(**kwargs),
|
|
400
|
+
name=f"wled_ff_{self._id}",
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
async def _control_light_safe(self, **kwargs: Any) -> None:
|
|
404
|
+
"""Wrapper that catches all exceptions so fire-and-forget tasks never crash."""
|
|
405
|
+
try:
|
|
406
|
+
await self.control_light(**kwargs)
|
|
407
|
+
except Exception as exc:
|
|
408
|
+
_LOGGER.error(
|
|
409
|
+
"WLED fire-and-forget failed for '%s': %s",
|
|
410
|
+
self._name, exc,
|
|
411
|
+
)
|
|
369
412
|
|
|
370
413
|
async def control_output(
|
|
371
414
|
self,
|
|
@@ -487,12 +530,24 @@ class WLEDRemoteDevice(RemoteDevice):
|
|
|
487
530
|
# Update internal segments list
|
|
488
531
|
self._segments = segments
|
|
489
532
|
|
|
533
|
+
# Persist effects/palettes/segments to JSON cache
|
|
534
|
+
# (they are no longer stored in config.yaml)
|
|
535
|
+
from boneio.core.remote.wled_cache import update_device_metadata
|
|
536
|
+
update_device_metadata(
|
|
537
|
+
self._id,
|
|
538
|
+
effects=effects,
|
|
539
|
+
palettes=palettes,
|
|
540
|
+
segments=segments,
|
|
541
|
+
)
|
|
542
|
+
|
|
490
543
|
_LOGGER.info(
|
|
491
|
-
"Discovered WLED '%s' v%s with %d segments, %d LEDs",
|
|
544
|
+
"Discovered WLED '%s' v%s with %d segments, %d LEDs, %d effects, %d palettes",
|
|
492
545
|
self._device_info["name"],
|
|
493
546
|
self._device_info["version"],
|
|
494
547
|
len(segments),
|
|
495
|
-
self._device_info["led_count"]
|
|
548
|
+
self._device_info["led_count"],
|
|
549
|
+
len(effects),
|
|
550
|
+
len(palettes),
|
|
496
551
|
)
|
|
497
552
|
|
|
498
553
|
return self._device_info
|