boneio 1.6.0.dev2__tar.gz → 1.6.0.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.6.0.dev2/boneio.egg-info → boneio-1.6.0.dev3}/PKG-INFO +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/yaml_util.py +173 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/action_conditions.py +206 -9
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/manager.py +53 -3
- boneio-1.6.0.dev3/boneio/core/manager/scheduler.py +410 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/sensors.py +96 -0
- boneio-1.6.0.dev3/boneio/core/manager/sun.py +388 -0
- boneio-1.6.0.dev3/boneio/core/sensor/sun.py +301 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/system_ops.py +50 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/conditions.py +55 -4
- boneio-1.6.0.dev3/boneio/core/utils/sun.py +440 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/interface.py +50 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/integration/homeassistant.py +93 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/actions.py +27 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/MANIFEST.sha256 +3 -6
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/helpers/boneio-migrate-v2 +80 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/helpers/boneio-system +320 -10
- boneio-1.6.0.dev3/boneio/migrations/assets/sudoers/boneio +16 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.3.0.json +1 -1
- boneio-1.6.0.dev3/boneio/migrations/plans/1.3.0.sig +0 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.4.0.json +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.4.0.sig +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.10.json +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.10.sig +2 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.11.json +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.11.sig +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.5.json +1 -1
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.5.sig +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.8.json +1 -1
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.8.sig +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.9.json +1 -0
- boneio-1.6.0.dev3/boneio/migrations/plans/1.6.9.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev3/boneio/migrations/plans/manifest.sig +1 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/runner.py +26 -4
- boneio-1.6.0.dev3/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +55 -0
- boneio-1.6.0.dev3/boneio/migrations/versions/v1_6_11_drop_docker_group.py +41 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_5_trust_transition.py +2 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +8 -6
- boneio-1.6.0.dev3/boneio/migrations/versions/v1_6_9_ntp_servers.py +64 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/runner.py +2 -0
- boneio-1.6.0.dev3/boneio/schema/condition.yaml +164 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/schema.yaml +228 -0
- boneio-1.6.0.dev3/boneio/version.py +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/action_validation.py +74 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/app.py +21 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/AccountsView-iveRbldx.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/ActionFields-DdCxR8lP.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AppInitContext-D9IKihqu.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/AppInitContext-CsffdB9c.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/BackupSection-C1qj4qOG.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/BindingMatrix-Bj6KE0yY.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/DeviceControlSection-CPmqccka.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/DiagnosticsView-Bi1hrIcs.js +5 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/EditItemDialog-BH1onHq0.js +66 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/EntityCard-yD9_Hl71.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/EntityGrid-BDdmT0qN.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/FactoryResetSection-E3xtkFLr.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FormInputToggle-B_NTf6g-.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/FormInputToggle-Spiz-w7l.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/HaDashboardWizard-f8fMg8FC.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/HostnameSection-DrpKbp6I.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/InputsView-W99g8hSl.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/LocationSection-ZILUsfeR.js +2 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/LoggerForm-Chw9zm0N.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LongPressWrapper-K2sCXsb5.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/LongPressWrapper-BKkWvoC1.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/MigrationsSection-DSbw5UVz.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/ModbusView-CdP0fXYx.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BYwPAyFi.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/NodeRedManagement-DRMiFlH2.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedView-D8E1Itvk.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/NodeRedView-Ct08K8xu.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/OutputsView-C9sDLF1P.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/ScheduleSection-C2qLKNWR.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/SecurityView-DBkwBU2t.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/SensorView-DNtKJE4b.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/Sparkline-Cq-w3bbO.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/Sparkline-D-2-v-7o.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/SystemState-DbY5T6BB.js +2 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/TemplatesView-6kNzVE3p.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/TilePicker-jd3hKaoZ.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/TimezoneSection-BEuXBmWp.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/UISettings-DIcCTtXU.js +33 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/ViewToggle-B8OpHNHc.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/aiConfig-_hPXvgdY.js +2 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiWizardPrompt-BRgdilYB.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/aiWizardPrompt-Dc7dZBzw.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/coverUtils-Cf4Uxn2U.js +1 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/createLucideIcon-BEjh8B3y.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/fa-1N_Z7Z57.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/fa-BEzM11bH.js +1 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/gi-iTtpUjJp.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/gi-tOlGxC0X.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/index-1pLHiRke.js +20 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-DfcdKR51.css → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/index-lVrZSgFS.css +1 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/monaco-drkeoggn.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/monaco-C9XC2D1j.js +3 -3
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/select-D3PIwbEj.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/tabs-box-DQ3qtHub.js → boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/tabs-box-Byn-MOyS.js +1 -1
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/assets/utils-B6KiDbIe.js +1 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/index.html +6 -4
- {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev3/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +212 -4
- {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev3/boneio/webui/frontend-dist}/schema/config.schema.json +2026 -29
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/event.schema.json +742 -14
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/schema/location.schema.json +48 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/schema/schedule.schema.json +1003 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/web.schema.json +22 -0
- boneio-1.6.0.dev3/boneio/webui/frontend-dist/sw.js +1 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/__init__.py +4 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config_core.py +5 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/onboarding.py +18 -0
- boneio-1.6.0.dev3/boneio/webui/routes/schedule.py +75 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/sensors.py +16 -1
- boneio-1.6.0.dev3/boneio/webui/routes/sun.py +151 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/system.py +157 -19
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/update.py +26 -38
- {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev3/boneio/webui}/schema/binary_sensor.schema.json +212 -4
- {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev3/boneio/webui}/schema/config.schema.json +2026 -29
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/event.schema.json +742 -14
- boneio-1.6.0.dev3/boneio/webui/schema/location.schema.json +48 -0
- boneio-1.6.0.dev3/boneio/webui/schema/schedule.schema.json +1003 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/web.schema.json +22 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/security_headers.py +31 -3
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio.egg-info/SOURCES.txt +65 -38
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/pyproject.toml +3 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/sudoers/boneio +0 -15
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.0.sig +0 -1
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.json +0 -1
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.5.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.8.sig +0 -1
- boneio-1.6.0.dev2/boneio/migrations/plans/manifest.sig +0 -1
- boneio-1.6.0.dev2/boneio/schema/condition.yaml +0 -76
- boneio-1.6.0.dev2/boneio/version.py +0 -2
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AccountsView-p4dfo1BI.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BackupSection-CwWiIyYm.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BindingMatrix-C5N7pHyw.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DeviceControlSection-CiAn0q3F.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DiagnosticsView-CPTuMjVr.js +0 -5
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EditItemDialog-D_97HEFm.js +0 -66
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityCard-Bb1AOk78.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityGrid-CljXU2ZD.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FactoryResetSection-BAzLfqax.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HaDashboardWizard-ie0HCjfc.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HostnameSection-DFipLyZg.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/InputsView-Dv2ynbYD.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LoggerForm-UKzOi5ri.js +0 -5
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MigrationsSection-DMp9cBmP.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/ModbusView-Cw5Mgatj.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DhFBnZZZ.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedManagement-C9si33mc.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/OutputsView-BID1iUa3.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SecurityView-CMCqfNQs.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SensorView-DMMhavyC.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SystemState-BcmUoX6A.js +0 -2
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TemplatesView-0sksWoxA.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TimezoneSection-DkaFIcW_.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/UISettings-Don7-C6Q.js +0 -33
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiConfig-BAR1rHKB.js +0 -2
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-C8RrYuNy.js +0 -16
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/select-Xn9nmZSE.js +0 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/sw.js +0 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/LICENSE +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/README.md +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/const.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/models.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/auth/store.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/secret_masking.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/containers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/security_alert.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/net/discovery_guard.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/security/posture.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/axios-uEi8e3Ln.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/chunk-QTnfLwEv.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/configCache-CLN4xEny.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/monaco-DUFfd7ef.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/monaco-Dpn-hvLa.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/assets/yaml.worker-8qQfrID5.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/middleware/csrf.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/middleware/policy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/rate_limit.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/accounts.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/nodered.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/security.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/setup.cfg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/setup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev3}/tests/test_py313_compatibility.py +0 -0
|
@@ -773,6 +773,179 @@ class CustomValidator(Validator):
|
|
|
773
773
|
kwarg = unit_to_kwarg[one_of(*unit_to_kwarg)(unit_str)]
|
|
774
774
|
return TimePeriod(**{kwarg: float(match.group(1))})
|
|
775
775
|
|
|
776
|
+
def _normalize_coerce_sun_offset(self, value) -> float:
|
|
777
|
+
"""Parse a signed offset from a sun anchor into seconds.
|
|
778
|
+
|
|
779
|
+
Unlike ``positive_time_period`` this must accept negative values —
|
|
780
|
+
"half an hour before sunset" is the whole point — and it returns plain
|
|
781
|
+
seconds rather than a TimePeriod, because the only thing that ever
|
|
782
|
+
happens to it is being added to a datetime.
|
|
783
|
+
|
|
784
|
+
A bare number means **seconds**, not milliseconds. That differs from
|
|
785
|
+
``positive_time_period`` deliberately: a sun offset measured in
|
|
786
|
+
milliseconds would be meaningless, and the frontend always sends a unit.
|
|
787
|
+
|
|
788
|
+
Args:
|
|
789
|
+
value: ``"-30min"``, ``"1h"``, ``"45s"``, or a number of seconds.
|
|
790
|
+
|
|
791
|
+
Returns:
|
|
792
|
+
The offset in seconds, negative for "before".
|
|
793
|
+
|
|
794
|
+
Raises:
|
|
795
|
+
ConfigurationException: If the value cannot be read as an offset.
|
|
796
|
+
"""
|
|
797
|
+
if value is None or value == "":
|
|
798
|
+
return 0.0
|
|
799
|
+
if isinstance(value, bool):
|
|
800
|
+
raise ConfigurationException(f"Expected a sun offset, got {value!r}")
|
|
801
|
+
if isinstance(value, (int, float)):
|
|
802
|
+
return float(value)
|
|
803
|
+
|
|
804
|
+
text = str(value).strip().lower()
|
|
805
|
+
if not text:
|
|
806
|
+
return 0.0
|
|
807
|
+
|
|
808
|
+
match = re.match(r"^([-+]?[0-9]*\.?[0-9]+)\s*(\w*)$", text)
|
|
809
|
+
if match is None:
|
|
810
|
+
raise ConfigurationException(
|
|
811
|
+
f"Expected an offset like '-30min', '15m' or '1h', got {value!r}"
|
|
812
|
+
)
|
|
813
|
+
|
|
814
|
+
unit_to_seconds = {
|
|
815
|
+
"": 1.0,
|
|
816
|
+
"s": 1.0,
|
|
817
|
+
"sec": 1.0,
|
|
818
|
+
"secs": 1.0,
|
|
819
|
+
"second": 1.0,
|
|
820
|
+
"seconds": 1.0,
|
|
821
|
+
"m": 60.0,
|
|
822
|
+
"min": 60.0,
|
|
823
|
+
"mins": 60.0,
|
|
824
|
+
"minute": 60.0,
|
|
825
|
+
"minutes": 60.0,
|
|
826
|
+
"h": 3600.0,
|
|
827
|
+
"hour": 3600.0,
|
|
828
|
+
"hours": 3600.0,
|
|
829
|
+
}
|
|
830
|
+
unit = match.group(2)
|
|
831
|
+
if unit not in unit_to_seconds:
|
|
832
|
+
raise ConfigurationException(
|
|
833
|
+
f"Unknown unit {unit!r} in sun offset {value!r}. Use s, min or h."
|
|
834
|
+
)
|
|
835
|
+
return float(match.group(1)) * unit_to_seconds[unit]
|
|
836
|
+
|
|
837
|
+
def _check_with_schedule_shape(self, field, value):
|
|
838
|
+
"""Reject a schedule whose trigger does not match its own type.
|
|
839
|
+
|
|
840
|
+
Cerberus can require a dict and check each field on its own, but not
|
|
841
|
+
"a sun trigger needs an event and a time trigger needs a time". Left to
|
|
842
|
+
runtime the symptom is a schedule that quietly never fires, which is
|
|
843
|
+
the hardest kind of misconfiguration to notice.
|
|
844
|
+
"""
|
|
845
|
+
if not isinstance(value, dict):
|
|
846
|
+
return
|
|
847
|
+
|
|
848
|
+
trigger = value.get("trigger") or {}
|
|
849
|
+
kind = trigger.get("type", "sun")
|
|
850
|
+
|
|
851
|
+
if kind == "sun":
|
|
852
|
+
from boneio.core.utils.sun import ANCHOR_NAMES
|
|
853
|
+
|
|
854
|
+
event = trigger.get("event")
|
|
855
|
+
if not event:
|
|
856
|
+
self._error( # type: ignore[attr-defined]
|
|
857
|
+
field, "A sun trigger needs an 'event', e.g. sunset or civil_dusk."
|
|
858
|
+
)
|
|
859
|
+
elif event not in ANCHOR_NAMES:
|
|
860
|
+
self._error( # type: ignore[attr-defined]
|
|
861
|
+
field,
|
|
862
|
+
f"Unknown sun event {event!r}. "
|
|
863
|
+
f"Expected one of: {', '.join(sorted(ANCHOR_NAMES))}.",
|
|
864
|
+
)
|
|
865
|
+
if trigger.get("at"):
|
|
866
|
+
self._error( # type: ignore[attr-defined]
|
|
867
|
+
field, "'at' belongs to a time trigger, not a sun trigger."
|
|
868
|
+
)
|
|
869
|
+
elif kind == "time":
|
|
870
|
+
if not trigger.get("at"):
|
|
871
|
+
self._error( # type: ignore[attr-defined]
|
|
872
|
+
field, "A time trigger needs 'at' in HH:MM."
|
|
873
|
+
)
|
|
874
|
+
if trigger.get("event"):
|
|
875
|
+
self._error( # type: ignore[attr-defined]
|
|
876
|
+
field, "'event' belongs to a sun trigger, not a time trigger."
|
|
877
|
+
)
|
|
878
|
+
|
|
879
|
+
if not value.get("actions"):
|
|
880
|
+
self._error( # type: ignore[attr-defined]
|
|
881
|
+
field, "A schedule with no actions would fire and do nothing."
|
|
882
|
+
)
|
|
883
|
+
|
|
884
|
+
def _check_with_condition_shape(self, field, value):
|
|
885
|
+
"""Reject a condition whose fields do not match its own type.
|
|
886
|
+
|
|
887
|
+
Cerberus can say "this is a dict of allowed keys" but not "a sun
|
|
888
|
+
condition is one of three shapes and never a mixture". Without this a
|
|
889
|
+
typo like ``type: sun`` with ``after: "05:00"`` reaches runtime, where
|
|
890
|
+
the only symptom is an action that silently never fires.
|
|
891
|
+
"""
|
|
892
|
+
if not isinstance(value, dict):
|
|
893
|
+
return
|
|
894
|
+
if value.get("type") != "sun":
|
|
895
|
+
return
|
|
896
|
+
|
|
897
|
+
from boneio.core.utils.sun import ANCHOR_NAMES, PHASE_NAMES
|
|
898
|
+
|
|
899
|
+
window = [key for key in ("after", "before") if value.get(key)]
|
|
900
|
+
phase = value.get("phase")
|
|
901
|
+
elevation = [key for key in ("above", "below") if value.get(key) is not None]
|
|
902
|
+
|
|
903
|
+
modes = [bool(window), bool(phase), bool(elevation)]
|
|
904
|
+
if sum(modes) == 0:
|
|
905
|
+
self._error( # type: ignore[attr-defined]
|
|
906
|
+
field,
|
|
907
|
+
"A sun condition needs one of: after/before (anchors), "
|
|
908
|
+
"phase, or above/below (elevation in degrees).",
|
|
909
|
+
)
|
|
910
|
+
return
|
|
911
|
+
if sum(modes) > 1:
|
|
912
|
+
self._error( # type: ignore[attr-defined]
|
|
913
|
+
field,
|
|
914
|
+
"A sun condition must use only one of after/before, phase, or "
|
|
915
|
+
"above/below — not a mixture.",
|
|
916
|
+
)
|
|
917
|
+
return
|
|
918
|
+
|
|
919
|
+
for key in ("after", "before"):
|
|
920
|
+
anchor = value.get(key)
|
|
921
|
+
if anchor and anchor not in ANCHOR_NAMES:
|
|
922
|
+
self._error( # type: ignore[attr-defined]
|
|
923
|
+
field,
|
|
924
|
+
f"Unknown sun anchor {anchor!r} in '{key}'. "
|
|
925
|
+
f"Expected one of: {', '.join(sorted(ANCHOR_NAMES))}.",
|
|
926
|
+
)
|
|
927
|
+
|
|
928
|
+
for key, other in (("after_offset", "after"), ("before_offset", "before")):
|
|
929
|
+
if value.get(key) and not value.get(other):
|
|
930
|
+
self._error( # type: ignore[attr-defined]
|
|
931
|
+
field, f"'{key}' has no effect without '{other}'."
|
|
932
|
+
)
|
|
933
|
+
|
|
934
|
+
if phase and phase not in PHASE_NAMES:
|
|
935
|
+
self._error( # type: ignore[attr-defined]
|
|
936
|
+
field,
|
|
937
|
+
f"Unknown sun phase {phase!r}. "
|
|
938
|
+
f"Expected one of: {', '.join(sorted(PHASE_NAMES))}.",
|
|
939
|
+
)
|
|
940
|
+
|
|
941
|
+
above, below = value.get("above"), value.get("below")
|
|
942
|
+
if above is not None and below is not None and above >= below:
|
|
943
|
+
self._error( # type: ignore[attr-defined]
|
|
944
|
+
field,
|
|
945
|
+
f"'above' ({above}) must be lower than 'below' ({below}); "
|
|
946
|
+
"the pair describes a band of elevations.",
|
|
947
|
+
)
|
|
948
|
+
|
|
776
949
|
def _lookup_field(self, path: str) -> tuple:
|
|
777
950
|
"""
|
|
778
951
|
Implement relative paths with dot (.) notation, following Python
|
|
@@ -8,6 +8,8 @@ Optimisations over the generic conditions.py:
|
|
|
8
8
|
- datetime.now() is called ONCE per execute_actions() batch
|
|
9
9
|
- time/date strings are parsed once (at config load) rather than each press
|
|
10
10
|
- state_resolver results can be cached within an evaluation cycle
|
|
11
|
+
- sun conditions hold the provider, which caches a day of anchors, so a
|
|
12
|
+
button press reads two datetimes instead of computing ephemerides
|
|
11
13
|
- dedicated logger `boneio.action_conditions` for easy filtering
|
|
12
14
|
|
|
13
15
|
Usage:
|
|
@@ -21,9 +23,14 @@ from __future__ import annotations
|
|
|
21
23
|
|
|
22
24
|
import logging
|
|
23
25
|
from collections.abc import Callable
|
|
24
|
-
from datetime import datetime
|
|
26
|
+
from datetime import datetime, timedelta
|
|
25
27
|
from datetime import time as dt_time
|
|
26
|
-
from typing import Any
|
|
28
|
+
from typing import TYPE_CHECKING, Any
|
|
29
|
+
|
|
30
|
+
from boneio.core.utils import sun as sun_utils
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from boneio.core.manager.sun import SunProvider
|
|
27
34
|
|
|
28
35
|
_LOGGER = logging.getLogger("boneio.action_conditions")
|
|
29
36
|
|
|
@@ -90,6 +97,170 @@ class _DateCondition:
|
|
|
90
97
|
return True
|
|
91
98
|
|
|
92
99
|
|
|
100
|
+
class _SunCondition:
|
|
101
|
+
"""Pre-parsed sun condition: a window between anchors, a phase, or an angle.
|
|
102
|
+
|
|
103
|
+
Nothing is computed here at compile time. Anchor *times* change every day,
|
|
104
|
+
so the only thing worth pre-resolving is which anchors were asked for; the
|
|
105
|
+
provider hands back a cached day at evaluation time.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
__slots__ = (
|
|
109
|
+
"mode",
|
|
110
|
+
"after",
|
|
111
|
+
"after_offset",
|
|
112
|
+
"before",
|
|
113
|
+
"before_offset",
|
|
114
|
+
"phase",
|
|
115
|
+
"above",
|
|
116
|
+
"below",
|
|
117
|
+
"_provider",
|
|
118
|
+
"_warned",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def __init__(
|
|
122
|
+
self,
|
|
123
|
+
provider: SunProvider | None,
|
|
124
|
+
*,
|
|
125
|
+
after: str | None = None,
|
|
126
|
+
after_offset: float = 0.0,
|
|
127
|
+
before: str | None = None,
|
|
128
|
+
before_offset: float = 0.0,
|
|
129
|
+
phase: str | None = None,
|
|
130
|
+
above: float | None = None,
|
|
131
|
+
below: float | None = None,
|
|
132
|
+
) -> None:
|
|
133
|
+
self._provider = provider
|
|
134
|
+
self._warned = False
|
|
135
|
+
self.after = after
|
|
136
|
+
self.after_offset = after_offset
|
|
137
|
+
self.before = before
|
|
138
|
+
self.before_offset = before_offset
|
|
139
|
+
self.phase = phase
|
|
140
|
+
self.above = above
|
|
141
|
+
self.below = below
|
|
142
|
+
if phase:
|
|
143
|
+
self.mode = "phase"
|
|
144
|
+
elif above is not None or below is not None:
|
|
145
|
+
self.mode = "elevation"
|
|
146
|
+
else:
|
|
147
|
+
self.mode = "window"
|
|
148
|
+
|
|
149
|
+
# -- anchor resolution ------------------------------------------------
|
|
150
|
+
|
|
151
|
+
def _resolve(
|
|
152
|
+
self,
|
|
153
|
+
name: str,
|
|
154
|
+
offset: float,
|
|
155
|
+
now: datetime,
|
|
156
|
+
anchors: dict[str, datetime | None],
|
|
157
|
+
day_start: datetime,
|
|
158
|
+
day_end: datetime,
|
|
159
|
+
) -> datetime:
|
|
160
|
+
"""Turn an anchor name into an instant, polar days included.
|
|
161
|
+
|
|
162
|
+
A missing anchor is not "unknown" — it means the Sun stayed on one side
|
|
163
|
+
of that angle all day, and which side decides whether the bound should
|
|
164
|
+
collapse to the start or the end of the day. Getting this backwards is
|
|
165
|
+
how a window meant to mean "while it is dark" ends up covering a polar
|
|
166
|
+
summer.
|
|
167
|
+
"""
|
|
168
|
+
moment = anchors.get(name)
|
|
169
|
+
if moment is not None:
|
|
170
|
+
return moment + timedelta(seconds=offset)
|
|
171
|
+
|
|
172
|
+
threshold, rising = sun_utils.ANCHORS.get(name, (None, True))
|
|
173
|
+
if threshold is None or self._provider is None:
|
|
174
|
+
return day_end
|
|
175
|
+
|
|
176
|
+
# `now`, not the wall clock: the day being asked about is the one the
|
|
177
|
+
# anchors came from, which is not necessarily today.
|
|
178
|
+
state = self._provider.threshold_state(threshold, now)
|
|
179
|
+
if state == "always_above":
|
|
180
|
+
# The Sun is permanently past this angle: a crossing upward is
|
|
181
|
+
# behind us, a crossing downward is still ahead.
|
|
182
|
+
return day_start if rising else day_end
|
|
183
|
+
if state == "always_below":
|
|
184
|
+
return day_end if rising else day_start
|
|
185
|
+
return day_end
|
|
186
|
+
|
|
187
|
+
# -- evaluation -------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
def evaluate(self, now: datetime) -> bool:
|
|
190
|
+
"""Check *now* against this condition.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
True when the condition holds. Also True when the Sun's position
|
|
194
|
+
cannot be known — no ``location:``, or a clock that has not been
|
|
195
|
+
set — which matches how every other condition treats a
|
|
196
|
+
configuration error: it does not block the action. The web UI
|
|
197
|
+
refuses to save a sun condition without a location, so this path
|
|
198
|
+
means something changed underneath a running device.
|
|
199
|
+
"""
|
|
200
|
+
provider = self._provider
|
|
201
|
+
if provider is None or not provider.ready(now):
|
|
202
|
+
if not self._warned:
|
|
203
|
+
self._warned = True
|
|
204
|
+
_LOGGER.error(
|
|
205
|
+
"Sun condition cannot be evaluated (no location, or the "
|
|
206
|
+
"clock is not set yet) — allowing the action."
|
|
207
|
+
)
|
|
208
|
+
return True
|
|
209
|
+
|
|
210
|
+
if self.mode == "phase":
|
|
211
|
+
return bool(provider.in_phase(self.phase, now))
|
|
212
|
+
|
|
213
|
+
if self.mode == "elevation":
|
|
214
|
+
elevation = provider.elevation(now)
|
|
215
|
+
if elevation is None:
|
|
216
|
+
return True
|
|
217
|
+
if self.above is not None and elevation <= self.above:
|
|
218
|
+
return False
|
|
219
|
+
return not (self.below is not None and elevation >= self.below)
|
|
220
|
+
|
|
221
|
+
anchors = provider.anchors(now)
|
|
222
|
+
if not anchors:
|
|
223
|
+
return True
|
|
224
|
+
|
|
225
|
+
local = now.astimezone(provider.timezone)
|
|
226
|
+
day_start = local.replace(hour=0, minute=0, second=0, microsecond=0)
|
|
227
|
+
day_end = day_start + timedelta(days=1)
|
|
228
|
+
|
|
229
|
+
start = (
|
|
230
|
+
self._resolve(
|
|
231
|
+
self.after, self.after_offset, now, anchors, day_start, day_end
|
|
232
|
+
)
|
|
233
|
+
if self.after
|
|
234
|
+
else None
|
|
235
|
+
)
|
|
236
|
+
end = (
|
|
237
|
+
self._resolve(
|
|
238
|
+
self.before, self.before_offset, now, anchors, day_start, day_end
|
|
239
|
+
)
|
|
240
|
+
if self.before
|
|
241
|
+
else None
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
if start is not None and end is not None:
|
|
245
|
+
if start <= end:
|
|
246
|
+
return start <= now < end
|
|
247
|
+
# Crosses midnight, e.g. sunset → sunrise. Same rule as a time
|
|
248
|
+
# window, and the same rule that makes a polar-night window empty.
|
|
249
|
+
return now >= start or now < end
|
|
250
|
+
if start is not None:
|
|
251
|
+
return now >= start
|
|
252
|
+
if end is not None:
|
|
253
|
+
return now < end
|
|
254
|
+
return True
|
|
255
|
+
|
|
256
|
+
def __repr__(self) -> str: # pragma: no cover - diagnostics only
|
|
257
|
+
if self.mode == "phase":
|
|
258
|
+
return f"<sun phase={self.phase}>"
|
|
259
|
+
if self.mode == "elevation":
|
|
260
|
+
return f"<sun above={self.above} below={self.below}>"
|
|
261
|
+
return f"<sun {self.after}+{self.after_offset:g}s .. {self.before}+{self.before_offset:g}s>"
|
|
262
|
+
|
|
263
|
+
|
|
93
264
|
class _StateCondition:
|
|
94
265
|
"""Pre-parsed state condition with compile-time resolved evaluator.
|
|
95
266
|
|
|
@@ -190,7 +361,7 @@ class _ConditionGroup:
|
|
|
190
361
|
|
|
191
362
|
def __init__(
|
|
192
363
|
self,
|
|
193
|
-
items: list[_TimeCondition | _DateCondition | _StateCondition],
|
|
364
|
+
items: list[_TimeCondition | _DateCondition | _StateCondition | _SunCondition],
|
|
194
365
|
use_all: bool,
|
|
195
366
|
) -> None:
|
|
196
367
|
self.items = items
|
|
@@ -212,7 +383,7 @@ class _ConditionGroup:
|
|
|
212
383
|
|
|
213
384
|
|
|
214
385
|
def _eval_single(
|
|
215
|
-
cond: _TimeCondition | _DateCondition | _StateCondition,
|
|
386
|
+
cond: _TimeCondition | _DateCondition | _StateCondition | _SunCondition,
|
|
216
387
|
now: datetime,
|
|
217
388
|
state_resolver: Callable[[str, str], Any] | None,
|
|
218
389
|
) -> bool:
|
|
@@ -221,6 +392,8 @@ def _eval_single(
|
|
|
221
392
|
return cond.evaluate(now)
|
|
222
393
|
if isinstance(cond, _DateCondition):
|
|
223
394
|
return cond.evaluate(now)
|
|
395
|
+
if isinstance(cond, _SunCondition):
|
|
396
|
+
return cond.evaluate(now)
|
|
224
397
|
if isinstance(cond, _StateCondition):
|
|
225
398
|
return cond.evaluate(state_resolver)
|
|
226
399
|
return True
|
|
@@ -248,13 +421,32 @@ def _parse_date(s: str) -> tuple[int, int]:
|
|
|
248
421
|
raise ValueError(f"Invalid date format: '{s}'")
|
|
249
422
|
|
|
250
423
|
|
|
251
|
-
def _compile_single(
|
|
424
|
+
def _compile_single(
|
|
425
|
+
raw: dict,
|
|
426
|
+
sun_provider: SunProvider | None = None,
|
|
427
|
+
) -> _TimeCondition | _DateCondition | _StateCondition | _SunCondition | None:
|
|
252
428
|
"""Compile a single condition dict into a fast evaluator.
|
|
253
429
|
|
|
254
|
-
|
|
430
|
+
Args:
|
|
431
|
+
raw: One condition from the config.
|
|
432
|
+
sun_provider: The manager's provider, needed only by sun conditions.
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
A compiled condition, or None if it is invalid (logs an error).
|
|
255
436
|
"""
|
|
256
437
|
ctype = raw.get("type")
|
|
257
438
|
try:
|
|
439
|
+
if ctype == "sun":
|
|
440
|
+
return _SunCondition(
|
|
441
|
+
sun_provider,
|
|
442
|
+
after=raw.get("after"),
|
|
443
|
+
after_offset=float(raw.get("after_offset") or 0.0),
|
|
444
|
+
before=raw.get("before"),
|
|
445
|
+
before_offset=float(raw.get("before_offset") or 0.0),
|
|
446
|
+
phase=raw.get("phase"),
|
|
447
|
+
above=None if raw.get("above") is None else float(raw["above"]),
|
|
448
|
+
below=None if raw.get("below") is None else float(raw["below"]),
|
|
449
|
+
)
|
|
258
450
|
if ctype == "time":
|
|
259
451
|
after = _parse_time(raw["after"]) if raw.get("after") else None
|
|
260
452
|
before = _parse_time(raw["before"]) if raw.get("before") else None
|
|
@@ -283,7 +475,8 @@ def _compile_single(raw: dict) -> _TimeCondition | _DateCondition | _StateCondit
|
|
|
283
475
|
|
|
284
476
|
def precompile_conditions(
|
|
285
477
|
action_definition: dict,
|
|
286
|
-
|
|
478
|
+
sun_provider: SunProvider | None = None,
|
|
479
|
+
) -> _ConditionGroup | _TimeCondition | _DateCondition | _StateCondition | _SunCondition | None:
|
|
287
480
|
"""Pre-compile conditions from a parsed action definition.
|
|
288
481
|
|
|
289
482
|
Call this once (at config load / parse_actions time) and store the
|
|
@@ -292,6 +485,9 @@ def precompile_conditions(
|
|
|
292
485
|
Args:
|
|
293
486
|
action_definition: A single action dict that may contain
|
|
294
487
|
``condition`` (single) or ``conditions`` (group).
|
|
488
|
+
sun_provider: The manager's :class:`SunProvider`. Held by reference, so
|
|
489
|
+
reconfiguring the location reaches conditions that were compiled
|
|
490
|
+
before the change without recompiling them.
|
|
295
491
|
|
|
296
492
|
Returns:
|
|
297
493
|
A compiled condition object, or None if there are no conditions.
|
|
@@ -300,7 +496,7 @@ def precompile_conditions(
|
|
|
300
496
|
multi = action_definition.get("conditions")
|
|
301
497
|
|
|
302
498
|
if single:
|
|
303
|
-
return _compile_single(single)
|
|
499
|
+
return _compile_single(single, sun_provider)
|
|
304
500
|
|
|
305
501
|
if multi:
|
|
306
502
|
mode = multi.get("mode", "and")
|
|
@@ -309,7 +505,7 @@ def precompile_conditions(
|
|
|
309
505
|
return None
|
|
310
506
|
compiled = []
|
|
311
507
|
for raw in cond_list:
|
|
312
|
-
item = _compile_single(raw)
|
|
508
|
+
item = _compile_single(raw, sun_provider)
|
|
313
509
|
if item is not None:
|
|
314
510
|
compiled.append(item)
|
|
315
511
|
if not compiled:
|
|
@@ -324,6 +520,7 @@ def should_execute_action(
|
|
|
324
520
|
| _TimeCondition
|
|
325
521
|
| _DateCondition
|
|
326
522
|
| _StateCondition
|
|
523
|
+
| _SunCondition
|
|
327
524
|
| None,
|
|
328
525
|
now: datetime,
|
|
329
526
|
state_resolver: Callable[[str, str], Any] | None = None,
|
|
@@ -49,8 +49,10 @@ from boneio.core.manager.irrigation import IrrigationManager
|
|
|
49
49
|
from boneio.core.manager.modbus import ModbusManager
|
|
50
50
|
from boneio.core.manager.outputs import OutputManager
|
|
51
51
|
from boneio.core.manager.remote import RemoteDeviceManager
|
|
52
|
+
from boneio.core.manager.scheduler import Scheduler
|
|
52
53
|
from boneio.core.manager.security_alert import SecurityAlertPublisher
|
|
53
54
|
from boneio.core.manager.sensors import SensorManager
|
|
55
|
+
from boneio.core.manager.sun import SunProvider
|
|
54
56
|
from boneio.core.manager.templates import TemplateManager
|
|
55
57
|
from boneio.core.manager.update import UpdateManager
|
|
56
58
|
from boneio.core.messaging import MessageBus
|
|
@@ -130,6 +132,8 @@ class Manager:
|
|
|
130
132
|
irrigation: list[dict] | None = None,
|
|
131
133
|
remote_devices: list[dict] | None = None,
|
|
132
134
|
can: dict[str, Any] | None = None,
|
|
135
|
+
location: dict[str, Any] | None = None,
|
|
136
|
+
schedule: list[dict] | None = None,
|
|
133
137
|
web_active: bool = False,
|
|
134
138
|
web_port: int = 8090,
|
|
135
139
|
early_oled_device: Any | None = None,
|
|
@@ -165,6 +169,11 @@ class Manager:
|
|
|
165
169
|
self._config_file_path = config_file_path
|
|
166
170
|
self._topic_prefix = config_helper.topic_prefix
|
|
167
171
|
|
|
172
|
+
# Where the Sun is. Built even when `location:` is absent: an
|
|
173
|
+
# unconfigured provider answers "not ready" and says so once, which is
|
|
174
|
+
# what every caller has to handle anyway.
|
|
175
|
+
self.sun = SunProvider(location)
|
|
176
|
+
|
|
168
177
|
# Reports outstanding security recommendations to Home Assistant.
|
|
169
178
|
self.security_alert = SecurityAlertPublisher(self)
|
|
170
179
|
|
|
@@ -300,6 +309,13 @@ class Manager:
|
|
|
300
309
|
irrigation_config=merged_irrigation,
|
|
301
310
|
)
|
|
302
311
|
|
|
312
|
+
# 13. Scheduler — actions that fire on their own. Built here because
|
|
313
|
+
# parsing its actions needs the outputs and covers to exist, and armed
|
|
314
|
+
# from a task because the first thing it does is look at the clock.
|
|
315
|
+
self.scheduler = Scheduler(manager=self, schedules=schedule or [])
|
|
316
|
+
if schedule:
|
|
317
|
+
self.append_task(coro=self.scheduler.start, name="scheduler")
|
|
318
|
+
|
|
303
319
|
# Configure virtual energy sensors (must be after outputs are initialized)
|
|
304
320
|
self.sensors.configure_virtual_energy_sensors()
|
|
305
321
|
|
|
@@ -613,6 +629,14 @@ class Manager:
|
|
|
613
629
|
except Exception as e:
|
|
614
630
|
_LOGGER.debug("Error re-publishing sensor state %s: %s", sensor.id, e)
|
|
615
631
|
|
|
632
|
+
# Sun sensors. A broker that has just come back has no retained value
|
|
633
|
+
# for them, and the next scheduled update could be a minute away.
|
|
634
|
+
for sensor in self.sensors.get_sun_sensors():
|
|
635
|
+
try:
|
|
636
|
+
await sensor.async_update(timestamp)
|
|
637
|
+
except Exception as e:
|
|
638
|
+
_LOGGER.debug("Error re-publishing sensor state %s: %s", sensor.id, e)
|
|
639
|
+
|
|
616
640
|
def publish_ha_discovery(
|
|
617
641
|
self,
|
|
618
642
|
id: str,
|
|
@@ -684,7 +708,7 @@ class Manager:
|
|
|
684
708
|
if action_definition.get(key) is not None:
|
|
685
709
|
parsed_action[key] = action_definition[key]
|
|
686
710
|
# Pre-compile conditions for fast evaluation at action time
|
|
687
|
-
compiled = precompile_conditions(parsed_action)
|
|
711
|
+
compiled = precompile_conditions(parsed_action, self.sun)
|
|
688
712
|
if compiled is not None:
|
|
689
713
|
parsed_action["_compiled_conditions"] = compiled
|
|
690
714
|
|
|
@@ -902,8 +926,12 @@ class Manager:
|
|
|
902
926
|
|
|
903
927
|
duration_ms = (duration or 0) * 1000 # Convert to ms
|
|
904
928
|
|
|
905
|
-
# Compute datetime once for all condition evaluations in this batch
|
|
906
|
-
|
|
929
|
+
# Compute datetime once for all condition evaluations in this batch.
|
|
930
|
+
# Aware, not naive: sun anchors are born as aware UTC, and comparing
|
|
931
|
+
# them against a naive local time would be ambiguous in the hour the
|
|
932
|
+
# clock goes back. `.time()` and `.month` behave identically on an
|
|
933
|
+
# aware local datetime, so the time and date conditions are unaffected.
|
|
934
|
+
now_dt = datetime.now().astimezone()
|
|
907
935
|
|
|
908
936
|
for idx, action_definition in enumerate(actions):
|
|
909
937
|
is_repeat = action_definition.get("repeat", False)
|
|
@@ -1293,6 +1321,26 @@ class Manager:
|
|
|
1293
1321
|
finally:
|
|
1294
1322
|
self._pending_tilt_restores.pop(task_key, None)
|
|
1295
1323
|
|
|
1324
|
+
async def _reload_schedule(self) -> None:
|
|
1325
|
+
"""Adopt a new schedule section, disarming whatever was armed before."""
|
|
1326
|
+
config = self._config_helper.get_config() or {}
|
|
1327
|
+
await self.scheduler.reload(config.get("schedule") or [])
|
|
1328
|
+
# A device that started with no schedules never started the supervisor.
|
|
1329
|
+
await self.scheduler.start()
|
|
1330
|
+
|
|
1331
|
+
def _reload_location(self) -> None:
|
|
1332
|
+
"""Adopt new coordinates and drop every cached sun answer.
|
|
1333
|
+
|
|
1334
|
+
Cheap enough to be synchronous: the provider recomputes lazily, so this
|
|
1335
|
+
is a configure call and three cache clears.
|
|
1336
|
+
"""
|
|
1337
|
+
config = self._config_helper.get_config() or {}
|
|
1338
|
+
self.sun.configure(config.get("location"))
|
|
1339
|
+
# Coordinates may have just appeared, in which case the sun sensors
|
|
1340
|
+
# were never built. Existing ones need nothing: they read the provider
|
|
1341
|
+
# on every update, so new coordinates reach them by themselves.
|
|
1342
|
+
self.sensors.configure_sun_sensors()
|
|
1343
|
+
|
|
1296
1344
|
def _reload_logger(self) -> None:
|
|
1297
1345
|
"""Reload logger configuration from config file.
|
|
1298
1346
|
|
|
@@ -1704,6 +1752,8 @@ class Manager:
|
|
|
1704
1752
|
"irrigation": self.irrigation.reload_irrigation, # Irrigation controllers
|
|
1705
1753
|
"adc": self.sensors.reload_adc_sensors, # ADC analog sensors
|
|
1706
1754
|
"areas": lambda: None, # Areas are already reloaded in reload_config above
|
|
1755
|
+
"location": self._reload_location, # Coordinates for sun-based features
|
|
1756
|
+
"schedule": self._reload_schedule, # Time and sun driven schedules
|
|
1707
1757
|
"oled": self.display.reload_oled, # OLED display screens, screensaver
|
|
1708
1758
|
}
|
|
1709
1759
|
|