boneio 1.4.0.dev12__tar.gz → 1.4.0.dev14__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.dev12/boneio.egg-info → boneio-1.4.0.dev14}/PKG-INFO +1 -1
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/irrigation/controller.py +124 -24
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/inputs.py +71 -21
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/irrigation.py +8 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/display/oled.py +1 -1
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/integration/homeassistant.py +4 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/hvac/eht-topventil-plus.json +71 -3
- boneio-1.4.0.dev14/boneio/version.py +2 -0
- boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/ConfigEditor-Cs0wqNzh.js → boneio-1.4.0.dev14/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +1 -1
- boneio-1.4.0.dev14/boneio/webui/frontend-dist/assets/index-DarJzEhw.js +100 -0
- boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/useTranslation-BbOWxWUU.js → boneio-1.4.0.dev14/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +2 -2
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/irrigation.py +19 -6
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio.egg-info/SOURCES.txt +3 -3
- boneio-1.4.0.dev12/boneio/version.py +0 -2
- boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/index-DvzU3Ztp.js +0 -100
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/LICENSE +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/MANIFEST.in +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/README.md +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/bonecli.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/cover/cover.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/group/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/group/output_group.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/detectors.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/event.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/basic.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/mcp.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/pca.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/pcf.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/output/remote.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/template/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/const.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/package.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/discovery.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/events/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/events/bus.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/covers.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/display.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/manager.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/remote.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/templates.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/manager/update.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/local.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/can.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/remote/wled.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/sensor/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/sensor/system.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/state/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/state/manager.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/system/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/system/host_data.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/system/monitor.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/filter.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/logger.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/core/utils/util.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/exceptions.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/client.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/node.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/integration/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/integration/interlock.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/integration/lox_template.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/actions.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/runner.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/cli.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/client.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/utils.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/actions.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/events.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/files.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/logs.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/mqtt.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/models/state.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/runner.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/actions.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/condition.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/filters.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/id.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/schema.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/action_validation.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/app.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/can.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/config.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/system.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/routes/update.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/services/logs.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/web_server.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/pyproject.toml +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/setup.cfg +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/setup.py +0 -0
- {boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/tests/test_py313_compatibility.py +0 -0
|
@@ -262,43 +262,62 @@ class IrrigationController:
|
|
|
262
262
|
def _eligible_zones(self) -> list[tuple[int, IrrigationZone]]:
|
|
263
263
|
"""Determine which zones are eligible to run in this cycle.
|
|
264
264
|
|
|
265
|
+
This is a **pure** function — it does NOT modify skip counters.
|
|
266
|
+
Use :meth:`_apply_skip_counters` once at the start of a scheduled
|
|
267
|
+
cycle to advance counters.
|
|
268
|
+
|
|
265
269
|
Uses a counter-based system: each zone has a skip counter that
|
|
266
270
|
increments every scheduled cycle. When the counter reaches
|
|
267
271
|
run_every_n - 1, the zone is eligible and the counter resets.
|
|
268
|
-
Manual starts do not affect the counter.
|
|
269
272
|
"""
|
|
270
273
|
eligible: list[tuple[int, IrrigationZone]] = []
|
|
271
274
|
for idx, zone in self._ordered_zones():
|
|
272
275
|
if not zone.enabled:
|
|
273
|
-
_LOGGER.debug("Irrigation %s: zone %s skipped (disabled)", self.id, zone.id)
|
|
274
276
|
continue
|
|
275
277
|
if zone.run_every_n <= 1:
|
|
276
|
-
# run_every_n=1 means run every time
|
|
277
278
|
eligible.append((idx, zone))
|
|
278
279
|
continue
|
|
279
280
|
counter_key = f"zone/{zone.id}/skip_count"
|
|
280
281
|
skip_count = int(self._get(counter_key, 0))
|
|
281
282
|
if skip_count >= zone.run_every_n - 1:
|
|
283
|
+
eligible.append((idx, zone))
|
|
284
|
+
return eligible
|
|
285
|
+
|
|
286
|
+
def _apply_skip_counters(self) -> None:
|
|
287
|
+
"""Advance skip counters for all zones at the start of a scheduled cycle.
|
|
288
|
+
|
|
289
|
+
For each enabled zone with ``run_every_n > 1``:
|
|
290
|
+
- If the zone IS eligible (skip_count >= run_every_n - 1),
|
|
291
|
+
reset counter to 0 (zone will run this cycle).
|
|
292
|
+
- If the zone is NOT eligible, increment the counter.
|
|
293
|
+
|
|
294
|
+
Must be called **exactly once** per scheduled cycle, before
|
|
295
|
+
``_eligible_zones()`` is used to build the run list.
|
|
296
|
+
"""
|
|
297
|
+
for _idx, zone in self._ordered_zones():
|
|
298
|
+
if not zone.enabled or zone.run_every_n <= 1:
|
|
299
|
+
continue
|
|
300
|
+
counter_key = f"zone/{zone.id}/skip_count"
|
|
301
|
+
skip_count = int(self._get(counter_key, 0))
|
|
302
|
+
if skip_count >= zone.run_every_n - 1:
|
|
303
|
+
# Zone is eligible — reset counter
|
|
304
|
+
self._save(counter_key, 0)
|
|
282
305
|
_LOGGER.debug(
|
|
283
|
-
"Irrigation %s: zone %s
|
|
306
|
+
"Irrigation %s: zone %s counter reset (was %d, eligible)",
|
|
284
307
|
self.id,
|
|
285
308
|
zone.id,
|
|
286
309
|
skip_count,
|
|
287
|
-
zone.run_every_n - 1,
|
|
288
310
|
)
|
|
289
|
-
eligible.append((idx, zone))
|
|
290
|
-
# Reset counter — will be saved when zone finishes in _advance_to_next_zone
|
|
291
311
|
else:
|
|
292
312
|
skip_count += 1
|
|
293
313
|
self._save(counter_key, skip_count)
|
|
294
314
|
_LOGGER.debug(
|
|
295
|
-
"Irrigation %s: zone %s
|
|
315
|
+
"Irrigation %s: zone %s counter incremented to %d/%d",
|
|
296
316
|
self.id,
|
|
297
317
|
zone.id,
|
|
298
318
|
skip_count,
|
|
299
319
|
zone.run_every_n - 1,
|
|
300
320
|
)
|
|
301
|
-
return eligible
|
|
302
321
|
|
|
303
322
|
async def publish_all_states(self) -> None:
|
|
304
323
|
controller_state = ON if self._state in (ControllerState.RUNNING, ControllerState.PAUSED) else OFF
|
|
@@ -346,7 +365,23 @@ class IrrigationController:
|
|
|
346
365
|
active,
|
|
347
366
|
self._active_zone_idx,
|
|
348
367
|
)
|
|
349
|
-
|
|
368
|
+
zone_payload: dict[str, Any] = {"state": active}
|
|
369
|
+
# Add next_run attributes for zones with run_every_n > 1
|
|
370
|
+
if zone.run_every_n > 1:
|
|
371
|
+
zone_next_dt = self._compute_zone_next_run_time(zone)
|
|
372
|
+
counter_key = f"zone/{zone.id}/skip_count"
|
|
373
|
+
skip_count = int(self._get(counter_key, 0))
|
|
374
|
+
zone_payload["run_every_n"] = zone.run_every_n
|
|
375
|
+
zone_payload["skip_count"] = skip_count
|
|
376
|
+
if zone_next_dt is not None:
|
|
377
|
+
local_tz = _local_now().tzinfo
|
|
378
|
+
next_local = zone_next_dt.astimezone(local_tz)
|
|
379
|
+
zone_payload["next_run_iso"] = zone_next_dt.isoformat()
|
|
380
|
+
zone_payload["next_run_pretty"] = next_local.strftime("%d %b %Y, %H:%M")
|
|
381
|
+
else:
|
|
382
|
+
zone_payload["next_run_iso"] = ""
|
|
383
|
+
zone_payload["next_run_pretty"] = ""
|
|
384
|
+
self._publish(self._zone_state_topic(zone.id), zone_payload)
|
|
350
385
|
self._publish(
|
|
351
386
|
self._setting_state_topic(f"zone/{zone.id}/enabled"),
|
|
352
387
|
{"state": ON if zone.enabled else OFF},
|
|
@@ -464,7 +499,7 @@ class IrrigationController:
|
|
|
464
499
|
_LOGGER.info("Irrigation %s skipped one full cycle", self.id)
|
|
465
500
|
return
|
|
466
501
|
|
|
467
|
-
await self._start_cycle_from_eligible()
|
|
502
|
+
await self._start_cycle_from_eligible(scheduled=True)
|
|
468
503
|
|
|
469
504
|
async def start_single_zone(self, zone_id: str) -> None:
|
|
470
505
|
_LOGGER.debug(
|
|
@@ -502,8 +537,17 @@ class IrrigationController:
|
|
|
502
537
|
_LOGGER.debug("Irrigation %s calling _start_zone(%d) for zone '%s'", self.id, match_idx, zone_id)
|
|
503
538
|
await self._start_zone(match_idx)
|
|
504
539
|
|
|
505
|
-
async def _start_cycle_from_eligible(self) -> None:
|
|
540
|
+
async def _start_cycle_from_eligible(self, scheduled: bool = False) -> None:
|
|
541
|
+
"""Build the eligible zone list and start the first zone.
|
|
542
|
+
|
|
543
|
+
When ``scheduled`` is True (i.e. triggered by the daily schedule,
|
|
544
|
+
not a repeat), skip counters are advanced **after** reading
|
|
545
|
+
eligibility so that the current counter values decide this cycle
|
|
546
|
+
and the increments prepare counters for the next one.
|
|
547
|
+
"""
|
|
506
548
|
eligible = self._eligible_zones()
|
|
549
|
+
if scheduled:
|
|
550
|
+
self._apply_skip_counters()
|
|
507
551
|
_LOGGER.debug(
|
|
508
552
|
"Irrigation %s _start_cycle_from_eligible: %d eligible zones: %s",
|
|
509
553
|
self.id,
|
|
@@ -535,9 +579,6 @@ class IrrigationController:
|
|
|
535
579
|
|
|
536
580
|
finished_idx = self._active_zone_idx
|
|
537
581
|
finished_zone = self._zones[finished_idx]
|
|
538
|
-
# Reset skip counter for scheduled runs only (manual starts don't affect counters)
|
|
539
|
-
if not self._single_zone_mode:
|
|
540
|
-
self._save(f"zone/{finished_zone.id}/skip_count", 0)
|
|
541
582
|
|
|
542
583
|
if self._single_zone_mode:
|
|
543
584
|
_LOGGER.debug("Irrigation %s: single zone mode complete for zone '%s'", self.id, finished_zone.id)
|
|
@@ -650,6 +691,13 @@ class IrrigationController:
|
|
|
650
691
|
self._active_zone_remaining_s = duration
|
|
651
692
|
self._state = ControllerState.RUNNING
|
|
652
693
|
|
|
694
|
+
# Publish state immediately so the UI (frontend + HA) shows
|
|
695
|
+
# RUNNING right away, before any pump/valve delay sleeps.
|
|
696
|
+
# The timer has not been armed yet so zone_end_time will be
|
|
697
|
+
# empty, but a second publish happens after hardware activation.
|
|
698
|
+
self._run_start_utc = utcnow()
|
|
699
|
+
await self.publish_all_states()
|
|
700
|
+
|
|
653
701
|
if src is not None:
|
|
654
702
|
if src.pump_start_valve_delay_s > 0:
|
|
655
703
|
# Source first (pump+valve), then zone valve after delay
|
|
@@ -1032,6 +1080,46 @@ class IrrigationController:
|
|
|
1032
1080
|
earliest = candidate
|
|
1033
1081
|
return earliest
|
|
1034
1082
|
|
|
1083
|
+
def _compute_zone_next_run_time(self, zone: IrrigationZone) -> datetime | None:
|
|
1084
|
+
"""Compute when a specific zone will actually run next.
|
|
1085
|
+
|
|
1086
|
+
Accounts for ``run_every_n``: if the zone needs 2 more skipped
|
|
1087
|
+
cycles before it's eligible, this returns the fire time of the
|
|
1088
|
+
(skip_remaining + 1)th upcoming schedule.
|
|
1089
|
+
|
|
1090
|
+
Args:
|
|
1091
|
+
zone: The irrigation zone to compute for.
|
|
1092
|
+
|
|
1093
|
+
Returns:
|
|
1094
|
+
Timezone-aware UTC datetime of the zone's next actual run,
|
|
1095
|
+
or None if no schedules are configured or the controller
|
|
1096
|
+
is in standby or the zone is disabled.
|
|
1097
|
+
"""
|
|
1098
|
+
if not self._schedule or self._standby or not zone.enabled:
|
|
1099
|
+
return None
|
|
1100
|
+
|
|
1101
|
+
if zone.run_every_n <= 1:
|
|
1102
|
+
# Runs every cycle — same as controller next_run_time
|
|
1103
|
+
return self._compute_next_run_time()
|
|
1104
|
+
|
|
1105
|
+
counter_key = f"zone/{zone.id}/skip_count"
|
|
1106
|
+
skip_count = int(self._get(counter_key, 0))
|
|
1107
|
+
remaining_skips = max(0, (zone.run_every_n - 1) - skip_count)
|
|
1108
|
+
|
|
1109
|
+
# The zone will run on the (remaining_skips + 1)th cycle
|
|
1110
|
+
cycles_until_run = remaining_skips + 1
|
|
1111
|
+
|
|
1112
|
+
# Find the Nth fire time across all schedules
|
|
1113
|
+
# Strategy: collect fire times from all schedules, sort, pick Nth
|
|
1114
|
+
earliest: datetime | None = None
|
|
1115
|
+
for schedule in self._schedule:
|
|
1116
|
+
time_str = schedule.get("time", "06:00")
|
|
1117
|
+
days = str(schedule.get("days", "daily")).strip().lower()
|
|
1118
|
+
candidate = _nth_fire_time(time_str, days, n=cycles_until_run)
|
|
1119
|
+
if earliest is None or candidate < earliest:
|
|
1120
|
+
earliest = candidate
|
|
1121
|
+
return earliest
|
|
1122
|
+
|
|
1035
1123
|
def start_schedules(self) -> None:
|
|
1036
1124
|
self.stop_schedules()
|
|
1037
1125
|
for idx, schedule in enumerate(self._schedule):
|
|
@@ -1071,17 +1159,25 @@ def _local_now() -> datetime:
|
|
|
1071
1159
|
def _next_fire_time(time_str: str, days: str) -> datetime:
|
|
1072
1160
|
"""Compute next fire time for a schedule entry.
|
|
1073
1161
|
|
|
1162
|
+
Shorthand for ``_nth_fire_time(time_str, days, n=1)``.
|
|
1163
|
+
"""
|
|
1164
|
+
return _nth_fire_time(time_str, days, n=1)
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
def _nth_fire_time(time_str: str, days: str, n: int = 1) -> datetime:
|
|
1168
|
+
"""Compute the Nth upcoming fire time for a schedule entry.
|
|
1169
|
+
|
|
1074
1170
|
The user-configured ``time_str`` (e.g. "18:00") is in **local time**.
|
|
1075
|
-
We build
|
|
1076
|
-
to UTC
|
|
1077
|
-
``device_class: timestamp`` work correctly.
|
|
1171
|
+
We build candidates in the system's local timezone and then convert
|
|
1172
|
+
to UTC.
|
|
1078
1173
|
|
|
1079
1174
|
Args:
|
|
1080
1175
|
time_str: Schedule time in "HH:MM" format (local time).
|
|
1081
|
-
days: Day filter string ("daily", "weekdays", "weekends",
|
|
1176
|
+
days: Day filter string ("daily", "weekdays", "weekends", etc.).
|
|
1177
|
+
n: Which occurrence to return (1 = next, 2 = the one after, etc.).
|
|
1082
1178
|
|
|
1083
1179
|
Returns:
|
|
1084
|
-
|
|
1180
|
+
Nth fire time as a timezone-aware UTC datetime.
|
|
1085
1181
|
"""
|
|
1086
1182
|
now_local = _local_now()
|
|
1087
1183
|
|
|
@@ -1093,8 +1189,9 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
|
|
|
1093
1189
|
target_h, target_m = 6, 0
|
|
1094
1190
|
|
|
1095
1191
|
allowed_days = _DAYS_MAP.get(days, _DAYS_MAP["daily"])
|
|
1192
|
+
found = 0
|
|
1096
1193
|
|
|
1097
|
-
for plus_days in range(0,
|
|
1194
|
+
for plus_days in range(0, 366):
|
|
1098
1195
|
candidate_local = (now_local + timedelta(days=plus_days)).replace(
|
|
1099
1196
|
hour=target_h,
|
|
1100
1197
|
minute=target_m,
|
|
@@ -1102,10 +1199,12 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
|
|
|
1102
1199
|
microsecond=0,
|
|
1103
1200
|
)
|
|
1104
1201
|
if candidate_local.weekday() in allowed_days and candidate_local > now_local:
|
|
1105
|
-
|
|
1106
|
-
|
|
1202
|
+
found += 1
|
|
1203
|
+
if found >= n:
|
|
1204
|
+
return candidate_local.astimezone(dt.UTC)
|
|
1107
1205
|
|
|
1108
|
-
|
|
1206
|
+
# Fallback (should never reach for n <= 365)
|
|
1207
|
+
fallback_local = (now_local + timedelta(days=n)).replace(
|
|
1109
1208
|
hour=target_h,
|
|
1110
1209
|
minute=target_m,
|
|
1111
1210
|
second=0,
|
|
@@ -1113,3 +1212,4 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
|
|
|
1113
1212
|
)
|
|
1114
1213
|
return fallback_local.astimezone(dt.UTC)
|
|
1115
1214
|
|
|
1215
|
+
|
|
@@ -130,8 +130,16 @@ class InputManager:
|
|
|
130
130
|
return False
|
|
131
131
|
return False
|
|
132
132
|
|
|
133
|
-
def configure_single_input(
|
|
134
|
-
|
|
133
|
+
def configure_single_input(
|
|
134
|
+
configure_sensor_func: Callable, gpio: dict, expected_class: type
|
|
135
|
+
) -> None:
|
|
136
|
+
"""Configure a single input (event or binary sensor).
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
configure_sensor_func: The _configure_event_sensor or _configure_binary_sensor method.
|
|
140
|
+
gpio: GPIO configuration dictionary.
|
|
141
|
+
expected_class: The expected class type (GpioEventButton or GpioInputBinarySensor).
|
|
142
|
+
"""
|
|
135
143
|
# Work on a copy to avoid modifying the cached config
|
|
136
144
|
gpio_copy = gpio.copy()
|
|
137
145
|
|
|
@@ -149,6 +157,18 @@ class InputManager:
|
|
|
149
157
|
|
|
150
158
|
existing_input = self._inputs.get(input_id, None) if reload_config else None
|
|
151
159
|
|
|
160
|
+
# Guard: if the existing input is a different class (type changed,
|
|
161
|
+
# e.g. event → binary_sensor), do NOT pass it as existing_input.
|
|
162
|
+
# A new object with the correct detector must be created instead.
|
|
163
|
+
if existing_input is not None and not isinstance(existing_input, expected_class):
|
|
164
|
+
_LOGGER.info(
|
|
165
|
+
"Input %s type changed from %s to %s, creating new input object",
|
|
166
|
+
input_id,
|
|
167
|
+
type(existing_input).__name__,
|
|
168
|
+
expected_class.__name__,
|
|
169
|
+
)
|
|
170
|
+
existing_input = None
|
|
171
|
+
|
|
152
172
|
input_device = configure_sensor_func(
|
|
153
173
|
gpio=gpio_copy,
|
|
154
174
|
pin=pin,
|
|
@@ -172,14 +192,22 @@ class InputManager:
|
|
|
172
192
|
# Configure event buttons
|
|
173
193
|
for gpio in self._event_pins:
|
|
174
194
|
try:
|
|
175
|
-
configure_single_input(
|
|
195
|
+
configure_single_input(
|
|
196
|
+
configure_sensor_func=self._configure_event_sensor,
|
|
197
|
+
gpio=gpio,
|
|
198
|
+
expected_class=GpioEventButton,
|
|
199
|
+
)
|
|
176
200
|
except GPIOInputException as err:
|
|
177
201
|
_LOGGER.error("Failed to configure event input: %s", err)
|
|
178
202
|
|
|
179
203
|
# Configure binary sensors
|
|
180
204
|
for gpio in self._binary_pins:
|
|
181
205
|
try:
|
|
182
|
-
configure_single_input(
|
|
206
|
+
configure_single_input(
|
|
207
|
+
configure_sensor_func=self._configure_binary_sensor,
|
|
208
|
+
gpio=gpio,
|
|
209
|
+
expected_class=GpioInputBinarySensor,
|
|
210
|
+
)
|
|
183
211
|
except GPIOInputException as err:
|
|
184
212
|
_LOGGER.error("Failed to configure binary sensor: %s", err)
|
|
185
213
|
|
|
@@ -490,21 +518,25 @@ class InputManager:
|
|
|
490
518
|
# Get config from ConfigHelper (already reloaded by Manager)
|
|
491
519
|
config = self._manager._config_helper.get_config()
|
|
492
520
|
|
|
493
|
-
# Build map of new inputs from config (input_id -> {pin, area})
|
|
521
|
+
# Build map of new inputs from config (input_id -> {pin, area, ha_type})
|
|
494
522
|
# Note: boneio_input is normalized to lowercase to match yaml_util.py behavior
|
|
495
523
|
new_input_map: dict[str, dict] = {}
|
|
496
|
-
for
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
524
|
+
for ha_type, gpio_list in [
|
|
525
|
+
(EVENT_ENTITY, config.get(EVENT_ENTITY, [])),
|
|
526
|
+
(BINARY_SENSOR, config.get(BINARY_SENSOR, [])),
|
|
527
|
+
]:
|
|
528
|
+
for gpio in gpio_list:
|
|
529
|
+
pin = gpio.get("pin")
|
|
530
|
+
# Determine input ID (same logic as in _configure_event_sensor/_configure_binary_sensor)
|
|
531
|
+
if "id" in gpio:
|
|
532
|
+
input_id = gpio["id"]
|
|
533
|
+
elif "boneio_input" in gpio:
|
|
534
|
+
input_id = gpio["boneio_input"].lower()
|
|
535
|
+
elif pin:
|
|
536
|
+
input_id = pin
|
|
537
|
+
else:
|
|
538
|
+
continue
|
|
539
|
+
new_input_map[input_id] = {"pin": pin, "area": gpio.get("area"), "ha_type": ha_type}
|
|
508
540
|
|
|
509
541
|
# Find inputs to remove (in current config but not in new config)
|
|
510
542
|
current_input_ids = set(self._inputs.keys())
|
|
@@ -512,12 +544,29 @@ class InputManager:
|
|
|
512
544
|
|
|
513
545
|
inputs_to_remove = current_input_ids - new_input_ids
|
|
514
546
|
|
|
515
|
-
_LOGGER.info(
|
|
547
|
+
_LOGGER.info("Input reload: current=%s, new=%s, to_remove=%s", current_input_ids, new_input_ids, inputs_to_remove)
|
|
548
|
+
|
|
549
|
+
# Detect inputs whose type changed (event <-> binary_sensor).
|
|
550
|
+
# These must be removed and re-created with the correct detector class.
|
|
551
|
+
inputs_type_changed: set[str] = set()
|
|
552
|
+
for input_id, new_info in new_input_map.items():
|
|
553
|
+
existing = self._inputs.get(input_id)
|
|
554
|
+
if existing is None:
|
|
555
|
+
continue
|
|
556
|
+
new_ha_type = new_info["ha_type"]
|
|
557
|
+
# GpioEventButton has input_type=INPUT, GpioInputBinarySensor has input_type=INPUT_SENSOR
|
|
558
|
+
if new_ha_type == EVENT_ENTITY and not isinstance(existing, GpioEventButton):
|
|
559
|
+
inputs_type_changed.add(input_id)
|
|
560
|
+
elif new_ha_type == BINARY_SENSOR and not isinstance(existing, GpioInputBinarySensor):
|
|
561
|
+
inputs_type_changed.add(input_id)
|
|
562
|
+
|
|
563
|
+
if inputs_type_changed:
|
|
564
|
+
_LOGGER.info("Input type changed for: %s — will recreate with new detector", inputs_type_changed)
|
|
516
565
|
|
|
517
566
|
# Remove deleted inputs from internal state (GPIO pin stays registered - minimal overhead)
|
|
518
567
|
ha_discovery_changed = False
|
|
519
568
|
|
|
520
|
-
for input_id in inputs_to_remove:
|
|
569
|
+
for input_id in inputs_to_remove | inputs_type_changed:
|
|
521
570
|
input_device = self._inputs.get(input_id)
|
|
522
571
|
if input_device:
|
|
523
572
|
old_area = getattr(input_device, "area", None)
|
|
@@ -528,7 +577,7 @@ class InputManager:
|
|
|
528
577
|
|
|
529
578
|
# Remove from internal state (GPIO detector will be replaced by new input class)
|
|
530
579
|
del self._inputs[input_id]
|
|
531
|
-
_LOGGER.info(
|
|
580
|
+
_LOGGER.info("Removed input %s (type_changed=%s)", input_id, input_id in inputs_type_changed)
|
|
532
581
|
|
|
533
582
|
# Check for area changes on remaining inputs
|
|
534
583
|
for input_id, input_device in self._inputs.items():
|
|
@@ -537,7 +586,7 @@ class InputManager:
|
|
|
537
586
|
|
|
538
587
|
if old_area != new_area:
|
|
539
588
|
ha_discovery_changed = True
|
|
540
|
-
_LOGGER.info(
|
|
589
|
+
_LOGGER.info("Input %s area changed: %s -> %s, removing old HA Discovery", input_id, old_area, new_area)
|
|
541
590
|
self._remove_input_ha_discovery(input_id, old_area)
|
|
542
591
|
|
|
543
592
|
# Wait for HA to process the removal before sending new discovery
|
|
@@ -547,6 +596,7 @@ class InputManager:
|
|
|
547
596
|
|
|
548
597
|
# _configure_inputs with reload_config=True will:
|
|
549
598
|
# - Update existing inputs (actions, area, name)
|
|
599
|
+
# - Create new inputs for type-changed entries (old objects removed above)
|
|
550
600
|
# - Add new inputs if their GPIO pin is already registered
|
|
551
601
|
self._configure_inputs(reload_config=True)
|
|
552
602
|
|
|
@@ -581,6 +581,14 @@ class IrrigationManager:
|
|
|
581
581
|
),
|
|
582
582
|
)
|
|
583
583
|
|
|
584
|
+
# Remove stale per-zone next_run sensor (migrated to valve attributes)
|
|
585
|
+
if zone.run_every_n > 1:
|
|
586
|
+
self._manager.publish_ha_discovery(
|
|
587
|
+
id=f"{ctrl.id}_zone_{zone.id}_next_run",
|
|
588
|
+
ha_type="sensor",
|
|
589
|
+
payload="",
|
|
590
|
+
)
|
|
591
|
+
|
|
584
592
|
for idx, _schedule in enumerate(ctrl._schedule):
|
|
585
593
|
_pub(
|
|
586
594
|
id=f"{ctrl.id}_schedule_{idx}_skip",
|
|
@@ -439,6 +439,10 @@ def ha_irrigation_valve_message(
|
|
|
439
439
|
msg["state_topic"] = f"{topic}/{IRRIGATION}/{ctrl_id}/{suffix}"
|
|
440
440
|
msg["command_topic"] = f"{topic}/cmd/{IRRIGATION}/{ctrl_id}/{suffix}/set"
|
|
441
441
|
msg["value_template"] = "{{ value_json.state }}"
|
|
442
|
+
msg["json_attributes_topic"] = f"{topic}/{IRRIGATION}/{ctrl_id}/{suffix}"
|
|
443
|
+
msg["json_attributes_template"] = (
|
|
444
|
+
"{{ value_json | tojson }}"
|
|
445
|
+
)
|
|
442
446
|
msg["icon"] = "mdi:sprinkler-variant"
|
|
443
447
|
return msg
|
|
444
448
|
|
{boneio-1.4.0.dev12 → boneio-1.4.0.dev14}/boneio/modbus/devices/hvac/eht-topventil-plus.json
RENAMED
|
@@ -105,8 +105,10 @@
|
|
|
105
105
|
"name": "Filter reset command",
|
|
106
106
|
"address": 24,
|
|
107
107
|
"write_address": 24,
|
|
108
|
-
"entity_type": "
|
|
109
|
-
"value_type": "S_WORD"
|
|
108
|
+
"entity_type": "writeable_binary_sensor_discrete",
|
|
109
|
+
"value_type": "S_WORD",
|
|
110
|
+
"payload_on": "1",
|
|
111
|
+
"payload_off": "0"
|
|
110
112
|
}
|
|
111
113
|
]
|
|
112
114
|
},
|
|
@@ -182,7 +184,7 @@
|
|
|
182
184
|
{
|
|
183
185
|
"name": "Operating mode",
|
|
184
186
|
"source": "operating_mode_number",
|
|
185
|
-
"entity_type": "
|
|
187
|
+
"entity_type": "text_sensor",
|
|
186
188
|
"x_mapping": {
|
|
187
189
|
"0": "Off",
|
|
188
190
|
"1": "Ventilation",
|
|
@@ -213,6 +215,72 @@
|
|
|
213
215
|
"1": "Summer"
|
|
214
216
|
}
|
|
215
217
|
},
|
|
218
|
+
{
|
|
219
|
+
"name": "Ventilation switch",
|
|
220
|
+
"source": "ventilation",
|
|
221
|
+
"entity_type": "switch",
|
|
222
|
+
"x_mapping": {
|
|
223
|
+
"0": "OFF",
|
|
224
|
+
"1": "ON"
|
|
225
|
+
},
|
|
226
|
+
"payload_off": "OFF",
|
|
227
|
+
"payload_on": "ON"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"name": "Dehumidification switch",
|
|
231
|
+
"source": "dehumidifier",
|
|
232
|
+
"entity_type": "switch",
|
|
233
|
+
"x_mapping": {
|
|
234
|
+
"0": "OFF",
|
|
235
|
+
"1": "ON"
|
|
236
|
+
},
|
|
237
|
+
"payload_off": "OFF",
|
|
238
|
+
"payload_on": "ON"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"name": "Integration switch",
|
|
242
|
+
"source": "integration",
|
|
243
|
+
"entity_type": "switch",
|
|
244
|
+
"x_mapping": {
|
|
245
|
+
"0": "OFF",
|
|
246
|
+
"1": "ON"
|
|
247
|
+
},
|
|
248
|
+
"payload_off": "OFF",
|
|
249
|
+
"payload_on": "ON"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"name": "Recirculation switch",
|
|
253
|
+
"source": "recirculation",
|
|
254
|
+
"entity_type": "switch",
|
|
255
|
+
"x_mapping": {
|
|
256
|
+
"0": "OFF",
|
|
257
|
+
"1": "ON"
|
|
258
|
+
},
|
|
259
|
+
"payload_off": "OFF",
|
|
260
|
+
"payload_on": "ON"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"name": "Fan speed control",
|
|
264
|
+
"source": "fan_speed",
|
|
265
|
+
"entity_type": "select",
|
|
266
|
+
"x_mapping": {
|
|
267
|
+
"0": "Off",
|
|
268
|
+
"1": "Low",
|
|
269
|
+
"2": "Medium",
|
|
270
|
+
"3": "High"
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"name": "Filter reset",
|
|
275
|
+
"source": "filter_reset_command",
|
|
276
|
+
"entity_type": "switch",
|
|
277
|
+
"x_mapping": {
|
|
278
|
+
"0": "OFF",
|
|
279
|
+
"1": "RESET"
|
|
280
|
+
},
|
|
281
|
+
"payload_off": "OFF",
|
|
282
|
+
"payload_on": "RESET"
|
|
283
|
+
},
|
|
216
284
|
{
|
|
217
285
|
"name": "Alarm code",
|
|
218
286
|
"source": "alarm_code_number",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Mt as l,Nt as u,at as d,f,ot as p,p as m,st as h,t as g}from"./useTranslation-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Mt as l,Nt as u,at as d,f,ot as p,p as m,st as h,t as g}from"./useTranslation-DUpbl8sU.js";var _=e(s(),1);function v(){let[e,t]=(0,_.useState)(`dark`);return(0,_.useEffect)(()=>{t(localStorage.getItem(`theme`)||`dark`);let e=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`data-theme`&&t(document.documentElement.getAttribute(`data-theme`)||`dark`)})});return e.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]}),()=>e.disconnect()},[]),e}function y(e){return l({tag:`svg`,attr:{viewBox:`0 0 24 24`},child:[{tag:`path`,attr:{d:`M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z`},child:[]},{tag:`path`,attr:{d:`M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z`},child:[]}]})(e)}var b=c();function x({isOpen:e,onClose:t}){let{t:n}=g(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await u.get(`/api/check_configuration`);o({status:e.data.status,message:e.data.message})}catch{o({status:`error`,message:n(`config_check.failed`)})}finally{i(!1)}};return e?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4`,children:[(0,b.jsx)(`h2`,{className:`text-2xl font-bold mb-6`,children:n(`config_check.title`)}),r?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-8`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg`}),(0,b.jsx)(`p`,{className:`text-lg`,children:n(`config_check.checking`)})]}):a?(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsx)(`div`,{className:`text-lg font-semibold ${a.status===`success`?`text-success`:`text-error`}`,children:a.status===`success`?n(`config_check.valid`):n(`config_check.error`)}),a.message&&(0,b.jsx)(`pre`,{className:`bg-base-300 p-4 rounded-lg whitespace-pre-wrap`,children:a.message}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4 mt-6`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{o(null),t()},children:n(`common.close`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:()=>{o(null),s()},children:n(`config_check.check_again`)})]})]}):(0,b.jsxs)(`div`,{className:`space-y-6`,children:[(0,b.jsx)(`p`,{className:`text-base-content/70`,children:n(`config_check.description`)}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:t,children:n(`common.cancel`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:s,children:n(`config_check.check_button`)})]})]})]})}):null}function S(e){return new Worker(`/assets/yaml.worker-nZQZSRZ7.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new o:new r}},i.config({monaco:n});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[g,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await u.get(`/api/files`)).data.items)}catch(e){console.error(`Error loading directory:`,e)}},A=async e=>{try{let t=`/api/files/${encodeURIComponent(e)}`,n=await u.get(t);i(e),s(n.data.content),localStorage.setItem(`lastOpenedFile`,e)}catch(e){console.error(`Error loading file:`,e)}},j=async()=>{if(r)try{await u.put(`/api/files/${encodeURIComponent(r)}`,{content:o}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await u.get(`/schema/config.schema.json`)).data;C=await a(e,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+`/schema/config.schema.json`,fileMatch:[`config.yaml`,`config.yml`],schema:t},...Object.keys(t.properties).map(e=>({uri:window.location.origin+`/schema/${e}.schema.json`,fileMatch:[`${e}.yaml`,`${e}.yml`],schema:t.properties[e]}))],validate:!0})}},N=async(e,t)=>{e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>{j()})},P=e=>{n(t=>{let n=t=>t.map(t=>t.path===e?{...t,isOpen:!t.isOpen}:t.children?{...t,children:n(t.children)}:t);return n(t)})},F=(e,t=0)=>e.map(e=>{let n=t==0||e.isOpen;return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${r===e.path?`bg-primary/10`:``}`,style:{paddingLeft:`${t*16+8}px`},onClick:()=>e.type===`file`?A(e.path):P(e.path),children:[e.type===`directory`&&(0,b.jsx)(`span`,{className:`text-xs`,children:n?(0,b.jsx)(f,{}):(0,b.jsx)(m,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(h,{}):(0,b.jsx)(p,{}):(0,b.jsx)(d,{})}),(0,b.jsx)(`span`,{className:`text-sm truncate`,children:e.name})]}),e.type===`directory`&&n&&e.children&&F(e.children,t+1)]},e.path)}),I=async()=>{try{return await u.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(l(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),l(!1),k();break}await new Promise(e=>setTimeout(e,1e3))}};return(0,_.useEffect)(()=>{(async()=>{await k();let e=localStorage.getItem(`lastOpenedFile`);e&&A(e)})()},[]),(0,b.jsxs)(`div`,{className:`flex h-full bg-base-300`,children:[c?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg text-center`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg mb-4`}),(0,b.jsxs)(`h2`,{className:`text-xl font-bold mb-4`,children:[g===`waiting`&&`Restarting Service...`,g===`checking`&&`Waiting for Service...`,g===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[g===`waiting`&&`Initiating service restart`,g===`checking`&&`Checking if service is back online`,g===`ready`&&`Redirecting...`]})]})}):null,(0,b.jsxs)(`div`,{className:`${w?`w-64`:`w-0`} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`p-2 text-sm font-semibold text-base-content/70 uppercase`,children:`Explorer`}),(0,b.jsx)(`div`,{className:`overflow-y-auto`,children:F(e)})]}),(0,b.jsxs)(`div`,{className:`flex-1 overflow-hidden flex flex-col h-full max-h-screen`,children:[(0,b.jsxs)(`div`,{className:`flex items-center p-2 border-b border-base-content/10`,children:[(0,b.jsx)(`button`,{onClick:()=>T(!w),className:`btn btn-ghost btn-sm p-1`,title:w?`Hide file tree`:`Show file tree`,children:(0,b.jsx)(y,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${w?``:`rotate-180`}`})}),r&&(0,b.jsx)(`span`,{className:`ml-2 text-sm opacity-70`,children:r})]}),(0,b.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,b.jsx)(t,{height:`100%`,width:`100%`,defaultLanguage:`yaml`,path:r||`config.yaml`,theme:O===`light`?`vs-light`:`vs-dark`,value:o,onChange:e=>s(e||``),onMount:N,beforeMount:M,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),(0,b.jsxs)(`div`,{className:`h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4`,children:[(0,b.jsx)(`button`,{onClick:j,disabled:!r,className:`btn btn-primary btn-sm`,children:`Save`}),(0,b.jsx)(`button`,{onClick:()=>D(!0),className:`btn btn-primary btn-sm`,children:`Check Config`}),(0,b.jsx)(`button`,{onClick:async()=>{await j();try{if((await u.post(`/api/restart`)).data.status===`not available`){let e=document.getElementById(`toast`);e&&(e.classList.remove(`hidden`),setTimeout(()=>{e.classList.add(`hidden`)},5e3))}else console.log(`Service restarted successfully`),L()}catch(e){console.error(`Error restarting service:`,e)}},disabled:!r,className:`btn btn-secondary btn-sm`,children:`Save and Restart`})]})]}),(0,b.jsx)(`div`,{id:`toast`,className:`toast toast-end hidden`,children:(0,b.jsx)(`div`,{className:`alert alert-warning`,children:(0,b.jsx)(`span`,{children:`Restart not possible. Application is not running as systemd service. Restart manually.`})})}),(0,b.jsx)(x,{isOpen:E,onClose:()=>D(!1)})]})}export{w as default};
|