boneio 1.6.0.dev2__tar.gz → 1.6.0.dev4__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.dev4}/PKG-INFO +3 -3
- boneio-1.6.0.dev4/boneio/core/config/provenance.py +114 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_util.py +173 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/action_conditions.py +206 -9
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/manager.py +53 -3
- boneio-1.6.0.dev4/boneio/core/manager/scheduler.py +410 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/sensors.py +96 -0
- boneio-1.6.0.dev4/boneio/core/manager/sun.py +388 -0
- boneio-1.6.0.dev4/boneio/core/sensor/sun.py +301 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system_ops.py +50 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/conditions.py +55 -4
- boneio-1.6.0.dev4/boneio/core/utils/sun.py +440 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/interface.py +50 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/homeassistant.py +93 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/actions.py +27 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/MANIFEST.sha256 +4 -6
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-migrate-v2 +80 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-system +320 -10
- boneio-1.6.0.dev4/boneio/migrations/assets/issue.d/10-boneio.issue +1 -0
- boneio-1.6.0.dev4/boneio/migrations/assets/sudoers/boneio +16 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.0.json +1 -1
- boneio-1.6.0.dev4/boneio/migrations/plans/1.3.0.sig +0 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.4.0.json +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.4.0.sig +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.10.json +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.10.sig +2 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.11.json +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.11.sig +2 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.12.json +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.12.sig +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.5.json +1 -1
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.5.sig +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.8.json +1 -1
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.8.sig +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.9.json +1 -0
- boneio-1.6.0.dev4/boneio/migrations/plans/1.6.9.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev4/boneio/migrations/plans/manifest.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/runner.py +26 -4
- boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +55 -0
- boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_11_drop_docker_group.py +41 -0
- boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_12_console_shows_ip.py +58 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +1 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_5_trust_transition.py +2 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +8 -6
- boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_9_ntp_servers.py +64 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/runner.py +2 -0
- boneio-1.6.0.dev4/boneio/schema/condition.yaml +164 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/schema.yaml +228 -0
- boneio-1.6.0.dev4/boneio/version.py +2 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/action_validation.py +74 -2
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/app.py +30 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/AccountsView-iveRbldx.js +1 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/AppInitContext-CsffdB9c.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/BackupSection-C1qj4qOG.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/BindingMatrix-Bj6KE0yY.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/DeviceControlSection-CPmqccka.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/DiagnosticsView-Bi1hrIcs.js +5 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EditItemDialog-BH1onHq0.js +66 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EntityCard-yD9_Hl71.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EntityGrid-BDdmT0qN.js +1 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/FormInputToggle-Spiz-w7l.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/HaDashboardWizard-f8fMg8FC.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/HostnameSection-DrpKbp6I.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/InputsView-W99g8hSl.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/LocationSection-ZILUsfeR.js +2 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/LongPressWrapper-BKkWvoC1.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/MigrationsSection-DSbw5UVz.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ModbusView-CdP0fXYx.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BYwPAyFi.js +1 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/NodeRedView-Ct08K8xu.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/OutputsView-C9sDLF1P.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ScheduleSection-C2qLKNWR.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/SecurityView-DBkwBU2t.js +1 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/Sparkline-D-2-v-7o.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/SystemState-DbY5T6BB.js +2 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TemplatesView-6kNzVE3p.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TilePicker-jd3hKaoZ.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TimezoneSection-BEuXBmWp.js +1 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/UISettings-DIcCTtXU.js +33 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ViewToggle-B8OpHNHc.js +1 -0
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/aiWizardPrompt-Dc7dZBzw.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/coverUtils-Cf4Uxn2U.js +1 -0
- boneio-1.6.0.dev4/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.dev4/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.dev4/boneio/webui/frontend-dist/assets/gi-tOlGxC0X.js +1 -1
- boneio-1.6.0.dev4/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.dev4/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.dev4/boneio/webui/frontend-dist/assets/monaco-C9XC2D1j.js +3 -3
- boneio-1.6.0.dev4/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.dev4/boneio/webui/frontend-dist/assets/tabs-box-Byn-MOyS.js +1 -1
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/utils-B6KiDbIe.js +1 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/index.html +6 -4
- {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev4/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +212 -4
- {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev4/boneio/webui/frontend-dist}/schema/config.schema.json +2026 -29
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/event.schema.json +742 -14
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/schema/location.schema.json +48 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/schema/schedule.schema.json +1003 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/web.schema.json +22 -0
- boneio-1.6.0.dev4/boneio/webui/frontend-dist/sw.js +1 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/__init__.py +4 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_core.py +5 -1
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/onboarding.py +18 -0
- boneio-1.6.0.dev4/boneio/webui/routes/schedule.py +75 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/sensors.py +16 -1
- boneio-1.6.0.dev4/boneio/webui/routes/sun.py +151 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/system.py +157 -19
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/update.py +26 -38
- {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev4/boneio/webui}/schema/binary_sensor.schema.json +212 -4
- {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev4/boneio/webui}/schema/config.schema.json +2026 -29
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/event.schema.json +742 -14
- boneio-1.6.0.dev4/boneio/webui/schema/location.schema.json +48 -0
- boneio-1.6.0.dev4/boneio/webui/schema/schedule.schema.json +1003 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/web.schema.json +22 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/security_headers.py +31 -3
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4/boneio.egg-info}/PKG-INFO +3 -3
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/SOURCES.txt +70 -38
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/pyproject.toml +5 -2
- 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.dev4}/LICENSE +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/README.md +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/const.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/models.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/store.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/secret_masking.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/containers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/security_alert.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/net/discovery_guard.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/posture.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/axios-uEi8e3Ln.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/chunk-QTnfLwEv.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/configCache-CLN4xEny.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-DUFfd7ef.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-Dpn-hvLa.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/yaml.worker-8qQfrID5.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/csrf.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/policy.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/rate_limit.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/accounts.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/nodered.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/security.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/setup.cfg +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/setup.py +0 -0
- {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/tests/test_py313_compatibility.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.6.0.
|
|
3
|
+
Version: 1.6.0.dev4
|
|
4
4
|
Summary: Python App for BoneIO
|
|
5
5
|
Author-email: Paweł Szafer <pszafer@gmail.com>
|
|
6
6
|
License: GNU General Public License v3.0
|
|
7
7
|
Project-URL: Homepage, https://boneio.eu
|
|
8
|
-
Project-URL: Repository, https://github.com/boneIO-eu/
|
|
8
|
+
Project-URL: Repository, https://github.com/boneIO-eu/app_black
|
|
9
9
|
Project-URL: Documentation, https://boneio.eu/docs/intro/
|
|
10
|
-
Project-URL: Changelog, https://github.com/boneIO-eu/
|
|
10
|
+
Project-URL: Changelog, https://github.com/boneIO-eu/app_black/releases
|
|
11
11
|
Requires-Python: >=3.13
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Tell a freshly flashed controller from one that has been in service.
|
|
2
|
+
|
|
3
|
+
The first-run wizard has two steps that are only appropriate on a blank
|
|
4
|
+
device. The import step offers to restore a configuration, which on a device
|
|
5
|
+
that already has one reads as "yours is gone". The devices step is worse than
|
|
6
|
+
misleading: it replaces the whole ``event`` section, so a controller with fifty
|
|
7
|
+
configured inputs loses them to a wizard its owner opened only to create an
|
|
8
|
+
account.
|
|
9
|
+
|
|
10
|
+
So the question has to be answered before those steps are offered, and the two
|
|
11
|
+
ways of getting it wrong are not equally bad:
|
|
12
|
+
|
|
13
|
+
* Treating an upgraded device as fresh costs the owner their configuration.
|
|
14
|
+
* Treating a fresh device as upgraded costs them a step in a wizard; they
|
|
15
|
+
can still import and bind inputs from the normal interface afterwards.
|
|
16
|
+
|
|
17
|
+
This module is therefore written to answer "is it fresh" and to say no when it
|
|
18
|
+
cannot tell. Freshness has to be demonstrated, not assumed.
|
|
19
|
+
|
|
20
|
+
The demonstration is that the configuration is still the factory one. The image
|
|
21
|
+
copies a variant out of ``~/.cache/boneio_configs/<variant>/`` verbatim, and
|
|
22
|
+
per-device work touches only ``mqtt.yaml`` (the broker password), so a
|
|
23
|
+
controller nobody has configured yet still has a ``config.yaml`` byte-identical
|
|
24
|
+
to its template.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import logging
|
|
30
|
+
import os
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
_LOGGER = logging.getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
#: Where the image leaves the per-variant templates it seeded the device from.
|
|
36
|
+
FACTORY_TEMPLATE_DIR = Path.home() / ".cache" / "boneio_configs"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _digest(path: Path) -> bytes | None:
|
|
40
|
+
"""Read a file for comparison.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
path: File to read.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Its contents, or None when it cannot be read.
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
return path.read_bytes()
|
|
50
|
+
except OSError:
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def looks_factory_fresh(
|
|
55
|
+
config_path: str | os.PathLike[str],
|
|
56
|
+
template_dir: str | os.PathLike[str] | None = None,
|
|
57
|
+
) -> bool:
|
|
58
|
+
"""Whether this device still carries an untouched factory configuration.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
config_path: The device's ``config.yaml``.
|
|
62
|
+
template_dir: Where the per-variant templates live. Defaults to
|
|
63
|
+
:data:`FACTORY_TEMPLATE_DIR`.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
True only when freshness can be positively shown: there is no
|
|
67
|
+
configuration at all, or the configuration is identical to one of the
|
|
68
|
+
templates the image ships. False whenever the answer is not certain.
|
|
69
|
+
"""
|
|
70
|
+
config = Path(config_path)
|
|
71
|
+
current = _digest(config)
|
|
72
|
+
if current is None:
|
|
73
|
+
# Nothing to lose, and nothing that an import could overwrite.
|
|
74
|
+
_LOGGER.debug("No configuration at %s — treating the device as fresh", config)
|
|
75
|
+
return True
|
|
76
|
+
|
|
77
|
+
root = Path(template_dir) if template_dir is not None else FACTORY_TEMPLATE_DIR
|
|
78
|
+
try:
|
|
79
|
+
variants = sorted(p for p in root.iterdir() if p.is_dir())
|
|
80
|
+
except OSError:
|
|
81
|
+
# No templates to compare against: the honest answer is "cannot tell",
|
|
82
|
+
# and the safe reading of that is "assume it has been configured".
|
|
83
|
+
_LOGGER.debug("No factory templates under %s — assuming configured", root)
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
for variant in variants:
|
|
87
|
+
if current == _digest(variant / "config.yaml"):
|
|
88
|
+
_LOGGER.debug("Configuration matches the %s template", variant.name)
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def was_configured_before(
|
|
95
|
+
config_path: str | os.PathLike[str],
|
|
96
|
+
had_legacy_auth: bool = False,
|
|
97
|
+
template_dir: str | os.PathLike[str] | None = None,
|
|
98
|
+
) -> bool:
|
|
99
|
+
"""Whether the wizard should skip the steps that assume a blank device.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
config_path: The device's ``config.yaml``.
|
|
103
|
+
had_legacy_auth: Whether a pre-1.6 ``web.auth`` block was found. It
|
|
104
|
+
proves the device is not fresh, but its absence proves nothing —
|
|
105
|
+
most 1.5.x controllers never had web authentication at all, which
|
|
106
|
+
is exactly the case this used to get wrong.
|
|
107
|
+
template_dir: Passed through to :func:`looks_factory_fresh`.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
True when the device already has a configuration of its own.
|
|
111
|
+
"""
|
|
112
|
+
if had_legacy_auth:
|
|
113
|
+
return True
|
|
114
|
+
return not looks_factory_fresh(config_path, template_dir)
|
|
@@ -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,
|