boneio 1.5.0.dev32__tar.gz → 1.5.0.dev34__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.5.0.dev32/boneio.egg-info → boneio-1.5.0.dev34}/PKG-INFO +1 -1
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_24_16.yaml +2 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_32_10.yaml +2 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/const.py +1 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/display.py +2 -2
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/outputs.py +5 -3
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/sensors.py +95 -1
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/mcp23017.py +74 -13
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/__init__.py +4 -1
- boneio-1.5.0.dev34/boneio/hardware/i2c/ina226.py +260 -0
- boneio-1.5.0.dev34/boneio/hardware/i2c/ina226_driver.py +309 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/runner.py +2 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/schema.yaml +44 -0
- boneio-1.5.0.dev34/boneio/version.py +2 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/app.py +17 -0
- {boneio-1.5.0.dev32/boneio/webui → boneio-1.5.0.dev34/boneio/webui/frontend-dist}/schema/config.schema.json +124 -0
- boneio-1.5.0.dev34/boneio/webui/frontend-dist/schema/ina226.schema.json +109 -0
- {boneio-1.5.0.dev32/boneio/webui → boneio-1.5.0.dev34/boneio/webui/frontend-dist}/schema/mcp23017.schema.json +21 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/sensors.py +10 -0
- {boneio-1.5.0.dev32/boneio/webui/frontend-dist → boneio-1.5.0.dev34/boneio/webui}/schema/config.schema.json +124 -0
- boneio-1.5.0.dev34/boneio/webui/schema/ina226.schema.json +109 -0
- {boneio-1.5.0.dev32/boneio/webui/frontend-dist → boneio-1.5.0.dev34/boneio/webui}/schema/mcp23017.schema.json +21 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/SOURCES.txt +4 -0
- boneio-1.5.0.dev32/boneio/version.py +0 -2
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/LICENSE +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/MANIFEST.in +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/README.md +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/bonecli.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/cover.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/group/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/group/output_group.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/detectors.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/event.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/basic.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/mcp.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/pca.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/pcf.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/remote.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/package.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/discovery.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/events/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/events/bus.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/covers.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/manager.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/remote.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/update.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/local.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/can.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/wled.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/system.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/state/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/state/manager.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/host_data.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/monitor.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/filter.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/logger.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/util.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/exceptions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/client.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/node.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/interlock.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/lox_template.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/actions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/runner.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/cli.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/client.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/utils.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/actions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/events.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/files.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/logs.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/mqtt.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/state.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/condition.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/filters.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/id.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/action_validation.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/BindingMatrix-LxACKGJk.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ConfigEditor-Db9Hv4K7.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EditItemDialog-BBgUejNu.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EntityCard-V_dIvm7h.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EntityGrid-CSg0J6S3.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/FormInputToggle-jYwQBCms.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/InputsView--0TitNzt.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/LogViewer-0bOsZFY4.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ModbusView-B65zWo-u.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/NodeRedView-4hx1AtCh.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/OutputsView-feRbZLV7.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SensorView-BI9r6Khx.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SudoPasswordDialog-CdKObBJL.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SystemState-Xwy9Q9yE.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/TemplatesView-BZPOKY7l.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/Tools--HWg7Etd.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/UISettings-DrOjn7rw.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/fa-C9nnJsGR.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/gi-DFg4IokC.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/index-Co9Pvhx4.css +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/index-DIN8b655.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/useTranslation-Dy6J9cmj.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/index.html +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/sw.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/can.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_core.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/nodered.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/system.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/update.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/services/logs.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/web_server.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/pyproject.toml +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/setup.cfg +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/setup.py +0 -0
- {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/tests/test_py313_compatibility.py +0 -0
|
@@ -153,8 +153,8 @@ class DisplayManager:
|
|
|
153
153
|
else None
|
|
154
154
|
),
|
|
155
155
|
ina219=(
|
|
156
|
-
self._manager.sensors.get_ina219_sensors()[0]
|
|
157
|
-
if self._manager.sensors.get_ina219_sensors()
|
|
156
|
+
(self._manager.sensors.get_ina219_sensors() or self._manager.sensors.get_ina226_sensors())[0]
|
|
157
|
+
if (self._manager.sensors.get_ina219_sensors() or self._manager.sensors.get_ina226_sensors())
|
|
158
158
|
else None
|
|
159
159
|
),
|
|
160
160
|
extra_sensors=extra_sensors,
|
|
@@ -185,9 +185,11 @@ class OutputManager:
|
|
|
185
185
|
id = expander[ID] or expander[ADDRESS]
|
|
186
186
|
address = expander[ADDRESS]
|
|
187
187
|
try:
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
kwargs = {"i2c": self._manager._i2cbusio, "address": address, "reset": False}
|
|
189
|
+
if exp_type == MCP:
|
|
190
|
+
kwargs["inverted"] = expander.get("inverted", None)
|
|
191
|
+
kwargs["state_manager"] = getattr(self._manager, "_state_manager", None)
|
|
192
|
+
expander_dict[id] = _EXPANDER_CLASS[exp_type](**kwargs)
|
|
191
193
|
sleep_time = expander.get(INIT_SLEEP, TimePeriod(seconds=0))
|
|
192
194
|
if sleep_time.total_seconds > 0:
|
|
193
195
|
_LOGGER.debug(
|
|
@@ -19,6 +19,7 @@ from boneio.const import (
|
|
|
19
19
|
FILTERS,
|
|
20
20
|
ID,
|
|
21
21
|
INA219,
|
|
22
|
+
INA226,
|
|
22
23
|
LM75,
|
|
23
24
|
MCP_TEMP_9808,
|
|
24
25
|
ON,
|
|
@@ -79,6 +80,7 @@ class SensorManager:
|
|
|
79
80
|
self._manager = manager
|
|
80
81
|
self._temp_sensors: list[PCT2075 | MCP9808 | DallasSensor] = []
|
|
81
82
|
self._ina219_sensors = []
|
|
83
|
+
self._ina226_sensors = []
|
|
82
84
|
self._adc_sensors = []
|
|
83
85
|
self._dallas_sensors: list[DallasSensor] = []
|
|
84
86
|
self._system_sensors = []
|
|
@@ -88,15 +90,17 @@ class SensorManager:
|
|
|
88
90
|
# Configure all sensor types
|
|
89
91
|
self._configure_temp_sensors(sensors=sensors)
|
|
90
92
|
self._configure_ina219_sensors(sensors=sensors)
|
|
93
|
+
self._configure_ina226_sensors(sensors=sensors)
|
|
91
94
|
self._configure_dallas_sensors(dallas=dallas, sensors=sensors.get(ONEWIRE))
|
|
92
95
|
self._configure_adc(adc_list=adc)
|
|
93
96
|
self._configure_system_sensors()
|
|
94
97
|
# Note: virtual_energy_sensors are configured after outputs are ready
|
|
95
98
|
|
|
96
99
|
_LOGGER.info(
|
|
97
|
-
"SensorManager initialized with %d temp sensors, %d INA219, %d ADC, %d Dallas, %d system",
|
|
100
|
+
"SensorManager initialized with %d temp sensors, %d INA219, %d INA226, %d ADC, %d Dallas, %d system",
|
|
98
101
|
len(self._temp_sensors),
|
|
99
102
|
len(self._ina219_sensors),
|
|
103
|
+
len(self._ina226_sensors),
|
|
100
104
|
len(self._adc_sensors),
|
|
101
105
|
len(self._dallas_sensors),
|
|
102
106
|
len(self._system_sensors),
|
|
@@ -251,6 +255,76 @@ class SensorManager:
|
|
|
251
255
|
)
|
|
252
256
|
return None
|
|
253
257
|
|
|
258
|
+
# -------------------------------------------------------------------------
|
|
259
|
+
# INA226 Power Sensors (boneIO v1.0)
|
|
260
|
+
# -------------------------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
def _configure_ina226_sensors(self, sensors: dict) -> None:
|
|
263
|
+
"""Configure INA226 power monitoring sensors.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
sensors: Dictionary of sensor configurations
|
|
267
|
+
"""
|
|
268
|
+
if not sensors.get(INA226):
|
|
269
|
+
return
|
|
270
|
+
|
|
271
|
+
for sensor_config in sensors[INA226]:
|
|
272
|
+
ina226 = self._create_ina226_sensor(config=sensor_config)
|
|
273
|
+
if ina226:
|
|
274
|
+
self._ina226_sensors.append(ina226)
|
|
275
|
+
|
|
276
|
+
def _create_ina226_sensor(self, config: dict):
|
|
277
|
+
"""Create INA226 sensor instance.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
config: Sensor configuration dictionary
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
INA226 sensor instance or None on error
|
|
284
|
+
"""
|
|
285
|
+
from boneio.hardware.i2c import INA226
|
|
286
|
+
|
|
287
|
+
address = config[ADDRESS]
|
|
288
|
+
id = config.get(ID, str(address)).replace(" ", "")
|
|
289
|
+
|
|
290
|
+
try:
|
|
291
|
+
ina226 = INA226(
|
|
292
|
+
id=id,
|
|
293
|
+
address=address,
|
|
294
|
+
sensors=config.get("sensors", []),
|
|
295
|
+
r_shunt=config.get("r_shunt", 0.05),
|
|
296
|
+
max_current=config.get("max_current", 1.5),
|
|
297
|
+
manager=self._manager,
|
|
298
|
+
message_bus=self._manager._message_bus,
|
|
299
|
+
topic_prefix=self._manager._topic_prefix,
|
|
300
|
+
update_interval=config.get(UPDATE_INTERVAL, TimePeriod(seconds=60)),
|
|
301
|
+
)
|
|
302
|
+
# Send HA autodiscovery for each sub-sensor
|
|
303
|
+
for sensor in ina226.sensors.values():
|
|
304
|
+
payload = ha_sensor_ina_availabilty_message(
|
|
305
|
+
id=sensor.id,
|
|
306
|
+
name=sensor.name,
|
|
307
|
+
config_helper=self._manager._config_helper,
|
|
308
|
+
unit_of_measurement=sensor.unit_of_measurement,
|
|
309
|
+
device_class=sensor.device_class,
|
|
310
|
+
)
|
|
311
|
+
self._manager.publish_ha_discovery(id=sensor.id, ha_type=SENSOR, payload=payload)
|
|
312
|
+
return ina226
|
|
313
|
+
except I2CError as err:
|
|
314
|
+
_LOGGER.error("Can't configure INA226 sensor: %s", err)
|
|
315
|
+
self._manager._hardware_errors.append(
|
|
316
|
+
{
|
|
317
|
+
"type": "sensor",
|
|
318
|
+
"sensor_type": "ina226",
|
|
319
|
+
"id": id,
|
|
320
|
+
"name": id,
|
|
321
|
+
"address": address,
|
|
322
|
+
"error": str(err),
|
|
323
|
+
"message": f"INA226 sensor at address 0x{address:02X}: {err}",
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
return None
|
|
327
|
+
|
|
254
328
|
# -------------------------------------------------------------------------
|
|
255
329
|
# Dallas 1-Wire Sensors
|
|
256
330
|
# -------------------------------------------------------------------------
|
|
@@ -808,6 +882,14 @@ class SensorManager:
|
|
|
808
882
|
"""
|
|
809
883
|
return self._ina219_sensors
|
|
810
884
|
|
|
885
|
+
def get_ina226_sensors(self) -> list:
|
|
886
|
+
"""Get all INA226 sensors.
|
|
887
|
+
|
|
888
|
+
Returns:
|
|
889
|
+
List of INA226 sensors
|
|
890
|
+
"""
|
|
891
|
+
return self._ina226_sensors
|
|
892
|
+
|
|
811
893
|
def get_adc_sensors(self) -> list:
|
|
812
894
|
"""Get all ADC sensors.
|
|
813
895
|
|
|
@@ -1361,6 +1443,18 @@ class SensorManager:
|
|
|
1361
1443
|
)
|
|
1362
1444
|
self._manager.publish_ha_discovery(id=sub.id, ha_type=SENSOR, payload=payload)
|
|
1363
1445
|
|
|
1446
|
+
# INA226 power sensors
|
|
1447
|
+
for ina in self._ina226_sensors:
|
|
1448
|
+
for sub in ina.sensors.values():
|
|
1449
|
+
payload = ha_sensor_ina_availabilty_message(
|
|
1450
|
+
id=sub.id,
|
|
1451
|
+
name=sub.name,
|
|
1452
|
+
config_helper=self._manager._config_helper,
|
|
1453
|
+
unit_of_measurement=sub.unit_of_measurement,
|
|
1454
|
+
device_class=sub.device_class,
|
|
1455
|
+
)
|
|
1456
|
+
self._manager.publish_ha_discovery(id=sub.id, ha_type=SENSOR, payload=payload)
|
|
1457
|
+
|
|
1364
1458
|
# Dallas 1-Wire sensors
|
|
1365
1459
|
for sensor in self._dallas_sensors:
|
|
1366
1460
|
payload = ha_sensor_temp_availabilty_message(
|
|
@@ -49,13 +49,22 @@ class MCP23017:
|
|
|
49
49
|
pin0.switch_to_output(value=True)
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
|
-
def __init__(
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
i2c: SMBus2I2C,
|
|
55
|
+
address: int = 0x20,
|
|
56
|
+
reset: bool = False,
|
|
57
|
+
inverted: bool | None = None,
|
|
58
|
+
state_manager: Any = None,
|
|
59
|
+
):
|
|
53
60
|
"""Initialize MCP23017.
|
|
54
61
|
|
|
55
62
|
Args:
|
|
56
63
|
i2c: I2C bus instance (SMBus2I2C)
|
|
57
64
|
address: I2C address of the device (default 0x20)
|
|
58
65
|
reset: Reset flag (unused, for API compatibility with Adafruit library)
|
|
66
|
+
inverted: Active-LOW relay board flag (True=active-LOW, False=active-HIGH, None=auto-detect)
|
|
67
|
+
state_manager: Optional StateManager instance to persist/read auto-detected logic
|
|
59
68
|
|
|
60
69
|
Raises:
|
|
61
70
|
ValueError: If address is not in valid range (0x20-0x27)
|
|
@@ -67,6 +76,7 @@ class MCP23017:
|
|
|
67
76
|
|
|
68
77
|
self._i2c = i2c
|
|
69
78
|
self._address = address
|
|
79
|
+
self._state_manager = state_manager
|
|
70
80
|
|
|
71
81
|
# Lock for thread-safe pin operations
|
|
72
82
|
# This prevents race conditions when multiple outputs are switched simultaneously
|
|
@@ -89,13 +99,55 @@ class MCP23017:
|
|
|
89
99
|
# Write to both registers for robustness in case of dirty startup
|
|
90
100
|
self._write_register_unlocked(0x0A, 0x20) # SEQOP=1 (disabled), BANK=0
|
|
91
101
|
self._write_register_unlocked(0x0B, 0x20) # Mirror register
|
|
102
|
+
|
|
103
|
+
# Read IODIR to check if this is cold boot (all inputs = 0xFF)
|
|
104
|
+
iodir_a = self._read_register_unlocked(IODIRA)
|
|
105
|
+
iodir_b = self._read_register_unlocked(IODIRB)
|
|
106
|
+
is_cold_boot = (iodir_a == 0xFF and iodir_b == 0xFF)
|
|
107
|
+
|
|
108
|
+
# Determine inverted state:
|
|
109
|
+
# 1. Config override
|
|
110
|
+
# 2. State manager persisted value
|
|
111
|
+
# 3. Auto-detection on cold boot (GPIO read)
|
|
112
|
+
# 4. Fallback (False)
|
|
113
|
+
state_key = f"mcp_0x{address:02x}_inverted"
|
|
114
|
+
if inverted is not None:
|
|
115
|
+
self._inverted = bool(inverted)
|
|
116
|
+
_LOGGER.info("MCP23017@0x%02X inverted set from config: %s", address, self._inverted)
|
|
117
|
+
elif state_manager and state_manager.get("hardware", state_key) is not None:
|
|
118
|
+
self._inverted = bool(state_manager.get("hardware", state_key))
|
|
119
|
+
_LOGGER.info("MCP23017@0x%02X inverted loaded from state: %s", address, self._inverted)
|
|
120
|
+
elif is_cold_boot:
|
|
121
|
+
gpio_a = self._read_register_unlocked(GPIOA)
|
|
122
|
+
gpio_b = self._read_register_unlocked(GPIOB)
|
|
123
|
+
self._inverted = (gpio_a == 0xFF and gpio_b == 0xFF)
|
|
124
|
+
_LOGGER.info(
|
|
125
|
+
"MCP23017@0x%02X auto-detected relay board logic: %s (GPIOA=0x%02X, GPIOB=0x%02X)",
|
|
126
|
+
address,
|
|
127
|
+
"active-LOW (inverted)" if self._inverted else "active-HIGH",
|
|
128
|
+
gpio_a,
|
|
129
|
+
gpio_b,
|
|
130
|
+
)
|
|
131
|
+
if state_manager:
|
|
132
|
+
state_manager.save_attribute("hardware", state_key, self._inverted)
|
|
133
|
+
else:
|
|
134
|
+
self._inverted = False
|
|
135
|
+
_LOGGER.info("MCP23017@0x%02X inverted fallback: False", address)
|
|
92
136
|
|
|
93
137
|
# Read current output latch states from hardware to preserve relay states
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
138
|
+
if is_cold_boot and self._inverted:
|
|
139
|
+
# Cold boot with active-LOW relays: set all pins to HIGH (0xFF) before setting IODIR=0x00
|
|
140
|
+
# so relays stay OFF during initial output configuration
|
|
141
|
+
self._port_a_state = 0xFF
|
|
142
|
+
self._port_b_state = 0xFF
|
|
143
|
+
self._write_register_unlocked(OLATA, 0xFF)
|
|
144
|
+
self._write_register_unlocked(OLATB, 0xFF)
|
|
145
|
+
else:
|
|
146
|
+
self._port_a_state = self._read_register_unlocked(OLATA)
|
|
147
|
+
self._port_b_state = self._read_register_unlocked(OLATB)
|
|
148
|
+
|
|
97
149
|
_LOGGER.debug(
|
|
98
|
-
f"MCP23017@0x{address:02X} preserved states: "
|
|
150
|
+
f"MCP23017@0x{address:02X} preserved states (inverted={self._inverted}): "
|
|
99
151
|
f"A=0b{self._port_a_state:08b}, B=0b{self._port_b_state:08b}"
|
|
100
152
|
)
|
|
101
153
|
|
|
@@ -104,7 +156,7 @@ class MCP23017:
|
|
|
104
156
|
self._write_register_unlocked(IODIRA, 0x00)
|
|
105
157
|
self._write_register_unlocked(IODIRB, 0x00)
|
|
106
158
|
|
|
107
|
-
_LOGGER.info(f"Initialized MCP23017 at address 0x{address:02X}")
|
|
159
|
+
_LOGGER.info(f"Initialized MCP23017 at address 0x{address:02X} (inverted={self._inverted})")
|
|
108
160
|
finally:
|
|
109
161
|
self._i2c.unlock()
|
|
110
162
|
|
|
@@ -191,6 +243,11 @@ class MCP23017:
|
|
|
191
243
|
iodir &= ~(1 << pin_bit) # Clear bit = output
|
|
192
244
|
self._write_register_unlocked(IODIRB, iodir)
|
|
193
245
|
|
|
246
|
+
@property
|
|
247
|
+
def inverted(self) -> bool:
|
|
248
|
+
"""Check whether expander operates in inverted (active-LOW) mode."""
|
|
249
|
+
return self._inverted
|
|
250
|
+
|
|
194
251
|
def _write_pin(self, pin_number: int, value: bool) -> None:
|
|
195
252
|
"""Write value to a pin using ATOMIC hardware Read-Modify-Write.
|
|
196
253
|
|
|
@@ -199,7 +256,7 @@ class MCP23017:
|
|
|
199
256
|
|
|
200
257
|
Args:
|
|
201
258
|
pin_number: Pin number (0-15)
|
|
202
|
-
value: Output state (True=HIGH, False=LOW)
|
|
259
|
+
value: Output state (True=ON/HIGH logical, False=OFF/LOW logical)
|
|
203
260
|
"""
|
|
204
261
|
with self._lock:
|
|
205
262
|
# Rate limiting: ensure minimum delay between I2C operations
|
|
@@ -223,8 +280,11 @@ class MCP23017:
|
|
|
223
280
|
# Read current state from hardware
|
|
224
281
|
current_state = self._read_register_unlocked(reg)
|
|
225
282
|
|
|
283
|
+
# Account for active-LOW inverted logic
|
|
284
|
+
effective_value = not value if self._inverted else value
|
|
285
|
+
|
|
226
286
|
# Calculate new state
|
|
227
|
-
if
|
|
287
|
+
if effective_value:
|
|
228
288
|
new_state = current_state | (1 << bit)
|
|
229
289
|
else:
|
|
230
290
|
new_state = current_state & ~(1 << bit)
|
|
@@ -232,7 +292,7 @@ class MCP23017:
|
|
|
232
292
|
# Only write if state changed
|
|
233
293
|
if new_state != current_state:
|
|
234
294
|
_LOGGER.debug(
|
|
235
|
-
f"MCP23017@0x{self._address:02X} pin {pin_number} -> {value}: "
|
|
295
|
+
f"MCP23017@0x{self._address:02X} pin {pin_number} -> {value} (phys={effective_value}): "
|
|
236
296
|
f"{'OLATA' if pin_number < 8 else 'OLATB'} "
|
|
237
297
|
f"0b{current_state:08b} -> 0b{new_state:08b}"
|
|
238
298
|
)
|
|
@@ -277,23 +337,24 @@ class MCP23017:
|
|
|
277
337
|
self._write_pin(pin_number, value)
|
|
278
338
|
|
|
279
339
|
def get_pin_value(self, pin_number: int) -> bool:
|
|
280
|
-
"""Get current pin value.
|
|
340
|
+
"""Get current logical pin value.
|
|
281
341
|
|
|
282
342
|
Args:
|
|
283
343
|
pin_number: Pin number (0-15)
|
|
284
344
|
|
|
285
345
|
Returns:
|
|
286
|
-
Current pin state
|
|
346
|
+
Current logical pin state (accounting for active-LOW inverted logic)
|
|
287
347
|
"""
|
|
288
348
|
if not 0 <= pin_number <= 15:
|
|
289
349
|
raise ValueError(f"Pin number must be 0-15, got {pin_number}")
|
|
290
350
|
|
|
291
351
|
with self._lock:
|
|
292
352
|
if pin_number < 8:
|
|
293
|
-
|
|
353
|
+
raw_state = bool(self._port_a_state & (1 << pin_number))
|
|
294
354
|
else:
|
|
295
355
|
pin_bit = pin_number - 8
|
|
296
|
-
|
|
356
|
+
raw_state = bool(self._port_b_state & (1 << pin_bit))
|
|
357
|
+
return not raw_state if self._inverted else raw_state
|
|
297
358
|
|
|
298
359
|
def verify_port_state(self) -> tuple[int, int]:
|
|
299
360
|
"""Read actual port states from hardware and compare with cached state.
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
This module provides I2C bus support and I2C-based sensors:
|
|
4
4
|
- SMBus2I2C wrapper for I2C communication
|
|
5
5
|
- Temperature sensors (PCT2075/LM75, MCP9808)
|
|
6
|
-
- Power monitoring (INA219)
|
|
6
|
+
- Power monitoring (INA219 for v0.8, INA226 for v1.0)
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from boneio.hardware.i2c.bus import SMBus2I2C
|
|
10
10
|
from boneio.hardware.i2c.ina219 import INA219, INA219Sensor
|
|
11
|
+
from boneio.hardware.i2c.ina226 import INA226, INA226Sensor
|
|
11
12
|
from boneio.hardware.i2c.mcp9808 import MCP9808
|
|
12
13
|
from boneio.hardware.i2c.pct2075 import PCT2075
|
|
13
14
|
|
|
@@ -20,4 +21,6 @@ __all__ = [
|
|
|
20
21
|
# Power monitoring
|
|
21
22
|
"INA219",
|
|
22
23
|
"INA219Sensor",
|
|
24
|
+
"INA226",
|
|
25
|
+
"INA226Sensor",
|
|
23
26
|
]
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""INA226 power monitoring sensor driver.
|
|
2
|
+
|
|
3
|
+
This module provides support for INA226 current/voltage/power monitoring sensor.
|
|
4
|
+
The INA226 is a high-side/low-side current shunt and power monitor with I2C
|
|
5
|
+
interface, used on boneIO Black v1.0 boards (replacing INA219 from v0.8).
|
|
6
|
+
|
|
7
|
+
Key improvements over INA219:
|
|
8
|
+
- Bus voltage range: 0–36V (vs 0–26V)
|
|
9
|
+
- Bus voltage resolution: 1.25 mV (vs 4 mV)
|
|
10
|
+
- Internal power register (no need for V×I computation)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import logging
|
|
17
|
+
import time
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
from boneio.const import SENSOR, STATE
|
|
21
|
+
from boneio.core.messaging import BasicMqtt
|
|
22
|
+
from boneio.core.utils import AsyncUpdater, Filter
|
|
23
|
+
from boneio.exceptions import I2CError
|
|
24
|
+
from boneio.hardware.i2c.ina226_driver import INA226_I2C
|
|
25
|
+
from boneio.models import SensorState
|
|
26
|
+
from boneio.models.events import SensorEvent
|
|
27
|
+
|
|
28
|
+
_LOGGER = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
# Unit conversion for different measurement types
|
|
31
|
+
UNIT_CONVERTER = {"current": "A", "power": "W", "voltage": "V"}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class INA226Sensor(BasicMqtt, Filter):
|
|
35
|
+
"""Single measurement from INA226 sensor.
|
|
36
|
+
|
|
37
|
+
This class represents one measurement type (current, voltage, or power)
|
|
38
|
+
from an INA226 sensor. Multiple INA226Sensor instances are typically
|
|
39
|
+
managed by a single INA226 coordinator.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
device_class: Type of measurement ('current', 'voltage', or 'power')
|
|
43
|
+
filters: List of filter expressions to apply
|
|
44
|
+
state: Initial state value
|
|
45
|
+
**kwargs: Additional arguments (name, id, message_bus, etc.)
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self, device_class: str, filters: list, state: float | None, **kwargs
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Initialize INA226 sensor."""
|
|
52
|
+
super().__init__(topic_type=SENSOR, **kwargs)
|
|
53
|
+
self._unit_of_measurement = UNIT_CONVERTER[device_class]
|
|
54
|
+
self._device_class = device_class
|
|
55
|
+
self._filters = filters
|
|
56
|
+
self._raw_state = state
|
|
57
|
+
self._timestamp = time.time()
|
|
58
|
+
self._state = (
|
|
59
|
+
self._apply_filters(value=self._raw_state) if self._raw_state else None
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def raw_state(self) -> float | None:
|
|
64
|
+
"""Get raw unfiltered state value.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Raw measurement value or None
|
|
68
|
+
"""
|
|
69
|
+
return self._raw_state
|
|
70
|
+
|
|
71
|
+
@raw_state.setter
|
|
72
|
+
def raw_state(self, value: float) -> None:
|
|
73
|
+
"""Set raw state value.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
value: New raw measurement value
|
|
77
|
+
"""
|
|
78
|
+
self._raw_state = value
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def state(self) -> float | None:
|
|
82
|
+
"""Get filtered state value.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Filtered measurement value or None
|
|
86
|
+
"""
|
|
87
|
+
return self._state
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def device_class(self) -> str:
|
|
91
|
+
"""Get device class (measurement type).
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Device class string ('current', 'voltage', or 'power')
|
|
95
|
+
"""
|
|
96
|
+
return self._device_class
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def unit_of_measurement(self) -> str:
|
|
100
|
+
"""Get unit of measurement.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Unit string ('A', 'V', or 'W')
|
|
104
|
+
"""
|
|
105
|
+
return self._unit_of_measurement
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def last_timestamp(self) -> float:
|
|
109
|
+
"""Get timestamp of last update.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Unix timestamp
|
|
113
|
+
"""
|
|
114
|
+
return self._timestamp
|
|
115
|
+
|
|
116
|
+
def update(self, timestamp: float) -> None:
|
|
117
|
+
"""Update sensor state and publish to MQTT.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
timestamp: Current timestamp
|
|
121
|
+
"""
|
|
122
|
+
_state = self._apply_filters(value=self._raw_state) if self._raw_state else None
|
|
123
|
+
if not _state:
|
|
124
|
+
return
|
|
125
|
+
self._state = _state
|
|
126
|
+
self._timestamp = timestamp
|
|
127
|
+
self._message_bus.send_message(
|
|
128
|
+
topic=self._send_topic,
|
|
129
|
+
payload={STATE: self.state},
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class INA226(AsyncUpdater):
|
|
134
|
+
"""INA226 power monitoring sensor coordinator.
|
|
135
|
+
|
|
136
|
+
This class manages an INA226 sensor and its multiple measurement types
|
|
137
|
+
(current, voltage, power). It periodically reads values from the sensor
|
|
138
|
+
and updates individual INA226Sensor instances.
|
|
139
|
+
|
|
140
|
+
Features:
|
|
141
|
+
- High-side/low-side current sensing
|
|
142
|
+
- 0–36V bus voltage measurement (1.25 mV resolution)
|
|
143
|
+
- Internal power calculation (more accurate than V×I)
|
|
144
|
+
- I2C interface (address: 0x40–0x4F)
|
|
145
|
+
- 16-bit ADC with configurable averaging
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
address: I2C address of the sensor (default: 0x40)
|
|
149
|
+
id: Sensor identifier
|
|
150
|
+
sensors: List of sensor configurations (device_class, id, filters)
|
|
151
|
+
r_shunt: Shunt resistor value in Ohms (default: 0.05 for boneIO v1.0)
|
|
152
|
+
max_current: Maximum expected current in A (default: 1.5)
|
|
153
|
+
**kwargs: Additional arguments (manager, update_interval, etc.)
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
def __init__(
|
|
157
|
+
self,
|
|
158
|
+
address: int,
|
|
159
|
+
id: str,
|
|
160
|
+
sensors: list[dict] | None = None,
|
|
161
|
+
r_shunt: float = 0.05,
|
|
162
|
+
max_current: float = 1.5,
|
|
163
|
+
**kwargs,
|
|
164
|
+
) -> None:
|
|
165
|
+
"""Initialize INA226 sensor coordinator.
|
|
166
|
+
|
|
167
|
+
Raises:
|
|
168
|
+
I2CError: If sensor is not found or communication fails
|
|
169
|
+
"""
|
|
170
|
+
if sensors is None:
|
|
171
|
+
sensors = []
|
|
172
|
+
self._loop = asyncio.get_event_loop()
|
|
173
|
+
self._sensors: dict[str, INA226Sensor] = {}
|
|
174
|
+
self._id = id
|
|
175
|
+
|
|
176
|
+
# Initialize hardware sensor with error handling
|
|
177
|
+
try:
|
|
178
|
+
self._ina = INA226_I2C(
|
|
179
|
+
address=address,
|
|
180
|
+
r_shunt=r_shunt,
|
|
181
|
+
max_current=max_current,
|
|
182
|
+
)
|
|
183
|
+
except OSError as err:
|
|
184
|
+
raise I2CError(
|
|
185
|
+
f"Failed to initialize INA226 at address 0x{address:02X}: {err}"
|
|
186
|
+
) from err
|
|
187
|
+
|
|
188
|
+
# Create individual sensor instances for each measurement type
|
|
189
|
+
for sensor in sensors:
|
|
190
|
+
_name = sensor["id"]
|
|
191
|
+
_id = f"{id}{_name.replace(' ', '')}"
|
|
192
|
+
self._sensors[sensor["device_class"]] = INA226Sensor(
|
|
193
|
+
device_class=sensor["device_class"],
|
|
194
|
+
filters=sensor.get("filters", []),
|
|
195
|
+
state=None,
|
|
196
|
+
name=_name,
|
|
197
|
+
id=_id,
|
|
198
|
+
**kwargs,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
AsyncUpdater.__init__(self, **kwargs)
|
|
202
|
+
_LOGGER.info(
|
|
203
|
+
"Configured INA226 on address 0x%02X with %d sensors "
|
|
204
|
+
"(R_SHUNT=%.3fΩ, I_max=%.1fA)",
|
|
205
|
+
address, len(self._sensors), r_shunt, max_current,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
@property
|
|
209
|
+
def id(self) -> str:
|
|
210
|
+
"""Get sensor coordinator ID.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
Coordinator identifier string
|
|
214
|
+
"""
|
|
215
|
+
return self._id
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def sensors(self) -> dict[str, INA226Sensor]:
|
|
219
|
+
"""Get dictionary of managed sensors.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dictionary mapping device_class to INA226Sensor instances
|
|
223
|
+
"""
|
|
224
|
+
return self._sensors
|
|
225
|
+
|
|
226
|
+
async def async_update(self, timestamp: datetime) -> None:
|
|
227
|
+
"""Read sensor values and update all managed sensors.
|
|
228
|
+
|
|
229
|
+
This method is called periodically by AsyncUpdater. It reads
|
|
230
|
+
current, voltage, and power from the INA226 and updates the
|
|
231
|
+
corresponding sensor instances.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
timestamp: Current timestamp
|
|
235
|
+
"""
|
|
236
|
+
for k, sensor in self._sensors.items():
|
|
237
|
+
try:
|
|
238
|
+
value = getattr(self._ina, k)
|
|
239
|
+
_LOGGER.debug(
|
|
240
|
+
"Fetched INA226 value: %s = %s %s",
|
|
241
|
+
k, value, sensor.unit_of_measurement,
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
if sensor.raw_state != value:
|
|
245
|
+
sensor.raw_state = value
|
|
246
|
+
sensor.update(timestamp=timestamp)
|
|
247
|
+
|
|
248
|
+
# Trigger event on EventBus
|
|
249
|
+
self.manager.event_bus.trigger_event(SensorEvent(
|
|
250
|
+
entity_id=sensor.id,
|
|
251
|
+
state=SensorState(
|
|
252
|
+
id=sensor.id,
|
|
253
|
+
name=sensor.name,
|
|
254
|
+
state=sensor.state,
|
|
255
|
+
unit=sensor.unit_of_measurement,
|
|
256
|
+
timestamp=sensor.last_timestamp,
|
|
257
|
+
),
|
|
258
|
+
))
|
|
259
|
+
except Exception as err:
|
|
260
|
+
_LOGGER.error("Error reading INA226 %s: %s", k, err)
|