boneio 1.4.0.dev13__tar.gz → 1.4.1__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.dev13/boneio.egg-info → boneio-1.4.1}/PKG-INFO +1 -1
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/controller.py +7 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/registration.py +44 -7
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/inputs.py +71 -21
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/base.py +7 -2
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/system.py +24 -8
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/oled.py +1 -1
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/homeassistant.py +14 -4
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/state.py +1 -0
- boneio-1.4.1/boneio/version.py +2 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/app.py +17 -0
- boneio-1.4.1/boneio/webui/frontend-dist/assets/index-2vKidlTz.js +100 -0
- boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css → boneio-1.4.1/boneio/webui/frontend-dist/assets/index-BXbDdVbb.css +1 -1
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/irrigation.py +16 -5
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/sensors.py +5 -2
- {boneio-1.4.0.dev13 → boneio-1.4.1/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/SOURCES.txt +2 -2
- boneio-1.4.0.dev13/boneio/version.py +0 -2
- boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/index-CEComJE_.js +0 -100
- {boneio-1.4.0.dev13 → boneio-1.4.1}/LICENSE +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/MANIFEST.in +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/README.md +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/bonecli.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/cover.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/group/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/group/output_group.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/detectors.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/event.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/basic.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/mcp.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/pca.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/pcf.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/remote.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/const.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/package.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/discovery.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/events/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/events/bus.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/covers.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/display.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/manager.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/remote.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/update.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/local.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/base.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/can.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/wled.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/state/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/state/manager.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/host_data.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/monitor.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/filter.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/logger.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/util.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/exceptions.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/client.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/node.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/interlock.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/lox_template.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/actions.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/runner.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/cli.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/client.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/utils.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/actions.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/events.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/files.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/logs.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/mqtt.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/runner.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/condition.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/filters.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/id.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/schema.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/action_validation.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/can.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/config.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/system.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/update.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/services/logs.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/web_server.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/pyproject.toml +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/setup.cfg +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/setup.py +0 -0
- {boneio-1.4.0.dev13 → boneio-1.4.1}/tests/test_py313_compatibility.py +0 -0
|
@@ -691,6 +691,13 @@ class IrrigationController:
|
|
|
691
691
|
self._active_zone_remaining_s = duration
|
|
692
692
|
self._state = ControllerState.RUNNING
|
|
693
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
|
+
|
|
694
701
|
if src is not None:
|
|
695
702
|
if src.pump_start_valve_delay_s > 0:
|
|
696
703
|
# Source first (pump+valve), then zone valve after delay
|
|
@@ -300,20 +300,57 @@ class CloudRegistration:
|
|
|
300
300
|
"""
|
|
301
301
|
Check if certificate needs to be refreshed.
|
|
302
302
|
|
|
303
|
+
Parses the actual X.509 Not After date from the PEM file using openssl.
|
|
304
|
+
Returns True if cert expires within 14 days or can't be parsed.
|
|
305
|
+
|
|
303
306
|
Returns:
|
|
304
|
-
True if
|
|
307
|
+
True if certificate should be refreshed
|
|
305
308
|
"""
|
|
306
309
|
if not self._cert_exists():
|
|
307
310
|
return True
|
|
308
311
|
|
|
309
312
|
try:
|
|
310
|
-
|
|
311
|
-
|
|
313
|
+
result = await asyncio.get_event_loop().run_in_executor(
|
|
314
|
+
None,
|
|
315
|
+
lambda: subprocess.run(
|
|
316
|
+
["openssl", "x509", "-enddate", "-noout", "-in", str(CERT_FILE)],
|
|
317
|
+
capture_output=True,
|
|
318
|
+
text=True,
|
|
319
|
+
timeout=5,
|
|
320
|
+
),
|
|
321
|
+
)
|
|
312
322
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
323
|
+
if result.returncode != 0:
|
|
324
|
+
_LOGGER.warning("Failed to read cert expiry: %s", result.stderr.strip())
|
|
325
|
+
return True
|
|
326
|
+
|
|
327
|
+
# Output format: "notAfter=Jun 3 12:00:00 2026 GMT"
|
|
328
|
+
line = result.stdout.strip()
|
|
329
|
+
date_str = line.split("=", 1)[1]
|
|
330
|
+
|
|
331
|
+
from datetime import datetime, timezone
|
|
332
|
+
|
|
333
|
+
expiry = datetime.strptime(date_str, "%b %d %H:%M:%S %Y %Z").replace(
|
|
334
|
+
tzinfo=timezone.utc
|
|
335
|
+
)
|
|
336
|
+
now = datetime.now(tz=timezone.utc)
|
|
337
|
+
days_left = (expiry - now).total_seconds() / 86400
|
|
338
|
+
|
|
339
|
+
_LOGGER.debug(
|
|
340
|
+
"SSL certificate expires: %s (%.1f days left)", expiry.isoformat(), days_left
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
# Refresh if expiring within 14 days
|
|
344
|
+
if days_left < 14:
|
|
345
|
+
_LOGGER.info(
|
|
346
|
+
"SSL certificate expires in %.1f days, refreshing", days_left
|
|
347
|
+
)
|
|
348
|
+
return True
|
|
349
|
+
|
|
350
|
+
return False
|
|
351
|
+
|
|
352
|
+
except Exception as e:
|
|
353
|
+
_LOGGER.warning("Error checking cert expiry, forcing refresh: %s", e)
|
|
317
354
|
return True
|
|
318
355
|
|
|
319
356
|
def update_ip(self, new_ip: str) -> None:
|
|
@@ -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
|
|
|
@@ -83,6 +83,7 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
|
|
|
83
83
|
|
|
84
84
|
# Sensor state
|
|
85
85
|
self._state: Any = None
|
|
86
|
+
self._attributes: dict[str, Any] = {}
|
|
86
87
|
self._timestamp: float | None = None
|
|
87
88
|
self._unit_of_measurement = unit_of_measurement or ""
|
|
88
89
|
|
|
@@ -135,10 +136,13 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
|
|
|
135
136
|
"""
|
|
136
137
|
self._timestamp = timestamp
|
|
137
138
|
|
|
138
|
-
# Send to MQTT
|
|
139
|
+
# Send to MQTT — include extra attributes if set by subclass
|
|
140
|
+
payload: dict[str, Any] = {STATE: self.state}
|
|
141
|
+
if self._attributes:
|
|
142
|
+
payload.update(self._attributes)
|
|
139
143
|
self._message_bus.send_message(
|
|
140
144
|
topic=self._send_topic,
|
|
141
|
-
payload=
|
|
145
|
+
payload=payload,
|
|
142
146
|
)
|
|
143
147
|
|
|
144
148
|
|
|
@@ -150,6 +154,7 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
|
|
|
150
154
|
state=self.state,
|
|
151
155
|
unit=self.unit_of_measurement,
|
|
152
156
|
timestamp=self.last_timestamp,
|
|
157
|
+
attributes=self._attributes if self._attributes else None,
|
|
153
158
|
)
|
|
154
159
|
))
|
|
155
160
|
|
|
@@ -89,14 +89,17 @@ class DiskUsageSensor(BaseSensor):
|
|
|
89
89
|
|
|
90
90
|
async def async_update(self, timestamp: float) -> None:
|
|
91
91
|
"""Fetch disk usage and publish to MQTT.
|
|
92
|
-
|
|
92
|
+
|
|
93
|
+
Publishes percentage as main state plus extra attributes
|
|
94
|
+
(disk_total_gib, disk_used_gib, disk_free_gib) for HA.
|
|
95
|
+
|
|
93
96
|
Args:
|
|
94
97
|
timestamp: Current timestamp
|
|
95
98
|
"""
|
|
96
99
|
try:
|
|
97
100
|
disk = psutil.disk_usage(self._mount_point)
|
|
98
101
|
usage_percent = round(disk.percent, 1)
|
|
99
|
-
|
|
102
|
+
|
|
100
103
|
_LOGGER.debug(
|
|
101
104
|
"Disk usage for %s: %.1f%% (used: %d bytes, total: %d bytes)",
|
|
102
105
|
self._mount_point,
|
|
@@ -104,10 +107,15 @@ class DiskUsageSensor(BaseSensor):
|
|
|
104
107
|
disk.used,
|
|
105
108
|
disk.total
|
|
106
109
|
)
|
|
107
|
-
|
|
110
|
+
|
|
108
111
|
self._state = usage_percent
|
|
112
|
+
self._attributes = {
|
|
113
|
+
"disk_total_gib": round(disk.total / (1024 ** 3), 2),
|
|
114
|
+
"disk_used_gib": round(disk.used / (1024 ** 3), 2),
|
|
115
|
+
"disk_free_gib": round(disk.free / (1024 ** 3), 2),
|
|
116
|
+
}
|
|
109
117
|
self._publish_state(timestamp=timestamp)
|
|
110
|
-
|
|
118
|
+
|
|
111
119
|
except Exception as err:
|
|
112
120
|
_LOGGER.error("Error reading disk usage: %s", err)
|
|
113
121
|
|
|
@@ -161,24 +169,32 @@ class MemoryUsageSensor(BaseSensor):
|
|
|
161
169
|
|
|
162
170
|
async def async_update(self, timestamp: float) -> None:
|
|
163
171
|
"""Fetch memory usage and publish to MQTT.
|
|
164
|
-
|
|
172
|
+
|
|
173
|
+
Publishes percentage as main state plus extra attributes
|
|
174
|
+
(memory_total_gib, memory_used_gib, memory_available_gib) for HA.
|
|
175
|
+
|
|
165
176
|
Args:
|
|
166
177
|
timestamp: Current timestamp
|
|
167
178
|
"""
|
|
168
179
|
try:
|
|
169
180
|
memory = psutil.virtual_memory()
|
|
170
181
|
usage_percent = round(memory.percent, 1)
|
|
171
|
-
|
|
182
|
+
|
|
172
183
|
_LOGGER.debug(
|
|
173
184
|
"Memory usage: %.1f%% (used: %d bytes, total: %d bytes)",
|
|
174
185
|
usage_percent,
|
|
175
186
|
memory.used,
|
|
176
187
|
memory.total
|
|
177
188
|
)
|
|
178
|
-
|
|
189
|
+
|
|
179
190
|
self._state = usage_percent
|
|
191
|
+
self._attributes = {
|
|
192
|
+
"memory_total_gib": round(memory.total / (1024 ** 3), 2),
|
|
193
|
+
"memory_used_gib": round(memory.used / (1024 ** 3), 2),
|
|
194
|
+
"memory_available_gib": round(memory.available / (1024 ** 3), 2),
|
|
195
|
+
}
|
|
180
196
|
self._publish_state(timestamp=timestamp)
|
|
181
|
-
|
|
197
|
+
|
|
182
198
|
except Exception as err:
|
|
183
199
|
_LOGGER.error("Error reading memory usage: %s", err)
|
|
184
200
|
|
|
@@ -776,7 +776,10 @@ def ha_sensor_system_availabilty_message(
|
|
|
776
776
|
**kwargs
|
|
777
777
|
):
|
|
778
778
|
"""Create availability topic for system sensors (disk, memory, CPU).
|
|
779
|
-
|
|
779
|
+
|
|
780
|
+
Includes json_attributes_topic so HA picks up extra attributes
|
|
781
|
+
(e.g. disk_total_gb, memory_used_gb) from the same state topic.
|
|
782
|
+
|
|
780
783
|
Args:
|
|
781
784
|
id: Sensor ID
|
|
782
785
|
name: Sensor name
|
|
@@ -785,7 +788,7 @@ def ha_sensor_system_availabilty_message(
|
|
|
785
788
|
device_class: HA device class (optional)
|
|
786
789
|
icon: MDI icon (optional)
|
|
787
790
|
**kwargs: Additional fields
|
|
788
|
-
|
|
791
|
+
|
|
789
792
|
Returns:
|
|
790
793
|
HA discovery message dict
|
|
791
794
|
"""
|
|
@@ -801,12 +804,19 @@ def ha_sensor_system_availabilty_message(
|
|
|
801
804
|
msg["state_class"] = "measurement"
|
|
802
805
|
msg["value_template"] = "{{ value_json.state }}"
|
|
803
806
|
msg["entity_category"] = "diagnostic"
|
|
804
|
-
|
|
807
|
+
|
|
808
|
+
# Expose extra attributes (e.g. disk_total_gb, memory_available_gb)
|
|
809
|
+
state_topic = msg.get("state_topic", f"{config_helper.topic_prefix}/{SENSOR}/{id}")
|
|
810
|
+
msg["json_attributes_topic"] = state_topic
|
|
811
|
+
msg["json_attributes_template"] = (
|
|
812
|
+
"{{ value_json | tojson }}"
|
|
813
|
+
)
|
|
814
|
+
|
|
805
815
|
if device_class:
|
|
806
816
|
msg["device_class"] = device_class
|
|
807
817
|
if icon:
|
|
808
818
|
msg["icon"] = icon
|
|
809
|
-
|
|
819
|
+
|
|
810
820
|
return msg
|
|
811
821
|
|
|
812
822
|
|
|
@@ -497,6 +497,23 @@ async def send_initial_states(
|
|
|
497
497
|
except Exception as e:
|
|
498
498
|
_LOGGER.error(f"Error preparing ADC sensor state: {type(e).__name__} - {e}")
|
|
499
499
|
|
|
500
|
+
# Send system sensor states (CPU, disk, memory)
|
|
501
|
+
for sensor in boneio_manager.sensors.get_system_sensors():
|
|
502
|
+
try:
|
|
503
|
+
sensor_state = SensorState(
|
|
504
|
+
id=sensor.id,
|
|
505
|
+
name=sensor.name,
|
|
506
|
+
state=sensor.state,
|
|
507
|
+
unit=sensor.unit_of_measurement,
|
|
508
|
+
timestamp=sensor.last_timestamp,
|
|
509
|
+
attributes=sensor._attributes if hasattr(sensor, "_attributes") and sensor._attributes else None,
|
|
510
|
+
)
|
|
511
|
+
update = SensorEvent(entity_id=sensor.id, state=sensor_state)
|
|
512
|
+
if not await send_state_update(update):
|
|
513
|
+
return False
|
|
514
|
+
except Exception as e:
|
|
515
|
+
_LOGGER.error(f"Error preparing system sensor state: {type(e).__name__} - {e}")
|
|
516
|
+
|
|
500
517
|
# Send virtual energy sensor states
|
|
501
518
|
for ve_sensor in boneio_manager.sensors.get_virtual_energy_sensors():
|
|
502
519
|
try:
|