boneio 1.4.0.dev1__tar.gz → 1.4.0.dev3__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.4.0.dev1/boneio.egg-info → boneio-1.4.0.dev3}/PKG-INFO +1 -1
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/venetian.py +93 -5
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/group/output_group.py +9 -2
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/controller.py +88 -26
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/water_source.py +39 -6
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/basic.py +22 -28
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/remote.py +6 -2
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/inputs.py +43 -1
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/irrigation.py +2 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/manager.py +267 -131
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions.yaml +28 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/schema.yaml +46 -0
- boneio-1.4.0.dev3/boneio/version.py +2 -0
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-D35Ov2Ei.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/ConfigEditor-B7qJAsAx.js +1 -1
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/aiConfig-C2Ks7Xed.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/aiConfig-Dq5oh99L.js +1 -1
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/aiWizardPrompt-yfvA94cl.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/aiWizardPrompt-r-xmvrUB.js +1 -1
- boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/index-BVRhWldF.js +44 -0
- boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/index-D-R9QzIP.css +2 -0
- boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/useTranslation-VOFZRLzq.js +13 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/index.html +4 -4
- {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +60 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/config.schema.json +328 -0
- {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/cover.schema.json +22 -0
- {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/event.schema.json +210 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/irrigation.schema.json +18 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/template.schema.json +18 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/binary_sensor.schema.json +60 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/config.schema.json +328 -0
- {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/cover.schema.json +22 -0
- {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/event.schema.json +210 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/irrigation.schema.json +18 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/template.schema.json +18 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/SOURCES.txt +6 -6
- boneio-1.4.0.dev1/boneio/version.py +0 -2
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/index-DEwnXFJ3.js +0 -44
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/index-DncHwhdn.css +0 -2
- boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/useTranslation-yM5lKQna.js +0 -13
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/LICENSE +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/MANIFEST.in +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/README.md +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/bonecli.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/cover.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/group/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/detectors.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/event.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/mcp.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/pca.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/pcf.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/const.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/package.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/discovery.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/events/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/events/bus.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/covers.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/display.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/remote.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/update.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/local.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/loxone.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/can.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/wled.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/system.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/state/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/state/manager.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/host_data.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/monitor.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/filter.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/logger.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/util.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/exceptions.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/client.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/node.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/interlock.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/lox_template.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/actions.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/runner.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/cli.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/client.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/utils.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/actions.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/events.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/files.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/logs.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/mqtt.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/state.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/runner.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/condition.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/filters.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/id.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/action_validation.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/app.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/can.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/config.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/system.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/update.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/services/logs.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/web_server.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/pyproject.toml +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/setup.cfg +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/setup.py +0 -0
- {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/tests/test_py313_compatibility.py +0 -0
|
@@ -25,8 +25,18 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
25
25
|
tilt_duration: TimePeriod, # ms
|
|
26
26
|
actuator_activation_duration: TimePeriod, # ms
|
|
27
27
|
restored_state: dict = DEFAULT_RESTORED_STATE,
|
|
28
|
+
tilt_restore_after_close: bool = False,
|
|
28
29
|
**kwargs,
|
|
29
30
|
) -> None:
|
|
31
|
+
"""Initialize venetian cover.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
tilt_duration: Duration for full tilt movement.
|
|
35
|
+
actuator_activation_duration: Actuator activation time (unused).
|
|
36
|
+
restored_state: Persisted position/tilt from disk.
|
|
37
|
+
tilt_restore_after_close: If True, restore previous tilt
|
|
38
|
+
position after closing the cover.
|
|
39
|
+
"""
|
|
30
40
|
self._tilt_duration = tilt_duration.total_milliseconds # Czas trwania ruchu lameli
|
|
31
41
|
self._initial_tilt_position = float(restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"]))
|
|
32
42
|
|
|
@@ -34,9 +44,9 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
34
44
|
# --- TILT ---
|
|
35
45
|
self._tilt_position = float(restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"]))
|
|
36
46
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
self._tilt_restore_after_close = tilt_restore_after_close
|
|
48
|
+
self._tilt_before_close: float | None = None
|
|
49
|
+
|
|
40
50
|
self._last_tilt_update = 0.0
|
|
41
51
|
|
|
42
52
|
super().__init__(
|
|
@@ -44,13 +54,15 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
44
54
|
**kwargs,
|
|
45
55
|
)
|
|
46
56
|
_LOGGER.debug(
|
|
47
|
-
"VenetianCover %s initialized: open_time=%dms, close_time=%dms, tilt_duration=%dms,
|
|
57
|
+
"VenetianCover %s initialized: open_time=%dms, close_time=%dms, tilt_duration=%dms, "
|
|
58
|
+
"position=%d%%, tilt=%d%%, tilt_restore=%s",
|
|
48
59
|
self._id,
|
|
49
60
|
self._open_time,
|
|
50
61
|
self._close_time,
|
|
51
62
|
self._tilt_duration,
|
|
52
63
|
position,
|
|
53
64
|
self._tilt_position,
|
|
65
|
+
self._tilt_restore_after_close,
|
|
54
66
|
)
|
|
55
67
|
|
|
56
68
|
def _move_cover(
|
|
@@ -168,6 +180,30 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
168
180
|
self._loop.call_soon_threadsafe(self.send_state_and_save, self.json_position)
|
|
169
181
|
self._last_update_time = time.monotonic() # Upewnij się, że aktualizacja jest wysłana na końcu ruchu
|
|
170
182
|
|
|
183
|
+
# Tilt restore: schedule tilt recovery on the event loop.
|
|
184
|
+
# Skip when position reached 0% (fully closed) or 100% (fully open)
|
|
185
|
+
# — at extremes, restoring tilt contradicts user intent.
|
|
186
|
+
if self._tilt_restore_after_close and self._tilt_before_close is not None:
|
|
187
|
+
restore_tilt = self._tilt_before_close
|
|
188
|
+
self._tilt_before_close = None
|
|
189
|
+
at_extreme = self._position <= 0 or self._position >= 100
|
|
190
|
+
if not at_extreme and restore_tilt > 0 and abs(self._tilt_position - restore_tilt) >= 1:
|
|
191
|
+
_LOGGER.info(
|
|
192
|
+
"VenetianCover %s: restoring tilt from %d%% to %d%%",
|
|
193
|
+
self._id,
|
|
194
|
+
round(self._tilt_position),
|
|
195
|
+
round(restore_tilt),
|
|
196
|
+
)
|
|
197
|
+
self._loop.call_soon_threadsafe(
|
|
198
|
+
lambda t=restore_tilt: asyncio.ensure_future(self.set_tilt(int(round(t))))
|
|
199
|
+
)
|
|
200
|
+
elif at_extreme:
|
|
201
|
+
_LOGGER.debug(
|
|
202
|
+
"VenetianCover %s: skipping tilt restore at extreme position %d%%",
|
|
203
|
+
self._id,
|
|
204
|
+
round(self._position),
|
|
205
|
+
)
|
|
206
|
+
|
|
171
207
|
async def set_tilt(self, tilt_position: int) -> None:
|
|
172
208
|
"""Setting tilt position."""
|
|
173
209
|
if not 0 <= tilt_position <= 100:
|
|
@@ -261,12 +297,62 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
261
297
|
)
|
|
262
298
|
await self.set_tilt(tilt_position=0)
|
|
263
299
|
|
|
300
|
+
def _save_tilt_for_restore(self) -> None:
|
|
301
|
+
"""Save current tilt position for later restoration.
|
|
302
|
+
|
|
303
|
+
Called before any closing movement when tilt_restore_after_close
|
|
304
|
+
is enabled. Clears saved value if tilt is already at 0%.
|
|
305
|
+
"""
|
|
306
|
+
if self._tilt_restore_after_close and self._tilt_position > 0:
|
|
307
|
+
self._tilt_before_close = self._tilt_position
|
|
308
|
+
_LOGGER.debug(
|
|
309
|
+
"VenetianCover %s: saving tilt=%d%% before close",
|
|
310
|
+
self._id,
|
|
311
|
+
round(self._tilt_position),
|
|
312
|
+
)
|
|
313
|
+
else:
|
|
314
|
+
self._tilt_before_close = None
|
|
315
|
+
|
|
316
|
+
async def close(self) -> None:
|
|
317
|
+
"""Close venetian cover.
|
|
318
|
+
|
|
319
|
+
If tilt_restore_after_close is enabled, saves the current tilt
|
|
320
|
+
position so it can be restored after the closing movement finishes.
|
|
321
|
+
"""
|
|
322
|
+
self._save_tilt_for_restore()
|
|
323
|
+
await super().close()
|
|
324
|
+
|
|
325
|
+
async def set_cover_position(self, position: int) -> None:
|
|
326
|
+
"""Set cover position with tilt restore support.
|
|
327
|
+
|
|
328
|
+
When moving to a lower position (closing direction) and
|
|
329
|
+
tilt_restore_after_close is enabled, saves the current tilt
|
|
330
|
+
so it can be restored after the movement finishes.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
position: Target position (0-100).
|
|
334
|
+
"""
|
|
335
|
+
if position < self._position:
|
|
336
|
+
self._save_tilt_for_restore()
|
|
337
|
+
else:
|
|
338
|
+
self._tilt_before_close = None
|
|
339
|
+
await super().set_cover_position(position)
|
|
340
|
+
|
|
341
|
+
async def open(self) -> None:
|
|
342
|
+
"""Open venetian cover.
|
|
343
|
+
|
|
344
|
+
Clears any saved tilt-before-close value since opening
|
|
345
|
+
resets the tilt to 100% naturally.
|
|
346
|
+
"""
|
|
347
|
+
self._tilt_before_close = None
|
|
348
|
+
await super().open()
|
|
349
|
+
|
|
264
350
|
def update_config_times(self, config: dict) -> None:
|
|
265
351
|
"""Update cover timing configuration.
|
|
266
352
|
|
|
267
353
|
Args:
|
|
268
354
|
config: Dictionary with timing values as TimePeriod objects.
|
|
269
|
-
Keys: open_time, close_time, tilt_duration
|
|
355
|
+
Keys: open_time, close_time, tilt_duration, tilt_restore_after_close
|
|
270
356
|
"""
|
|
271
357
|
if "open_time" in config:
|
|
272
358
|
self._open_time = config["open_time"].total_milliseconds
|
|
@@ -274,6 +360,8 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
274
360
|
self._close_time = config["close_time"].total_milliseconds
|
|
275
361
|
if "tilt_duration" in config and config["tilt_duration"]:
|
|
276
362
|
self._tilt_duration = config["tilt_duration"].total_milliseconds
|
|
363
|
+
if "tilt_restore_after_close" in config:
|
|
364
|
+
self._tilt_restore_after_close = bool(config["tilt_restore_after_close"])
|
|
277
365
|
|
|
278
366
|
async def run_cover(
|
|
279
367
|
self,
|
|
@@ -84,7 +84,7 @@ class OutputGroup(BasicOutput):
|
|
|
84
84
|
self._state = state
|
|
85
85
|
self._loop.create_task(self.async_send_state())
|
|
86
86
|
|
|
87
|
-
async def async_turn_on(self, timestamp=None) ->
|
|
87
|
+
async def async_turn_on(self, timestamp=None) -> bool:
|
|
88
88
|
"""Turn on all members in the group.
|
|
89
89
|
|
|
90
90
|
Executes turn_on sequentially to prevent I2C bus contention
|
|
@@ -92,9 +92,16 @@ class OutputGroup(BasicOutput):
|
|
|
92
92
|
|
|
93
93
|
Args:
|
|
94
94
|
timestamp: Optional timestamp for the operation
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if all members were turned on, False if any was blocked.
|
|
95
98
|
"""
|
|
99
|
+
all_ok = True
|
|
96
100
|
for x in self._group_members:
|
|
97
|
-
await x.async_turn_on(timestamp=timestamp)
|
|
101
|
+
result = await x.async_turn_on(timestamp=timestamp)
|
|
102
|
+
if not result:
|
|
103
|
+
all_ok = False
|
|
104
|
+
return all_ok
|
|
98
105
|
|
|
99
106
|
async def async_turn_off(self, timestamp=None) -> None:
|
|
100
107
|
"""Turn off all members in the group.
|
|
@@ -107,15 +107,15 @@ class IrrigationController:
|
|
|
107
107
|
self._schedule = schedule or []
|
|
108
108
|
self._water_sources = water_sources or []
|
|
109
109
|
self._active_water_source_idx: int = 0
|
|
110
|
-
self._valve_open_delay_s = max(0,
|
|
111
|
-
self._valve_overlap_s = max(0,
|
|
110
|
+
self._valve_open_delay_s = max(0, valve_open_delay_s)
|
|
111
|
+
self._valve_overlap_s = max(0, valve_overlap_s)
|
|
112
112
|
self._standby = standby
|
|
113
113
|
|
|
114
114
|
self._state = ControllerState.IDLE
|
|
115
115
|
self._auto_advance = auto_advance
|
|
116
116
|
self._reverse = reverse
|
|
117
|
-
self._multiplier = max(0.1,
|
|
118
|
-
self._repeat = max(0,
|
|
117
|
+
self._multiplier = max(0.1, multiplier)
|
|
118
|
+
self._repeat = max(0, repeat)
|
|
119
119
|
self._skip_next_run = False
|
|
120
120
|
|
|
121
121
|
self._zone_timer_cancel = None
|
|
@@ -526,7 +526,7 @@ class IrrigationController:
|
|
|
526
526
|
await self._stop_current_zone()
|
|
527
527
|
self._active_zone_idx = next_idx
|
|
528
528
|
duration = self._scaled_duration(next_zone.run_duration)
|
|
529
|
-
self._active_zone_remaining_s = max(1,
|
|
529
|
+
self._active_zone_remaining_s = max(1, duration)
|
|
530
530
|
self._run_start_utc = utcnow()
|
|
531
531
|
self._arm_zone_timer(self._active_zone_remaining_s)
|
|
532
532
|
await self.publish_all_states()
|
|
@@ -564,6 +564,9 @@ class IrrigationController:
|
|
|
564
564
|
|
|
565
565
|
Activates the water source outputs (if any), then opens the zone valve,
|
|
566
566
|
respecting per-source pump timing delays.
|
|
567
|
+
|
|
568
|
+
If any output is blocked by an interlock, the controller shuts down
|
|
569
|
+
and publishes an interlock fault notification.
|
|
567
570
|
"""
|
|
568
571
|
if idx < 0 or idx >= len(self._zones):
|
|
569
572
|
_LOGGER.error("Irrigation %s _start_zone: invalid index %d (zones=%d)", self.id, idx, len(self._zones))
|
|
@@ -571,7 +574,7 @@ class IrrigationController:
|
|
|
571
574
|
|
|
572
575
|
zone = self._zones[idx]
|
|
573
576
|
duration = override_duration if override_duration is not None else self._scaled_duration(zone.run_duration)
|
|
574
|
-
duration = max(1,
|
|
577
|
+
duration = max(1, duration)
|
|
575
578
|
src = self.active_water_source
|
|
576
579
|
|
|
577
580
|
_LOGGER.debug(
|
|
@@ -594,7 +597,10 @@ class IrrigationController:
|
|
|
594
597
|
_LOGGER.debug(
|
|
595
598
|
"Irrigation %s: source '%s' ON, then wait %ds", self.id, src.id, src.pump_start_valve_delay_s
|
|
596
599
|
)
|
|
597
|
-
await self._activate_source()
|
|
600
|
+
source_ok = await self._activate_source()
|
|
601
|
+
if not source_ok:
|
|
602
|
+
await self._handle_interlock_fault(zone.id, src.id)
|
|
603
|
+
return
|
|
598
604
|
await asyncio.sleep(src.pump_start_valve_delay_s)
|
|
599
605
|
elif src.pump_start_pump_delay_s > 0:
|
|
600
606
|
# Zone valve first, then source after delay
|
|
@@ -605,13 +611,21 @@ class IrrigationController:
|
|
|
605
611
|
src.pump_start_pump_delay_s,
|
|
606
612
|
)
|
|
607
613
|
try:
|
|
608
|
-
await zone.valve.async_turn_on(timestamp=time.time())
|
|
614
|
+
valve_ok = await zone.valve.async_turn_on(timestamp=time.time())
|
|
615
|
+
if not valve_ok:
|
|
616
|
+
await self._handle_interlock_fault(zone.id, src.id)
|
|
617
|
+
return
|
|
609
618
|
except Exception as err:
|
|
610
619
|
_LOGGER.error("Failed to turn on zone %s: %s", zone.id, err)
|
|
611
620
|
await self.shutdown()
|
|
612
621
|
return
|
|
613
622
|
await asyncio.sleep(src.pump_start_pump_delay_s)
|
|
614
|
-
await self._activate_source()
|
|
623
|
+
source_ok = await self._activate_source()
|
|
624
|
+
if not source_ok:
|
|
625
|
+
# Valve was already ON — turn it off before shutting down
|
|
626
|
+
await zone.valve.async_turn_off(timestamp=time.time())
|
|
627
|
+
await self._handle_interlock_fault(zone.id, src.id)
|
|
628
|
+
return
|
|
615
629
|
try:
|
|
616
630
|
self._run_start_utc = utcnow()
|
|
617
631
|
self._arm_zone_timer(duration)
|
|
@@ -629,13 +643,20 @@ class IrrigationController:
|
|
|
629
643
|
else:
|
|
630
644
|
# No delay — activate source, then optional valve_open_delay
|
|
631
645
|
_LOGGER.debug("Irrigation %s: source '%s' ON (no delay)", self.id, src.id)
|
|
632
|
-
await self._activate_source()
|
|
646
|
+
source_ok = await self._activate_source()
|
|
647
|
+
if not source_ok:
|
|
648
|
+
await self._handle_interlock_fault(zone.id, src.id)
|
|
649
|
+
return
|
|
633
650
|
if self._valve_open_delay_s > 0:
|
|
634
651
|
await asyncio.sleep(self._valve_open_delay_s)
|
|
635
652
|
|
|
636
653
|
try:
|
|
637
654
|
_LOGGER.debug("Irrigation %s: turning ON valve %s", self.id, zone.valve.id)
|
|
638
|
-
await zone.valve.async_turn_on(timestamp=time.time())
|
|
655
|
+
valve_ok = await zone.valve.async_turn_on(timestamp=time.time())
|
|
656
|
+
if not valve_ok:
|
|
657
|
+
await self._deactivate_source()
|
|
658
|
+
await self._handle_interlock_fault(zone.id, src.id if src else None)
|
|
659
|
+
return
|
|
639
660
|
_LOGGER.debug("Irrigation %s: valve %s turned ON successfully", self.id, zone.valve.id)
|
|
640
661
|
except Exception as err:
|
|
641
662
|
_LOGGER.error("Failed to turn on zone %s valve %s: %s", zone.id, zone.valve.id, err, exc_info=True)
|
|
@@ -667,16 +688,21 @@ class IrrigationController:
|
|
|
667
688
|
except Exception as err:
|
|
668
689
|
_LOGGER.error("Failed to turn off zone %s: %s", zone.id, err)
|
|
669
690
|
|
|
670
|
-
async def _activate_source(self) ->
|
|
671
|
-
"""Turn ON all outputs of the active water source.
|
|
691
|
+
async def _activate_source(self) -> bool:
|
|
692
|
+
"""Turn ON all outputs of the active water source.
|
|
693
|
+
|
|
694
|
+
Returns:
|
|
695
|
+
True if source was activated, False if blocked by interlock.
|
|
696
|
+
"""
|
|
672
697
|
src = self.active_water_source
|
|
673
698
|
if src is None:
|
|
674
|
-
return
|
|
699
|
+
return True
|
|
675
700
|
try:
|
|
676
701
|
_LOGGER.debug("Irrigation %s: activating source '%s' outputs=%s", self.id, src.id, src.output_ids)
|
|
677
|
-
await src.activate(timestamp=time.time())
|
|
702
|
+
return await src.activate(timestamp=time.time())
|
|
678
703
|
except Exception as err:
|
|
679
704
|
_LOGGER.error("Failed to activate water source '%s' for %s: %s", src.id, self.id, err)
|
|
705
|
+
return False
|
|
680
706
|
|
|
681
707
|
async def _deactivate_source(self) -> None:
|
|
682
708
|
"""Turn OFF all outputs of the active water source."""
|
|
@@ -689,6 +715,42 @@ class IrrigationController:
|
|
|
689
715
|
except Exception as err:
|
|
690
716
|
_LOGGER.error("Failed to deactivate water source '%s' for %s: %s", src.id, self.id, err)
|
|
691
717
|
|
|
718
|
+
async def _handle_interlock_fault(self, zone_id: str, source_id: str | None) -> None:
|
|
719
|
+
"""Handle interlock-blocked activation.
|
|
720
|
+
|
|
721
|
+
Shuts down the controller and publishes a fault notification via MQTT
|
|
722
|
+
so that Home Assistant (or other consumers) can alert the user.
|
|
723
|
+
|
|
724
|
+
Args:
|
|
725
|
+
zone_id: ID of the zone that was being started.
|
|
726
|
+
source_id: ID of the water source (if any) whose output was blocked.
|
|
727
|
+
"""
|
|
728
|
+
source_info = f" (source '{source_id}')" if source_id else ""
|
|
729
|
+
_LOGGER.error(
|
|
730
|
+
"Irrigation %s: INTERLOCK FAULT — could not start zone '%s'%s. "
|
|
731
|
+
"Another controller or output in the same interlock group is active. Shutting down.",
|
|
732
|
+
self.id,
|
|
733
|
+
zone_id,
|
|
734
|
+
source_info,
|
|
735
|
+
)
|
|
736
|
+
|
|
737
|
+
# Publish fault notification on MQTT
|
|
738
|
+
fault_payload = {
|
|
739
|
+
"fault": "interlock_blocked",
|
|
740
|
+
"controller": self.id,
|
|
741
|
+
"zone": zone_id,
|
|
742
|
+
"source": source_id or "",
|
|
743
|
+
"message": f"Irrigation '{self.name}' stopped: output blocked by interlock (zone: {zone_id})",
|
|
744
|
+
}
|
|
745
|
+
self._publish(
|
|
746
|
+
f"{self._topic_prefix}/{IRRIGATION}/{self.id}/fault",
|
|
747
|
+
fault_payload,
|
|
748
|
+
retain=False,
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
await self.shutdown()
|
|
752
|
+
await self.publish_all_states()
|
|
753
|
+
|
|
692
754
|
async def _handle_pump_stop_sequence(self) -> None:
|
|
693
755
|
"""Handle pump stop timing according to active water source's delays."""
|
|
694
756
|
src = self.active_water_source
|
|
@@ -706,7 +768,7 @@ class IrrigationController:
|
|
|
706
768
|
await self._deactivate_source()
|
|
707
769
|
|
|
708
770
|
def _scaled_duration(self, seconds: int) -> int:
|
|
709
|
-
return
|
|
771
|
+
return max(1, round(seconds * self._multiplier))
|
|
710
772
|
|
|
711
773
|
def _current_zone_duration_seconds(self) -> int:
|
|
712
774
|
if self._active_zone_idx is None:
|
|
@@ -727,7 +789,7 @@ class IrrigationController:
|
|
|
727
789
|
|
|
728
790
|
def _arm_zone_timer(self, seconds: int) -> None:
|
|
729
791
|
self._cancel_zone_timer()
|
|
730
|
-
point = utcnow() + timedelta(seconds=max(1,
|
|
792
|
+
point = utcnow() + timedelta(seconds=max(1, seconds))
|
|
731
793
|
self._zone_timer_cancel = async_track_point_in_time(
|
|
732
794
|
loop=self._event_bus._loop,
|
|
733
795
|
job=self._zone_timer_callback,
|
|
@@ -781,42 +843,42 @@ class IrrigationController:
|
|
|
781
843
|
await self.publish_all_states()
|
|
782
844
|
|
|
783
845
|
async def set_auto_advance(self, value: bool) -> None:
|
|
784
|
-
self._auto_advance =
|
|
846
|
+
self._auto_advance = value
|
|
785
847
|
self._save("auto_advance", self._auto_advance)
|
|
786
848
|
await self.publish_all_states()
|
|
787
849
|
|
|
788
850
|
async def set_reverse(self, value: bool) -> None:
|
|
789
|
-
self._reverse =
|
|
851
|
+
self._reverse = value
|
|
790
852
|
self._save("reverse", self._reverse)
|
|
791
853
|
await self.publish_all_states()
|
|
792
854
|
|
|
793
855
|
async def set_standby(self, value: bool) -> None:
|
|
794
|
-
self._standby =
|
|
856
|
+
self._standby = value
|
|
795
857
|
self._save("standby", self._standby)
|
|
796
858
|
if self._standby and self._state in (ControllerState.RUNNING, ControllerState.PAUSED):
|
|
797
859
|
await self.shutdown()
|
|
798
860
|
await self.publish_all_states()
|
|
799
861
|
|
|
800
862
|
async def set_multiplier(self, value: float) -> None:
|
|
801
|
-
self._multiplier = max(0.1,
|
|
863
|
+
self._multiplier = max(0.1, value)
|
|
802
864
|
self._save("multiplier", self._multiplier)
|
|
803
865
|
await self.publish_all_states()
|
|
804
866
|
|
|
805
867
|
async def set_repeat(self, value: int) -> None:
|
|
806
|
-
self._repeat = max(0,
|
|
868
|
+
self._repeat = max(0, value)
|
|
807
869
|
self._save("repeat", self._repeat)
|
|
808
870
|
await self.publish_all_states()
|
|
809
871
|
|
|
810
872
|
async def set_zone_enabled(self, zone_id: str, value: bool) -> None:
|
|
811
873
|
for zone in self._zones:
|
|
812
874
|
if zone.id == zone_id:
|
|
813
|
-
zone.enabled =
|
|
875
|
+
zone.enabled = value
|
|
814
876
|
self._save(f"zone/{zone.id}/enabled", zone.enabled)
|
|
815
877
|
break
|
|
816
878
|
await self.publish_all_states()
|
|
817
879
|
|
|
818
880
|
async def set_skip_next_run(self, value: bool) -> None:
|
|
819
|
-
self._skip_next_run =
|
|
881
|
+
self._skip_next_run = value
|
|
820
882
|
self._save("skip_next_run", self._skip_next_run)
|
|
821
883
|
await self.publish_all_states()
|
|
822
884
|
|
|
@@ -838,8 +900,8 @@ class IrrigationController:
|
|
|
838
900
|
async def set_schedule_skip(self, schedule_idx: int, value: bool) -> None:
|
|
839
901
|
if schedule_idx < 0 or schedule_idx >= len(self._schedule):
|
|
840
902
|
return
|
|
841
|
-
self._schedule[schedule_idx]["skip"] =
|
|
842
|
-
self._save(f"schedule/{schedule_idx}/skip",
|
|
903
|
+
self._schedule[schedule_idx]["skip"] = value
|
|
904
|
+
self._save(f"schedule/{schedule_idx}/skip", value)
|
|
843
905
|
await self.publish_all_states()
|
|
844
906
|
|
|
845
907
|
def start_schedules(self) -> None:
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import asyncio
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
7
|
from typing import TYPE_CHECKING, Any
|
|
7
8
|
|
|
8
9
|
if TYPE_CHECKING:
|
|
9
|
-
from boneio.components.
|
|
10
|
+
from boneio.components.output.basic import BasicOutput
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
@dataclass
|
|
@@ -16,14 +17,20 @@ class WaterSource:
|
|
|
16
17
|
A water source defines which physical outputs (valves, pumps) need to be
|
|
17
18
|
activated to supply water from this particular source.
|
|
18
19
|
|
|
20
|
+
When multiple outputs are defined and output_start_delay_s > 0,
|
|
21
|
+
outputs are activated sequentially (in order) with the specified delay
|
|
22
|
+
between each. On deactivation, outputs are turned off in reverse order.
|
|
23
|
+
|
|
19
24
|
Example sources:
|
|
20
25
|
- City water: single valve (OUT_06)
|
|
21
|
-
- Rainwater: valve (OUT_07) + pump (OUT_08) with
|
|
26
|
+
- Rainwater: valve (OUT_07) + pump (OUT_08) with 2s sequential delay
|
|
22
27
|
|
|
23
28
|
Attributes:
|
|
24
29
|
id: Unique identifier for this water source.
|
|
25
30
|
name: Human-readable name.
|
|
26
31
|
outputs: List of outputs to activate when this source is selected.
|
|
32
|
+
output_start_delay_s: Seconds to wait between activating each output (sequential ON).
|
|
33
|
+
output_stop_delay_s: Seconds to wait between deactivating each output (sequential OFF, reverse order).
|
|
27
34
|
pump_start_pump_delay_s: Seconds to wait after opening valve before starting pump.
|
|
28
35
|
pump_start_valve_delay_s: Seconds to wait after starting pump before opening zone valve.
|
|
29
36
|
pump_stop_pump_delay_s: Seconds to wait after closing zone valve before stopping pump.
|
|
@@ -34,31 +41,57 @@ class WaterSource:
|
|
|
34
41
|
id: str
|
|
35
42
|
name: str
|
|
36
43
|
outputs: list[BasicOutput] = field(default_factory=list)
|
|
44
|
+
output_start_delay_s: int = 0
|
|
45
|
+
output_stop_delay_s: int = 0
|
|
37
46
|
pump_start_pump_delay_s: int = 0
|
|
38
47
|
pump_start_valve_delay_s: int = 0
|
|
39
48
|
pump_stop_pump_delay_s: int = 0
|
|
40
49
|
pump_stop_valve_delay_s: int = 0
|
|
41
50
|
pump_switch_off_during_valve_open_delay: bool = False
|
|
42
51
|
|
|
43
|
-
async def activate(self, timestamp: float) ->
|
|
52
|
+
async def activate(self, timestamp: float) -> bool:
|
|
44
53
|
"""Turn ON all outputs for this water source.
|
|
45
54
|
|
|
55
|
+
When output_start_delay_s > 0, outputs are activated sequentially
|
|
56
|
+
(first to last) with the configured delay between each one.
|
|
57
|
+
|
|
58
|
+
If any output is blocked by an interlock, all already-activated
|
|
59
|
+
outputs are rolled back (turned off in reverse order).
|
|
60
|
+
|
|
46
61
|
Args:
|
|
47
62
|
timestamp: Current timestamp for relay control.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
True if all outputs were activated, False if any was blocked.
|
|
48
66
|
"""
|
|
49
|
-
for output in self.outputs:
|
|
50
|
-
await output.async_turn_on(timestamp=timestamp)
|
|
67
|
+
for i, output in enumerate(self.outputs):
|
|
68
|
+
result = await output.async_turn_on(timestamp=timestamp)
|
|
69
|
+
if not result:
|
|
70
|
+
# Rollback: turn off already-activated outputs in reverse
|
|
71
|
+
for j in range(i - 1, -1, -1):
|
|
72
|
+
await self.outputs[j].async_turn_off(timestamp=timestamp)
|
|
73
|
+
return False
|
|
74
|
+
if self.output_start_delay_s > 0 and i < len(self.outputs) - 1:
|
|
75
|
+
await asyncio.sleep(self.output_start_delay_s)
|
|
76
|
+
return True
|
|
51
77
|
|
|
52
78
|
async def deactivate(self, timestamp: float) -> None:
|
|
53
79
|
"""Turn OFF all outputs for this water source.
|
|
54
80
|
|
|
81
|
+
When output_stop_delay_s > 0, outputs are deactivated in reverse
|
|
82
|
+
order (last to first) with the configured delay between each one.
|
|
83
|
+
|
|
55
84
|
Args:
|
|
56
85
|
timestamp: Current timestamp for relay control.
|
|
57
86
|
"""
|
|
58
|
-
|
|
87
|
+
reversed_outputs = list(reversed(self.outputs))
|
|
88
|
+
for i, output in enumerate(reversed_outputs):
|
|
59
89
|
await output.async_turn_off(timestamp=timestamp)
|
|
90
|
+
if self.output_stop_delay_s > 0 and i < len(reversed_outputs) - 1:
|
|
91
|
+
await asyncio.sleep(self.output_stop_delay_s)
|
|
60
92
|
|
|
61
93
|
@property
|
|
62
94
|
def output_ids(self) -> list[str]:
|
|
63
95
|
"""Return list of output IDs for display/logging."""
|
|
64
96
|
return [o.id for o in self.outputs]
|
|
97
|
+
|