boneio 1.3.0.dev17__tar.gz → 1.3.0.dev19__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.3.0.dev17/boneio.egg-info → boneio-1.3.0.dev19}/PKG-INFO +1 -1
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/cover/cover.py +17 -9
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/cover/time_based.py +21 -6
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/config_helper.py +11 -15
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/yaml_util.py +13 -16
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/discovery.py +86 -77
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/covers.py +139 -98
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/display.py +1 -1
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/inputs.py +176 -185
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/manager.py +381 -226
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/modbus.py +3 -3
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/outputs.py +2 -4
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/remote.py +20 -4
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/sensors.py +6 -8
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/update.py +297 -180
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/base.py +18 -5
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/mqtt.py +14 -2
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/state/manager.py +15 -8
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/display/oled.py +81 -86
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/integration/lox_template.py +1 -1
- boneio-1.3.0.dev19/boneio/migrations/__init__.py +10 -0
- boneio-1.3.0.dev19/boneio/migrations/actions.py +230 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/MANIFEST.sha256 +19 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/docker/daemon.json +7 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/docker/nodered/docker-compose.yaml +30 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/docker/nodered/nginx/default.conf +50 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/docker/nodered/node-red/settings.js +5 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/journald/journald.conf +6 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/mosquitto/boneio.conf +2 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/sudoers/boneio +15 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/systemd/boneio-oled-boot.service +17 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/systemd/boneio.service +15 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/systemd/set-hostname-once.service +12 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +10 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +257 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +18 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/usr-sbin/oled_msg.py +110 -0
- boneio-1.3.0.dev19/boneio/migrations/assets/usr-sbin/oled_msg.sh +17 -0
- boneio-1.3.0.dev19/boneio/migrations/bootstrap/boneio-migrate +389 -0
- boneio-1.3.0.dev19/boneio/migrations/bootstrap/install-helper.sh +43 -0
- boneio-1.3.0.dev19/boneio/migrations/bootstrap/sudoers-migrate +2 -0
- boneio-1.3.0.dev19/boneio/migrations/runner.py +469 -0
- boneio-1.3.0.dev19/boneio/migrations/versions/__init__.py +1 -0
- boneio-1.3.0.dev19/boneio/migrations/versions/v1_3_0_baseline.py +173 -0
- boneio-1.3.0.dev19/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +75 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/client.py +116 -2
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/coordinator.py +7 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/runner.py +3 -5
- boneio-1.3.0.dev19/boneio/version.py +2 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/app.py +4 -0
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/ConfigEditor-CIjN171I.js +1 -0
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/aiConfig-DCT969oj.js → boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/aiConfig-LL3nlemJ.js +2 -2
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/aiWizardPrompt-Dpts0jpN.js → boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/aiWizardPrompt-CmumVq54.js +1 -1
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/index-C_S5rhz7.css +2 -0
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/index-eaBQjHZY.js +44 -0
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/useTranslation-BRR2hwZk.js +13 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/index.html +4 -4
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/__init__.py +2 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/config.py +86 -58
- boneio-1.3.0.dev19/boneio/webui/routes/migrations.py +187 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/modbus.py +71 -8
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio.egg-info/SOURCES.txt +32 -6
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/pyproject.toml +9 -0
- boneio-1.3.0.dev17/boneio/version.py +0 -2
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/ConfigEditor-QHQCOrq6.js +0 -1
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/index-BvmO3gdL.css +0 -2
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/index-Dzdilk6s.js +0 -44
- boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/useTranslation-DjBDGbAU.js +0 -13
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/LICENSE +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/MANIFEST.in +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/README.md +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/bonecli.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/group/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/group/output_group.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/input/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/input/detectors.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/input/event.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/output/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/output/basic.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/output/mcp.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/output/pca.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/output/pcf.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/template/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/const.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/package.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/events/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/events/bus.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/manager/templates.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/local.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/loxone.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/can.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/remote/wled.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/sensor/base.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/sensor/system.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/state/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/system/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/system/host_data.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/system/monitor.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/filter.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/logger.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/core/utils/util.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/exceptions.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/client.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/node.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/sudoers.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/integration/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/integration/interlock.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/cli.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/modbus/utils.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/actions.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/events.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/files.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/logs.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/mqtt.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/models/state.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/actions.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/condition.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/filters.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/id.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/schema.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/action_validation.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/can.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/system.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/routes/update.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/services/logs.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/web_server.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/setup.cfg +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/setup.py +0 -0
- {boneio-1.3.0.dev17 → boneio-1.3.0.dev19}/tests/test_py313_compatibility.py +0 -0
|
@@ -187,13 +187,17 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
187
187
|
|
|
188
188
|
self._event_bus.add_sigterm_listener(self.on_exit)
|
|
189
189
|
|
|
190
|
-
|
|
191
|
-
self._loop.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
190
|
+
try:
|
|
191
|
+
self._loop.call_soon_threadsafe(
|
|
192
|
+
self._loop.call_later,
|
|
193
|
+
0.5,
|
|
194
|
+
self.send_state,
|
|
195
|
+
self.state,
|
|
196
|
+
self.json_position
|
|
197
|
+
)
|
|
198
|
+
except RuntimeError:
|
|
199
|
+
# Event loop is closed (e.g. during tests)
|
|
200
|
+
pass
|
|
197
201
|
|
|
198
202
|
async def on_exit(self) -> None:
|
|
199
203
|
"""Stop on exit."""
|
|
@@ -206,8 +210,12 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
206
210
|
self._open_relay.turn_off()
|
|
207
211
|
self._close_relay.turn_off()
|
|
208
212
|
# Send relay states to WebSocket (not MQTT - that's handled by output_type check)
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
try:
|
|
214
|
+
asyncio.create_task(self._open_relay.async_send_state())
|
|
215
|
+
asyncio.create_task(self._close_relay.async_send_state())
|
|
216
|
+
except RuntimeError:
|
|
217
|
+
# Event loop is closed (e.g. during tests or shutdown)
|
|
218
|
+
pass
|
|
211
219
|
if self._current_operation in (OPENING, CLOSING):
|
|
212
220
|
self._last_operation = self._current_operation
|
|
213
221
|
self._current_operation = IDLE
|
|
@@ -43,7 +43,7 @@ class TimeBasedCover(BaseCover):
|
|
|
43
43
|
|
|
44
44
|
def _move_cover(self, direction: str, duration: float, target_position: int | None = None):
|
|
45
45
|
"""Run in sepearate thread.
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
Args:
|
|
48
48
|
direction: Direction of movement (OPEN or CLOSE)
|
|
49
49
|
duration: Full time for 0-100% movement in milliseconds
|
|
@@ -60,7 +60,10 @@ class TimeBasedCover(BaseCover):
|
|
|
60
60
|
|
|
61
61
|
if total_steps == 0 or duration == 0:
|
|
62
62
|
self._current_operation = IDLE
|
|
63
|
-
|
|
63
|
+
try:
|
|
64
|
+
self._loop.call_soon_threadsafe(lambda: self.send_state(self.state, self.json_position))
|
|
65
|
+
except RuntimeError:
|
|
66
|
+
pass
|
|
64
67
|
return
|
|
65
68
|
|
|
66
69
|
# Calculate actual duration based on remaining distance
|
|
@@ -69,7 +72,10 @@ class TimeBasedCover(BaseCover):
|
|
|
69
72
|
|
|
70
73
|
relay.turn_on()
|
|
71
74
|
# Send relay state to WebSocket (not MQTT - that's handled by output_type check)
|
|
72
|
-
|
|
75
|
+
try:
|
|
76
|
+
self._loop.call_soon_threadsafe(lambda r=relay: asyncio.ensure_future(r.async_send_state()))
|
|
77
|
+
except RuntimeError:
|
|
78
|
+
pass
|
|
73
79
|
start_time = time.monotonic()
|
|
74
80
|
|
|
75
81
|
while not self._stop_event.is_set():
|
|
@@ -84,7 +90,10 @@ class TimeBasedCover(BaseCover):
|
|
|
84
90
|
|
|
85
91
|
self._last_timestamp = current_time # Użyj pobranego czasu
|
|
86
92
|
if current_time - self._last_update_time >= 1:
|
|
87
|
-
|
|
93
|
+
try:
|
|
94
|
+
self._loop.call_soon_threadsafe(lambda: self.send_state(self.state, self.json_position))
|
|
95
|
+
except RuntimeError:
|
|
96
|
+
break
|
|
88
97
|
self._last_update_time = current_time
|
|
89
98
|
|
|
90
99
|
if target_position is not None:
|
|
@@ -98,9 +107,15 @@ class TimeBasedCover(BaseCover):
|
|
|
98
107
|
time.sleep(0.05) # Małe opóźnienie, aby nie blokować CPU
|
|
99
108
|
relay.turn_off()
|
|
100
109
|
# Send relay state to WebSocket (not MQTT - that's handled by output_type check)
|
|
101
|
-
|
|
110
|
+
try:
|
|
111
|
+
self._loop.call_soon_threadsafe(lambda r=relay: asyncio.ensure_future(r.async_send_state()))
|
|
112
|
+
except RuntimeError:
|
|
113
|
+
pass
|
|
102
114
|
self._current_operation = IDLE
|
|
103
|
-
|
|
115
|
+
try:
|
|
116
|
+
self._loop.call_soon_threadsafe(lambda: self.send_state_and_save(self.json_position))
|
|
117
|
+
except RuntimeError:
|
|
118
|
+
pass
|
|
104
119
|
self._last_update_time = time.monotonic() # Upewnij się, że aktualizacja jest wysłana na końcu ruchu
|
|
105
120
|
|
|
106
121
|
async def run_cover(self, current_operation: str, target_position: int | None = None) -> None:
|
|
@@ -40,7 +40,7 @@ class ConfigHelper:
|
|
|
40
40
|
device_type: str = "boneIO Black",
|
|
41
41
|
ha_discovery: bool = True,
|
|
42
42
|
ha_discovery_prefix: str = HOMEASSISTANT,
|
|
43
|
-
network_info: dict =
|
|
43
|
+
network_info: dict | None = None,
|
|
44
44
|
is_web_active: bool = False,
|
|
45
45
|
web_port: int = 8090,
|
|
46
46
|
proxy_port: int | None = None,
|
|
@@ -56,7 +56,7 @@ class ConfigHelper:
|
|
|
56
56
|
self._name = name
|
|
57
57
|
|
|
58
58
|
# Generate serial number from MAC - always required for topic prefix
|
|
59
|
-
self._serial_no = get_serial_from_mac(network_info)
|
|
59
|
+
self._serial_no = get_serial_from_mac(network_info or {})
|
|
60
60
|
|
|
61
61
|
# Build fixed topic prefix: boneio/blk_{serial}
|
|
62
62
|
# This is no longer configurable - always uses this format
|
|
@@ -309,10 +309,7 @@ class ConfigHelper:
|
|
|
309
309
|
def is_topic_in_autodiscovery(self, topic: str) -> bool:
|
|
310
310
|
topic_parts_raw = topic[len(f"{self._ha_discovery_prefix}/") :].split("/")
|
|
311
311
|
ha_type = topic_parts_raw[0]
|
|
312
|
-
|
|
313
|
-
if topic in self._autodiscovery_messages[ha_type]:
|
|
314
|
-
return True
|
|
315
|
-
return False
|
|
312
|
+
return ha_type in self._autodiscovery_messages and topic in self._autodiscovery_messages[ha_type]
|
|
316
313
|
|
|
317
314
|
def clear_autodiscovery_type(self, ha_type: str):
|
|
318
315
|
self._autodiscovery_messages[ha_type] = {}
|
|
@@ -386,8 +383,14 @@ class ConfigHelper:
|
|
|
386
383
|
def reload_config(self) -> dict[str, Any]:
|
|
387
384
|
"""Reload configuration from file and update cache.
|
|
388
385
|
|
|
389
|
-
|
|
390
|
-
|
|
386
|
+
Loads config from file using load_config_from_file() which tries the
|
|
387
|
+
disk cache first (~0.5s) and falls back to full Cerberus validation
|
|
388
|
+
(~20s) on cache miss. This method does NOT wait for any background
|
|
389
|
+
cache rebuild — it's independent.
|
|
390
|
+
|
|
391
|
+
NOTE: This method may take up to ~20s on BeagleBone if disk cache
|
|
392
|
+
is not available. Callers should run it via asyncio.to_thread() to
|
|
393
|
+
avoid blocking the event loop.
|
|
391
394
|
|
|
392
395
|
Returns:
|
|
393
396
|
dict: Reloaded configuration dictionary
|
|
@@ -395,13 +398,6 @@ class ConfigHelper:
|
|
|
395
398
|
Raises:
|
|
396
399
|
ValueError: If config_file_path is not set
|
|
397
400
|
"""
|
|
398
|
-
# Wait for background cache rebuild (started after config save)
|
|
399
|
-
try:
|
|
400
|
-
from boneio.webui.routes.config import wait_for_config_cache
|
|
401
|
-
wait_for_config_cache(timeout=30.0)
|
|
402
|
-
except ImportError:
|
|
403
|
-
pass # Web module not available (e.g., during tests)
|
|
404
|
-
|
|
405
401
|
_LOGGER.info("Reloading config from file: %s", self._config_file_path)
|
|
406
402
|
return self.get_config(force_reload=True)
|
|
407
403
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import contextlib
|
|
1
2
|
import fnmatch
|
|
2
3
|
import logging
|
|
3
4
|
import os
|
|
@@ -309,7 +310,7 @@ def merge_board_config(config: dict) -> dict:
|
|
|
309
310
|
if not board_config:
|
|
310
311
|
raise ConfigurationException(f"Bottom board configuration file {board_file} is empty")
|
|
311
312
|
except FileNotFoundError:
|
|
312
|
-
raise ConfigurationException(f"Board configuration for {board_name} version {version} not found")
|
|
313
|
+
raise ConfigurationException(f"Board configuration for {board_name} version {version} not found") from None
|
|
313
314
|
_LOGGER.debug(f"Loaded board configuration: {board_name}")
|
|
314
315
|
|
|
315
316
|
# Copy MCP configuration if not already defined
|
|
@@ -427,9 +428,8 @@ class CustomValidator(Validator):
|
|
|
427
428
|
doc_value = self.document[key] # type: ignore[attr-defined]
|
|
428
429
|
if isinstance(doc_value, str):
|
|
429
430
|
doc_value = doc_value.lower()
|
|
430
|
-
if doc_value in [v.lower() if isinstance(v, str) else v for v in values]:
|
|
431
|
-
|
|
432
|
-
self._error(field, f"required when {key} is {doc_value}") # type: ignore[attr-defined]
|
|
431
|
+
if doc_value in [v.lower() if isinstance(v, str) else v for v in values] and field not in self.document: # type: ignore[attr-defined]
|
|
432
|
+
self._error(field, f"required when {key} is {doc_value}") # type: ignore[attr-defined]
|
|
433
433
|
|
|
434
434
|
def _validate_forbidden_if(self, forbidden_if, field, value):
|
|
435
435
|
"""Validate that a field is forbidden if a condition is met.
|
|
@@ -448,9 +448,12 @@ class CustomValidator(Validator):
|
|
|
448
448
|
if isinstance(doc_value, str):
|
|
449
449
|
doc_value = doc_value.lower()
|
|
450
450
|
|
|
451
|
-
if
|
|
452
|
-
|
|
453
|
-
|
|
451
|
+
if (
|
|
452
|
+
doc_value in [v.lower() if isinstance(v, str) else v for v in values]
|
|
453
|
+
and field in self.document
|
|
454
|
+
and value != default_value
|
|
455
|
+
): # type: ignore[attr-defined]
|
|
456
|
+
self._error(field, f"forbidden when {key} is {doc_value}") # type: ignore[attr-defined]
|
|
454
457
|
|
|
455
458
|
def _normalize_coerce_action_field(self, value):
|
|
456
459
|
"""Handle conditional defaults for action fields."""
|
|
@@ -809,7 +812,6 @@ def _compute_config_dir_hash(config_file: str) -> str:
|
|
|
809
812
|
hashed — other files in the directory (e.g. ``state.json``) are ignored.
|
|
810
813
|
"""
|
|
811
814
|
import hashlib
|
|
812
|
-
import re
|
|
813
815
|
from pathlib import Path
|
|
814
816
|
|
|
815
817
|
config_path = Path(config_file)
|
|
@@ -1062,7 +1064,7 @@ def load_config_from_file(
|
|
|
1062
1064
|
try:
|
|
1063
1065
|
config_yaml = load_yaml_file(config_file)
|
|
1064
1066
|
except FileNotFoundError as err:
|
|
1065
|
-
raise ConfigurationException(err)
|
|
1067
|
+
raise ConfigurationException(err) from err
|
|
1066
1068
|
_LOGGER.debug("[STARTUP TIMING] load_yaml_file: %.2fs", _time.monotonic() - _t0)
|
|
1067
1069
|
if not config_yaml:
|
|
1068
1070
|
_LOGGER.warning("Missing yaml file. %s", config_file)
|
|
@@ -1205,7 +1207,6 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
|
|
|
1205
1207
|
Returns:
|
|
1206
1208
|
dict: Status response with success/error message
|
|
1207
1209
|
"""
|
|
1208
|
-
import os
|
|
1209
1210
|
from pathlib import Path
|
|
1210
1211
|
|
|
1211
1212
|
config_dir = Path(config_file).parent
|
|
@@ -1222,10 +1223,8 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
|
|
|
1222
1223
|
if addr.startswith("0x") or addr.startswith("0X"):
|
|
1223
1224
|
entry["address"] = int(addr, 16)
|
|
1224
1225
|
else:
|
|
1225
|
-
|
|
1226
|
+
with contextlib.suppress(ValueError):
|
|
1226
1227
|
entry["address"] = int(addr, 10)
|
|
1227
|
-
except ValueError:
|
|
1228
|
-
pass # Keep as string if conversion fails
|
|
1229
1228
|
|
|
1230
1229
|
# Strip default values to keep YAML clean
|
|
1231
1230
|
cleaned_data = strip_default_values(data, {}, section)
|
|
@@ -1366,8 +1365,6 @@ def update_yaml_field(config_file: str, section: str, field: str, value: str) ->
|
|
|
1366
1365
|
Returns:
|
|
1367
1366
|
dict: Status response with success/error message.
|
|
1368
1367
|
"""
|
|
1369
|
-
import re
|
|
1370
|
-
|
|
1371
1368
|
try:
|
|
1372
1369
|
with open(config_file, encoding="utf-8") as f:
|
|
1373
1370
|
lines = f.readlines()
|
|
@@ -1382,7 +1379,7 @@ def update_yaml_field(config_file: str, section: str, field: str, value: str) ->
|
|
|
1382
1379
|
insert_index = -1
|
|
1383
1380
|
updated_lines = []
|
|
1384
1381
|
|
|
1385
|
-
for
|
|
1382
|
+
for line in lines:
|
|
1386
1383
|
stripped = line.strip()
|
|
1387
1384
|
line_indent = len(line) - len(line.lstrip())
|
|
1388
1385
|
|
|
@@ -18,10 +18,10 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
18
18
|
|
|
19
19
|
class BlackDiscoveryPublisher:
|
|
20
20
|
"""Publishes BoneIO Black device discovery information to MQTT.
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
This is NOT Home Assistant discovery - it's for autodiscovery
|
|
23
23
|
of neighboring BoneIO Black devices.
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
Discovery is split into separate topics for efficiency:
|
|
26
26
|
- discovery/device - Device info (id, name, serial, firmware)
|
|
27
27
|
- discovery/outputs - Available outputs
|
|
@@ -29,13 +29,13 @@ class BlackDiscoveryPublisher:
|
|
|
29
29
|
- discovery/inputs - Available inputs
|
|
30
30
|
- discovery/sensors - Available sensors
|
|
31
31
|
- discovery/modbus - Available modbus devices
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
All topics are published with retain=True.
|
|
34
34
|
"""
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
def __init__(self, manager: Manager, message_bus: MessageBus) -> None:
|
|
37
37
|
"""Initialize discovery publisher.
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
Args:
|
|
40
40
|
manager: Manager instance
|
|
41
41
|
message_bus: Message bus for MQTT communication
|
|
@@ -43,10 +43,10 @@ class BlackDiscoveryPublisher:
|
|
|
43
43
|
self._manager = manager
|
|
44
44
|
self._message_bus = message_bus
|
|
45
45
|
self._base_topic = f"{manager._config_helper.topic_prefix}/discovery"
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
def _publish(self, subtopic: str, payload: Any) -> None:
|
|
48
48
|
"""Publish payload to discovery subtopic with retain.
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
Args:
|
|
51
51
|
subtopic: Subtopic name (e.g., "device", "outputs")
|
|
52
52
|
payload: Payload to publish (will be JSON encoded)
|
|
@@ -55,11 +55,11 @@ class BlackDiscoveryPublisher:
|
|
|
55
55
|
payload_json = json.dumps(payload)
|
|
56
56
|
self._message_bus.send_message(topic=topic, payload=payload_json, retain=True)
|
|
57
57
|
_LOGGER.debug("Published discovery/%s: %s", subtopic, payload_json)
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
def _build_device_info(self) -> dict[str, Any]:
|
|
60
60
|
"""Build device information payload."""
|
|
61
61
|
from boneio.version import __version__
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
config_helper = self._manager._config_helper
|
|
64
64
|
device_info = {
|
|
65
65
|
"id": config_helper._serial_no or "unknown",
|
|
@@ -72,104 +72,116 @@ class BlackDiscoveryPublisher:
|
|
|
72
72
|
if config_helper._network_info:
|
|
73
73
|
device_info["ip"] = config_helper._network_info.get("ip", "")
|
|
74
74
|
return device_info
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
def _build_outputs(self) -> list[dict[str, Any]]:
|
|
77
77
|
"""Build outputs list (excludes cover outputs - those are in discovery/covers)."""
|
|
78
78
|
outputs = []
|
|
79
|
-
if hasattr(self._manager,
|
|
79
|
+
if hasattr(self._manager, "outputs") and self._manager.outputs:
|
|
80
80
|
for output_id, output in self._manager.outputs._outputs.items():
|
|
81
81
|
# Skip cover outputs - they are published in discovery/covers
|
|
82
|
-
output_type = getattr(output,
|
|
83
|
-
if output_type ==
|
|
82
|
+
output_type = getattr(output, "output_type", None)
|
|
83
|
+
if output_type == "cover":
|
|
84
84
|
continue
|
|
85
85
|
output_info = {
|
|
86
86
|
"id": output_id,
|
|
87
|
-
"name": getattr(output,
|
|
87
|
+
"name": getattr(output, "name", output_id),
|
|
88
88
|
}
|
|
89
89
|
if output_type:
|
|
90
90
|
output_info["type"] = output_type
|
|
91
91
|
outputs.append(output_info)
|
|
92
92
|
return outputs
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
def _build_covers(self) -> list[dict[str, Any]]:
|
|
95
|
-
"""Build covers list."""
|
|
95
|
+
"""Build covers list with tilt support info."""
|
|
96
96
|
covers = []
|
|
97
|
-
if hasattr(self._manager,
|
|
97
|
+
if hasattr(self._manager, "covers") and self._manager.covers:
|
|
98
98
|
for cover_id, cover in self._manager.covers._covers.items():
|
|
99
|
-
|
|
99
|
+
cover_info: dict[str, Any] = {
|
|
100
100
|
"id": cover_id,
|
|
101
|
-
"name": getattr(cover,
|
|
102
|
-
|
|
101
|
+
"name": getattr(cover, "name", cover_id),
|
|
102
|
+
"kind": getattr(cover, "kind", "time"),
|
|
103
|
+
"supports_tilt": getattr(cover, "kind", "time") == "venetian",
|
|
104
|
+
}
|
|
105
|
+
covers.append(cover_info)
|
|
103
106
|
return covers
|
|
104
|
-
|
|
107
|
+
|
|
105
108
|
def _build_inputs(self) -> list[dict[str, Any]]:
|
|
106
109
|
"""Build inputs list."""
|
|
107
110
|
inputs = []
|
|
108
|
-
if hasattr(self._manager,
|
|
111
|
+
if hasattr(self._manager, "inputs") and self._manager.inputs:
|
|
109
112
|
for input_id, input_device in self._manager.inputs._inputs.items():
|
|
110
|
-
inputs.append(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
inputs.append(
|
|
114
|
+
{
|
|
115
|
+
"id": input_id,
|
|
116
|
+
"name": getattr(input_device, "name", input_id),
|
|
117
|
+
}
|
|
118
|
+
)
|
|
114
119
|
return inputs
|
|
115
|
-
|
|
120
|
+
|
|
116
121
|
def _build_sensors(self) -> list[dict[str, Any]]:
|
|
117
122
|
"""Build sensors list."""
|
|
118
123
|
sensors = []
|
|
119
|
-
if hasattr(self._manager,
|
|
120
|
-
if hasattr(self._manager.sensors,
|
|
124
|
+
if hasattr(self._manager, "sensors") and self._manager.sensors:
|
|
125
|
+
if hasattr(self._manager.sensors, "_dallas_sensors"):
|
|
121
126
|
for sensor in self._manager.sensors._dallas_sensors:
|
|
122
|
-
sensors.append(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
sensors.append(
|
|
128
|
+
{
|
|
129
|
+
"id": sensor.id,
|
|
130
|
+
"name": sensor.name,
|
|
131
|
+
"type": "temperature",
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
if hasattr(self._manager.sensors, "_adc_sensors"):
|
|
128
135
|
for sensor in self._manager.sensors._adc_sensors:
|
|
129
|
-
sensors.append(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
136
|
+
sensors.append(
|
|
137
|
+
{
|
|
138
|
+
"id": sensor.id,
|
|
139
|
+
"name": sensor.name,
|
|
140
|
+
"type": "adc",
|
|
141
|
+
}
|
|
142
|
+
)
|
|
134
143
|
return sensors
|
|
135
|
-
|
|
144
|
+
|
|
136
145
|
def _build_modbus(self) -> list[dict[str, Any]]:
|
|
137
146
|
"""Build modbus devices list."""
|
|
138
147
|
modbus_devices = []
|
|
139
|
-
if
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
if (
|
|
149
|
+
hasattr(self._manager, "modbus")
|
|
150
|
+
and self._manager.modbus
|
|
151
|
+
and hasattr(self._manager.modbus, "_modbus_coordinators")
|
|
152
|
+
):
|
|
153
|
+
for device_id, device in self._manager.modbus._modbus_coordinators.items():
|
|
154
|
+
device_info = {
|
|
155
|
+
"id": device_id,
|
|
156
|
+
"name": getattr(device, "name", device_id),
|
|
157
|
+
}
|
|
158
|
+
if hasattr(device, "model"):
|
|
159
|
+
device_info["model"] = device.model
|
|
160
|
+
modbus_devices.append(device_info)
|
|
149
161
|
return modbus_devices
|
|
150
|
-
|
|
162
|
+
|
|
151
163
|
# Public methods for publishing individual sections
|
|
152
|
-
|
|
164
|
+
|
|
153
165
|
def publish_device(self) -> None:
|
|
154
166
|
"""Publish device info to discovery/device."""
|
|
155
167
|
self._publish("device", self._build_device_info())
|
|
156
|
-
|
|
168
|
+
|
|
157
169
|
def publish_outputs(self) -> None:
|
|
158
170
|
"""Publish outputs list to discovery/outputs."""
|
|
159
171
|
self._publish("outputs", self._build_outputs())
|
|
160
|
-
|
|
172
|
+
|
|
161
173
|
def publish_covers(self) -> None:
|
|
162
174
|
"""Publish covers list to discovery/covers."""
|
|
163
175
|
self._publish("covers", self._build_covers())
|
|
164
|
-
|
|
176
|
+
|
|
165
177
|
def publish_inputs(self) -> None:
|
|
166
178
|
"""Publish inputs list to discovery/inputs."""
|
|
167
179
|
self._publish("inputs", self._build_inputs())
|
|
168
|
-
|
|
180
|
+
|
|
169
181
|
def publish_sensors(self) -> None:
|
|
170
182
|
"""Publish sensors list to discovery/sensors."""
|
|
171
183
|
self._publish("sensors", self._build_sensors())
|
|
172
|
-
|
|
184
|
+
|
|
173
185
|
def publish_modbus(self) -> None:
|
|
174
186
|
"""Publish modbus devices list to discovery/modbus."""
|
|
175
187
|
self._publish("modbus", self._build_modbus())
|
|
@@ -177,13 +189,15 @@ class BlackDiscoveryPublisher:
|
|
|
177
189
|
def _build_irrigation(self) -> list[dict[str, Any]]:
|
|
178
190
|
"""Build irrigation controllers list."""
|
|
179
191
|
controllers = []
|
|
180
|
-
if hasattr(self._manager,
|
|
192
|
+
if hasattr(self._manager, "irrigation") and self._manager.irrigation:
|
|
181
193
|
for ctrl_id, ctrl in self._manager.irrigation._controllers.items():
|
|
182
|
-
controllers.append(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
194
|
+
controllers.append(
|
|
195
|
+
{
|
|
196
|
+
"id": ctrl_id,
|
|
197
|
+
"name": ctrl.name,
|
|
198
|
+
"zones": [{"id": z.id, "name": z.name} for z in ctrl.zones],
|
|
199
|
+
}
|
|
200
|
+
)
|
|
187
201
|
return controllers
|
|
188
202
|
|
|
189
203
|
def publish_irrigation(self) -> None:
|
|
@@ -192,7 +206,7 @@ class BlackDiscoveryPublisher:
|
|
|
192
206
|
|
|
193
207
|
async def publish_discovery(self) -> None:
|
|
194
208
|
"""Publish all discovery sections.
|
|
195
|
-
|
|
209
|
+
|
|
196
210
|
Publishes to:
|
|
197
211
|
- boneio/{device_id}/discovery/device
|
|
198
212
|
- boneio/{device_id}/discovery/outputs
|
|
@@ -201,24 +215,20 @@ class BlackDiscoveryPublisher:
|
|
|
201
215
|
- boneio/{device_id}/discovery/sensors
|
|
202
216
|
- boneio/{device_id}/discovery/modbus
|
|
203
217
|
- boneio/{device_id}/discovery/irrigation
|
|
204
|
-
|
|
218
|
+
|
|
205
219
|
All with retain=True.
|
|
206
|
-
|
|
220
|
+
|
|
207
221
|
Does nothing if send_boneio_autodiscovery is disabled in config.
|
|
208
222
|
"""
|
|
209
223
|
# Check if autodiscovery publishing is enabled
|
|
210
224
|
if not self._manager._config_helper.send_boneio_autodiscovery:
|
|
211
225
|
_LOGGER.debug("BoneIO autodiscovery publishing is disabled")
|
|
212
226
|
return
|
|
213
|
-
|
|
227
|
+
|
|
214
228
|
try:
|
|
215
229
|
device_info = self._build_device_info()
|
|
216
|
-
_LOGGER.info(
|
|
217
|
-
|
|
218
|
-
device_info["id"],
|
|
219
|
-
self._base_topic
|
|
220
|
-
)
|
|
221
|
-
|
|
230
|
+
_LOGGER.info("Publishing discovery for device '%s' to '%s/*'", device_info["id"], self._base_topic)
|
|
231
|
+
|
|
222
232
|
self.publish_device()
|
|
223
233
|
self.publish_outputs()
|
|
224
234
|
self.publish_covers()
|
|
@@ -226,9 +236,8 @@ class BlackDiscoveryPublisher:
|
|
|
226
236
|
self.publish_sensors()
|
|
227
237
|
self.publish_modbus()
|
|
228
238
|
self.publish_irrigation()
|
|
229
|
-
|
|
239
|
+
|
|
230
240
|
_LOGGER.info("Discovery published successfully")
|
|
231
|
-
|
|
241
|
+
|
|
232
242
|
except Exception as e:
|
|
233
243
|
_LOGGER.error("Failed to publish discovery: %s", e, exc_info=True)
|
|
234
|
-
|