boneio 1.6.0.dev1__tar.gz → 1.6.0.dev2__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/MANIFEST.in +11 -0
- {boneio-1.6.0.dev1/boneio.egg-info → boneio-1.6.0.dev2}/PKG-INFO +2 -2
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/bonecli.py +9 -3
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/cover/time_based.py +14 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/cover/venetian.py +14 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/irrigation/controller.py +29 -1
- boneio-1.6.0.dev2/boneio/core/auth/__init__.py +24 -0
- boneio-1.6.0.dev2/boneio/core/auth/cli.py +242 -0
- boneio-1.6.0.dev2/boneio/core/auth/hashing.py +182 -0
- boneio-1.6.0.dev2/boneio/core/auth/migration.py +116 -0
- boneio-1.6.0.dev2/boneio/core/auth/models.py +101 -0
- boneio-1.6.0.dev2/boneio/core/auth/store.py +500 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/registration.py +71 -138
- boneio-1.6.0.dev2/boneio/core/config/input_bindings.py +231 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/migrations/v4_wled_cache.py +38 -3
- boneio-1.6.0.dev2/boneio/core/config/secret_masking.py +199 -0
- boneio-1.6.0.dev2/boneio/core/config/yaml_patch.py +262 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/yaml_util.py +49 -6
- boneio-1.6.0.dev2/boneio/core/containers.py +414 -0
- boneio-1.6.0.dev2/boneio/core/diagnostics/__init__.py +1 -0
- boneio-1.6.0.dev2/boneio/core/diagnostics/collect.py +484 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/covers.py +18 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/manager.py +8 -3
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/outputs.py +45 -0
- boneio-1.6.0.dev2/boneio/core/manager/security_alert.py +199 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/update.py +21 -4
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/mqtt.py +38 -38
- boneio-1.6.0.dev2/boneio/core/net/__init__.py +1 -0
- boneio-1.6.0.dev2/boneio/core/net/discovery_guard.py +158 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/esphome.py +98 -40
- boneio-1.6.0.dev2/boneio/core/security/__init__.py +1 -0
- boneio-1.6.0.dev2/boneio/core/security/framing.py +113 -0
- boneio-1.6.0.dev2/boneio/core/security/posture.py +373 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/system/monitor.py +18 -2
- boneio-1.6.0.dev2/boneio/core/system_ops.py +157 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/async_updater.py +30 -2
- boneio-1.6.0.dev2/boneio/core/utils/overlay.py +159 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/display/oled.py +6 -1
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +163 -21
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/integration/homeassistant.py +41 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/actions.py +143 -5
- boneio-1.6.0.dev2/boneio/migrations/assets/MANIFEST.sha256 +44 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +38 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/docker/nodered/node-red/settings.js +132 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/helpers/boneio-containers +619 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/helpers/boneio-helpers-heal +209 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/helpers/boneio-migrate-v2 +1472 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/helpers/boneio-system +433 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/journald/journald.conf +43 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/kernel/postinst-boneio-overlay +79 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/migrations-recovery.pem +3 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/migrations.pem +3 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/sshd/10-boneio-hardening.conf +14 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/sudoers/boneio-helpers +14 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/sudoers/boneio-timedatectl +19 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/boneio-helpers-heal.service +37 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/boneio-oled-boot.service +30 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/boneio.service +49 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +11 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +22 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +16 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +21 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +27 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/systemd/linger-marker +0 -0
- boneio-1.6.0.dev2/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +15 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/bootstrap/boneio-migrate +164 -1
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.0.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.0.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.1.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.1.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.2.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.3.2.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.3.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.3.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.4.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.4.4.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.0.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.0.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.1.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.1.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.10.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.10.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.11.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.11.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.12.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.12.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.13.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.13.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.14.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.14.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.15.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.15.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.16.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.16.sig +2 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.17.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.17.sig +2 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.18.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.18.sig +2 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.2.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.2.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.3.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.3.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.4.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.4.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.5.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.5.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.6.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.6.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.7.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.7.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.8.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.8.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.9.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.5.9.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.0.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.0.sig +2 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.1.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.1.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.2.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.2.sig +0 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.3.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.3.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.4.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.4.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.5.json +1 -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.6.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.6.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.7.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.7.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.8.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/1.6.8.sig +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/manifest.json +1 -0
- boneio-1.6.0.dev2/boneio/migrations/plans/manifest.sig +1 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/runner.py +387 -3
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_3_0_baseline.py +6 -8
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_10_disable_console_setup.py +33 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_11_timer_catchup.py +64 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +69 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +43 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +50 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +37 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_16_login_linger.py +53 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_17_defer_user_manager.py +60 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +57 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_2_libyaml.py +81 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_3_libyaml_retry.py +74 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +32 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_6_boot_service_order.py +59 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_7_journald_limits.py +47 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_8_apparmor_prune.py +72 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_5_9_defer_nonessential.py +50 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +55 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +44 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +41 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +37 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +57 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_5_trust_transition.py +195 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +53 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +45 -0
- boneio-1.6.0.dev2/boneio/migrations/versions/v1_6_8_system_helper.py +74 -0
- boneio-1.6.0.dev2/boneio/modbus/devices/hvac/defro-drx.json +519 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/hvac/wanas415.json +1 -1
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/runner.py +77 -1
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/schema.yaml +71 -0
- boneio-1.6.0.dev2/boneio/version.py +2 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/action_validation.py +7 -4
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/app.py +167 -17
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AccountsView-p4dfo1BI.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AppInitContext-D9IKihqu.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BackupSection-CwWiIyYm.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BindingMatrix-C5N7pHyw.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DeviceControlSection-CiAn0q3F.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DiagnosticsView-CPTuMjVr.js +5 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EditItemDialog-D_97HEFm.js +66 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityCard-Bb1AOk78.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityGrid-CljXU2ZD.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FactoryResetSection-BAzLfqax.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FormInputToggle-B_NTf6g-.js +11 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HaDashboardWizard-ie0HCjfc.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HostnameSection-DFipLyZg.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/InputsView-Dv2ynbYD.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LoggerForm-UKzOi5ri.js +5 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LongPressWrapper-K2sCXsb5.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MigrationsSection-DMp9cBmP.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/ModbusView-Cw5Mgatj.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DhFBnZZZ.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedManagement-C9si33mc.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedView-D8E1Itvk.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/OutputsView-BID1iUa3.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SecurityView-CMCqfNQs.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SensorView-DMMhavyC.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js → boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/Sparkline-Cq-w3bbO.js +1 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SystemState-BcmUoX6A.js +2 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TemplatesView-0sksWoxA.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TimezoneSection-DkaFIcW_.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/UISettings-Don7-C6Q.js +33 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js → boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiConfig-BAR1rHKB.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js → boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiWizardPrompt-BRgdilYB.js +1 -1
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/axios-uEi8e3Ln.js +10 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/configCache-CLN4xEny.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/fa-1N_Z7Z57.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/gi-iTtpUjJp.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-C8RrYuNy.js +16 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-DfcdKR51.css +2 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/monaco-DUFfd7ef.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/monaco-Dpn-hvLa.js +872 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/monaco-drkeoggn.js +13 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/select-Xn9nmZSE.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/tabs-box-DQ3qtHub.js +1 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/yaml.worker-8qQfrID5.js +221 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/index.html +7 -9
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/config.schema.json +46 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +3 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/web.schema.json +43 -0
- boneio-1.6.0.dev2/boneio/webui/frontend-dist/sw.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/workbox-4918f2f6.js → boneio-1.6.0.dev2/boneio/webui/frontend-dist/workbox-7e79c025.js +1 -1
- boneio-1.6.0.dev2/boneio/webui/middleware/auth.py +415 -0
- boneio-1.6.0.dev2/boneio/webui/middleware/csrf.py +106 -0
- boneio-1.6.0.dev2/boneio/webui/middleware/policy.py +171 -0
- boneio-1.6.0.dev2/boneio/webui/rate_limit.py +237 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/__init__.py +8 -2
- boneio-1.6.0.dev2/boneio/webui/routes/accounts.py +272 -0
- boneio-1.6.0.dev2/boneio/webui/routes/auth.py +134 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/can.py +22 -130
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config.py +2 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config_actions.py +138 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config_core.py +70 -2
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config_files.py +1 -0
- boneio-1.6.0.dev2/boneio/webui/routes/diagnostics.py +259 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/nodered.py +86 -86
- boneio-1.6.0.dev2/boneio/webui/routes/onboarding.py +154 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/remote_devices.py +47 -6
- boneio-1.6.0.dev2/boneio/webui/routes/security.py +321 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/system.py +243 -291
- boneio-1.6.0.dev2/boneio/webui/routes/timezone_sudoers.py +137 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/update.py +83 -35
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/config.schema.json +46 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/modbus_devices.schema.json +3 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/web.schema.json +43 -0
- boneio-1.6.0.dev2/boneio/webui/security_headers.py +127 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/web_server.py +5 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2/boneio.egg-info}/PKG-INFO +2 -2
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio.egg-info/SOURCES.txt +185 -42
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio.egg-info/requires.txt +1 -1
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/pyproject.toml +15 -5
- boneio-1.6.0.dev1/MANIFEST.in +0 -7
- boneio-1.6.0.dev1/boneio/migrations/assets/MANIFEST.sha256 +0 -24
- boneio-1.6.0.dev1/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -50
- boneio-1.6.0.dev1/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -5
- boneio-1.6.0.dev1/boneio/migrations/assets/journald/journald.conf +0 -6
- boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -17
- boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio.service +0 -15
- boneio-1.6.0.dev1/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -10
- boneio-1.6.0.dev1/boneio/migrations/versions/v1_5_2_libyaml.py +0 -109
- boneio-1.6.0.dev1/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -102
- boneio-1.6.0.dev1/boneio/version.py +0 -2
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/BindingMatrix-BNqK7tIZ.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-BbAOE4qq.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EditItemDialog-C0WDUAld.js +0 -66
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityCard-xdVpUoDY.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityGrid-gh0rv5_A.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/FormInputToggle-B-viFZz5.js +0 -11
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/InputsView-7BXiGozL.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/LogViewer-DoFcRAEu.js +0 -2
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ModbusView-DX2BOSsr.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/NodeRedView-BdZeZ91F.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/OutputsView-BaZRxY6O.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SensorView-BS6L9UKi.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BBw56CUu.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SystemState-3DdCx89h.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/TemplatesView-C2wBfPOg.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/Tools-DX1geom0.js +0 -14
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/UISettings-BAXtlmBZ.js +0 -38
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/axios-DHUeYRnu.js +0 -10
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/configCache-BAkc0Ye7.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -89
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/gi-D-jcrHWa.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -502
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-B-isv7qh.js +0 -6
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-pwUtHTme.css +0 -2
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -58
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -1212
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -67734
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -11
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -450
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/sw.js +0 -1
- boneio-1.6.0.dev1/boneio/webui/middleware/auth.py +0 -193
- boneio-1.6.0.dev1/boneio/webui/routes/auth.py +0 -71
- boneio-1.6.0.dev1/boneio/webui/routes/caddy.py +0 -741
- boneio-1.6.0.dev1/boneio/webui/routes/timezone_sudoers.py +0 -201
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/LICENSE +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/README.md +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/const.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/condition.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- /boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js → /boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/chunk-QTnfLwEv.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/setup.cfg +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/setup.py +0 -0
- {boneio-1.6.0.dev1 → boneio-1.6.0.dev2}/tests/test_py313_compatibility.py +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include requirements.txt
|
|
3
|
+
include LICENSE
|
|
4
|
+
recursive-include boneio *.yaml
|
|
5
|
+
recursive-include boneio *.json
|
|
6
|
+
recursive-include boneio *.ttf
|
|
7
|
+
recursive-include boneio/webui/frontend-dist *
|
|
8
|
+
# Signing key and migration plan signatures — the helper refuses to run
|
|
9
|
+
# without them, so a wheel built without these is useless on a device.
|
|
10
|
+
recursive-include boneio *.pem
|
|
11
|
+
recursive-include boneio *.sig
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.6.0.
|
|
3
|
+
Version: 1.6.0.dev2
|
|
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
|
|
@@ -33,7 +33,7 @@ Requires-Dist: qrcode==8.2
|
|
|
33
33
|
Requires-Dist: gpiod==2.3.0
|
|
34
34
|
Requires-Dist: requests==2.32.5
|
|
35
35
|
Requires-Dist: packaging==25.0
|
|
36
|
-
Requires-Dist: aioesphomeapi>=
|
|
36
|
+
Requires-Dist: aioesphomeapi>=45.0.0
|
|
37
37
|
Requires-Dist: zeroconf>=0.148.0
|
|
38
38
|
Requires-Dist: canopen-asyncio>=2.4.1
|
|
39
39
|
Dynamic: license-file
|
|
@@ -37,6 +37,11 @@ def get_arguments() -> argparse.Namespace:
|
|
|
37
37
|
description="boneIO app for BeagleBone Black.",
|
|
38
38
|
)
|
|
39
39
|
subparsers = parser.add_subparsers(dest=ACTION, required=True)
|
|
40
|
+
|
|
41
|
+
from boneio.core.auth.cli import add_accounts_parser
|
|
42
|
+
|
|
43
|
+
add_accounts_parser(subparsers)
|
|
44
|
+
|
|
40
45
|
run_parser = subparsers.add_parser("run")
|
|
41
46
|
run_parser.add_argument(
|
|
42
47
|
"--debug",
|
|
@@ -258,9 +263,6 @@ def run(
|
|
|
258
263
|
from boneio.const import ACTION
|
|
259
264
|
_LOGGER.debug("[RUNNER IMPORT] boneio.const: %.2fs", _time.monotonic() - _t_a)
|
|
260
265
|
_t_a = _time.monotonic()
|
|
261
|
-
from boneio.core.cloud import CloudRegistration
|
|
262
|
-
_LOGGER.debug("[RUNNER IMPORT] boneio.core.cloud: %.2fs", _time.monotonic() - _t_a)
|
|
263
|
-
_t_a = _time.monotonic()
|
|
264
266
|
from boneio.core.manager import Manager
|
|
265
267
|
_LOGGER.debug("[RUNNER IMPORT] boneio.core.manager: %.2fs", _time.monotonic() - _t_a)
|
|
266
268
|
_t_a = _time.monotonic()
|
|
@@ -388,6 +390,10 @@ def main() -> int:
|
|
|
388
390
|
mqttpassword=args.mqttpassword,
|
|
389
391
|
debug=debug,
|
|
390
392
|
)
|
|
393
|
+
elif args.action == "accounts":
|
|
394
|
+
from boneio.core.auth.cli import run_accounts_command
|
|
395
|
+
|
|
396
|
+
exit_code = run_accounts_command(args=args)
|
|
391
397
|
elif args.action == "modbus":
|
|
392
398
|
_LOGGER.info("BoneIO Modbus helper %s .", __version__)
|
|
393
399
|
exit_code = run_modbus_command(
|
|
@@ -61,6 +61,20 @@ class TimeBasedCover(BaseCover):
|
|
|
61
61
|
else:
|
|
62
62
|
return
|
|
63
63
|
|
|
64
|
+
if duration == 0:
|
|
65
|
+
# A zero open_time/close_time makes movement impossible: the guard
|
|
66
|
+
# below returns before relay.turn_on(), so the relay is never
|
|
67
|
+
# energised and the motor never gets voltage — while the cover still
|
|
68
|
+
# reports IDLE and publishes state, so the UI looks like it worked.
|
|
69
|
+
# This is always a misconfiguration, never a normal outcome.
|
|
70
|
+
_LOGGER.error(
|
|
71
|
+
"Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
|
|
72
|
+
"switched. Set a non-zero time in the cover configuration.",
|
|
73
|
+
self._id,
|
|
74
|
+
direction,
|
|
75
|
+
"open" if direction == OPEN else "close",
|
|
76
|
+
)
|
|
77
|
+
|
|
64
78
|
if total_steps == 0 or duration == 0:
|
|
65
79
|
self._current_operation = IDLE
|
|
66
80
|
with suppress(RuntimeError):
|
|
@@ -93,6 +93,20 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
93
93
|
else:
|
|
94
94
|
total_steps = 1
|
|
95
95
|
|
|
96
|
+
if duration == 0:
|
|
97
|
+
# A zero open_time/close_time makes movement impossible: the guard
|
|
98
|
+
# below returns before relay.turn_on(), so the relay is never
|
|
99
|
+
# energised and the motor never gets voltage — while the cover still
|
|
100
|
+
# reports IDLE and publishes state, so the UI looks like it worked.
|
|
101
|
+
# This is always a misconfiguration, never a normal outcome.
|
|
102
|
+
_LOGGER.error(
|
|
103
|
+
"Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
|
|
104
|
+
"switched. Set a non-zero time in the cover configuration.",
|
|
105
|
+
self._id,
|
|
106
|
+
direction,
|
|
107
|
+
"open" if direction == OPEN else "close",
|
|
108
|
+
)
|
|
109
|
+
|
|
96
110
|
if total_steps == 0 or duration == 0:
|
|
97
111
|
self._current_operation = IDLE
|
|
98
112
|
self._loop.call_soon_threadsafe(self.send_state, self.state, self.json_position)
|
|
@@ -1010,6 +1010,13 @@ class IrrigationController:
|
|
|
1010
1010
|
await self.next_valve()
|
|
1011
1011
|
|
|
1012
1012
|
async def handle_zone_command(self, zone_id: str, payload: str) -> None:
|
|
1013
|
+
"""Handle ON/OFF command for a specific zone.
|
|
1014
|
+
|
|
1015
|
+
ON starts the zone in single-zone mode (shutting down any running cycle first).
|
|
1016
|
+
OFF only shuts down the controller if ``zone_id`` matches the currently
|
|
1017
|
+
active zone — this prevents HA state-sync messages (OFF for inactive
|
|
1018
|
+
zones) from killing a running cycle.
|
|
1019
|
+
"""
|
|
1013
1020
|
upper = payload.strip().upper()
|
|
1014
1021
|
_LOGGER.debug(
|
|
1015
1022
|
"Irrigation %s handle_zone_command: zone='%s' payload='%s' → upper='%s'", self.id, zone_id, payload, upper
|
|
@@ -1017,7 +1024,28 @@ class IrrigationController:
|
|
|
1017
1024
|
if upper == ON:
|
|
1018
1025
|
await self.start_single_zone(zone_id)
|
|
1019
1026
|
elif upper == OFF:
|
|
1020
|
-
|
|
1027
|
+
# Only shutdown if this zone is the one currently running.
|
|
1028
|
+
# HA sends OFF to all zone switches when one is activated,
|
|
1029
|
+
# so we must NOT shutdown the controller for inactive zones.
|
|
1030
|
+
if self._state == ControllerState.IDLE:
|
|
1031
|
+
return
|
|
1032
|
+
active_zone = (
|
|
1033
|
+
self._zones[self._active_zone_idx]
|
|
1034
|
+
if self._active_zone_idx is not None and self._active_zone_idx < len(self._zones)
|
|
1035
|
+
else None
|
|
1036
|
+
)
|
|
1037
|
+
if active_zone is not None and active_zone.id == zone_id:
|
|
1038
|
+
_LOGGER.info(
|
|
1039
|
+
"Irrigation %s: OFF received for active zone '%s' — shutting down",
|
|
1040
|
+
self.id, zone_id,
|
|
1041
|
+
)
|
|
1042
|
+
await self.shutdown()
|
|
1043
|
+
else:
|
|
1044
|
+
_LOGGER.debug(
|
|
1045
|
+
"Irrigation %s: ignoring OFF for zone '%s' (active zone is '%s')",
|
|
1046
|
+
self.id, zone_id,
|
|
1047
|
+
active_zone.id if active_zone else "none",
|
|
1048
|
+
)
|
|
1021
1049
|
|
|
1022
1050
|
async def handle_zone_duration_command(self, zone_id: str, payload: str) -> None:
|
|
1023
1051
|
"""Handle duration change from HA (value in minutes)."""
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Account model, password hashing and persistence for boneIO web accounts."""
|
|
2
|
+
|
|
3
|
+
from boneio.core.auth.hashing import hash_password, needs_rehash, verify_password
|
|
4
|
+
from boneio.core.auth.models import Role, User
|
|
5
|
+
from boneio.core.auth.store import (
|
|
6
|
+
USERS_FILENAME,
|
|
7
|
+
UserStore,
|
|
8
|
+
UserStoreError,
|
|
9
|
+
normalize_username,
|
|
10
|
+
validate_password,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"USERS_FILENAME",
|
|
15
|
+
"Role",
|
|
16
|
+
"User",
|
|
17
|
+
"UserStore",
|
|
18
|
+
"UserStoreError",
|
|
19
|
+
"hash_password",
|
|
20
|
+
"needs_rehash",
|
|
21
|
+
"normalize_username",
|
|
22
|
+
"validate_password",
|
|
23
|
+
"verify_password",
|
|
24
|
+
]
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""``boneio accounts`` — manage web UI accounts from the shell.
|
|
2
|
+
|
|
3
|
+
This is the recovery path. A device whose administrator password is lost has no
|
|
4
|
+
other way back in: there is no email to send a link to, and wiping
|
|
5
|
+
``users.json`` by hand would take every other account with it.
|
|
6
|
+
|
|
7
|
+
It is also how a controller gets an account without a browser, which makes
|
|
8
|
+
provisioning scriptable and means a freshly flashed device does not have to be
|
|
9
|
+
clicked through the wizard.
|
|
10
|
+
|
|
11
|
+
Passwords are never taken from the command line. An argument is visible in
|
|
12
|
+
``ps`` to every user on the box and lands in shell history, so they are always
|
|
13
|
+
prompted for, with echo off.
|
|
14
|
+
|
|
15
|
+
Changes take effect immediately: the running web server notices that
|
|
16
|
+
``users.json`` changed and re-reads it, so recovering a password does not mean
|
|
17
|
+
restarting a controller in the middle of whatever it is automating.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import getpass
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
import sys
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
from boneio.core.auth.models import Role
|
|
30
|
+
from boneio.core.auth.store import UserStore, UserStoreError, validate_password
|
|
31
|
+
|
|
32
|
+
_LOGGER = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _prompt_password(prompt: str, username: str | None = None) -> str | None:
|
|
36
|
+
"""Ask for a password twice, with echo off.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
prompt: Text for the first prompt.
|
|
40
|
+
username: Account the password is for, so the same policy the store
|
|
41
|
+
applies is reported here rather than after the second prompt.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
The password, or None if the two entries differed, it was empty, or the
|
|
45
|
+
policy rejected it.
|
|
46
|
+
"""
|
|
47
|
+
first = getpass.getpass(f"{prompt}: ")
|
|
48
|
+
if not first:
|
|
49
|
+
print("Aborted: empty password.", file=sys.stderr)
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
validate_password(first, username)
|
|
54
|
+
except UserStoreError as err:
|
|
55
|
+
print(f"Rejected: {err}", file=sys.stderr)
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
second = getpass.getpass("Repeat password: ")
|
|
59
|
+
if first != second:
|
|
60
|
+
print("Aborted: the passwords do not match.", file=sys.stderr)
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
return first
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _warn_on_ownership(store: UserStore, config_path: Path) -> None:
|
|
67
|
+
"""Warn when the file was written as the wrong user.
|
|
68
|
+
|
|
69
|
+
Running this under ``sudo`` leaves ``users.json`` owned by root, and the
|
|
70
|
+
service — which runs as the ``boneio`` user — then cannot rewrite it. The
|
|
71
|
+
failure would only show up later, when someone changes a password from the
|
|
72
|
+
web UI and it silently fails, so it is called out here instead.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
store: The account store just written.
|
|
76
|
+
config_path: Path to config.yaml, used as the reference owner.
|
|
77
|
+
"""
|
|
78
|
+
try:
|
|
79
|
+
written_uid = store.path.stat().st_uid
|
|
80
|
+
expected_uid = config_path.stat().st_uid
|
|
81
|
+
except OSError:
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
if written_uid != expected_uid:
|
|
85
|
+
print(
|
|
86
|
+
f"WARNING: {store.path} is now owned by uid {written_uid}, but "
|
|
87
|
+
f"{config_path} belongs to uid {expected_uid}. The boneIO service "
|
|
88
|
+
f"probably cannot write it. Fix with:\n"
|
|
89
|
+
f" sudo chown {expected_uid} {store.path}",
|
|
90
|
+
file=sys.stderr,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def run_accounts_command(args: argparse.Namespace) -> int:
|
|
95
|
+
"""Execute an ``accounts`` subcommand.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
args: Parsed arguments, carrying ``accounts_action``, ``config`` and,
|
|
99
|
+
depending on the subcommand, ``username`` and ``role``.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
Process exit code.
|
|
103
|
+
"""
|
|
104
|
+
config_path = Path(args.config).expanduser()
|
|
105
|
+
if not config_path.exists():
|
|
106
|
+
print(f"No config file at {config_path}", file=sys.stderr)
|
|
107
|
+
return 1
|
|
108
|
+
|
|
109
|
+
store = UserStore.for_config_file(config_path)
|
|
110
|
+
try:
|
|
111
|
+
store.load()
|
|
112
|
+
except UserStoreError as err:
|
|
113
|
+
print(f"Cannot read the account store: {err}", file=sys.stderr)
|
|
114
|
+
return 1
|
|
115
|
+
|
|
116
|
+
action = args.accounts_action
|
|
117
|
+
|
|
118
|
+
if action == "list":
|
|
119
|
+
users = store.list_users()
|
|
120
|
+
if not users:
|
|
121
|
+
print(f"No accounts yet ({store.path} does not exist).")
|
|
122
|
+
print("Create one with: boneio accounts add <username> --role admin")
|
|
123
|
+
return 0
|
|
124
|
+
width = max(len(user.username) for user in users)
|
|
125
|
+
for user in users:
|
|
126
|
+
print(f"{user.username:<{width}} {user.role} created {user.created_at}")
|
|
127
|
+
return 0
|
|
128
|
+
|
|
129
|
+
if action == "add":
|
|
130
|
+
password = _prompt_password(
|
|
131
|
+
f"New password for '{args.username}'", args.username
|
|
132
|
+
)
|
|
133
|
+
if password is None:
|
|
134
|
+
return 1
|
|
135
|
+
try:
|
|
136
|
+
user = store.add_user(args.username, password, Role(args.role))
|
|
137
|
+
except UserStoreError as err:
|
|
138
|
+
print(f"Could not create the account: {err}", file=sys.stderr)
|
|
139
|
+
return 1
|
|
140
|
+
_warn_on_ownership(store, config_path)
|
|
141
|
+
print(f"Created {user.role} account '{user.username}'.")
|
|
142
|
+
return 0
|
|
143
|
+
|
|
144
|
+
if action == "reset":
|
|
145
|
+
if store.get_user(args.username) is None:
|
|
146
|
+
print(f"No such account: {args.username}", file=sys.stderr)
|
|
147
|
+
return 1
|
|
148
|
+
password = _prompt_password(
|
|
149
|
+
f"New password for '{args.username}'", args.username
|
|
150
|
+
)
|
|
151
|
+
if password is None:
|
|
152
|
+
return 1
|
|
153
|
+
try:
|
|
154
|
+
store.set_password(args.username, password)
|
|
155
|
+
except UserStoreError as err:
|
|
156
|
+
print(f"Could not change the password: {err}", file=sys.stderr)
|
|
157
|
+
return 1
|
|
158
|
+
_warn_on_ownership(store, config_path)
|
|
159
|
+
print(f"Password changed for '{args.username}'. It takes effect immediately.")
|
|
160
|
+
return 0
|
|
161
|
+
|
|
162
|
+
if action == "delete":
|
|
163
|
+
try:
|
|
164
|
+
store.delete_user(args.username)
|
|
165
|
+
except UserStoreError as err:
|
|
166
|
+
print(f"Could not delete the account: {err}", file=sys.stderr)
|
|
167
|
+
return 1
|
|
168
|
+
print(f"Deleted account '{args.username}'.")
|
|
169
|
+
return 0
|
|
170
|
+
|
|
171
|
+
print(f"Unknown accounts action: {action}", file=sys.stderr)
|
|
172
|
+
return 1
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def add_accounts_parser(subparsers: argparse._SubParsersAction) -> None:
|
|
176
|
+
"""Register the ``accounts`` subcommand.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
subparsers: The top-level subparser collection from bonecli.
|
|
180
|
+
"""
|
|
181
|
+
accounts_parser = subparsers.add_parser(
|
|
182
|
+
"accounts",
|
|
183
|
+
help="Manage web UI accounts (create, reset a password, list, delete)",
|
|
184
|
+
description=(
|
|
185
|
+
"Manage the accounts in users.json. This is the recovery path when "
|
|
186
|
+
"an administrator password is lost, and the way to provision a "
|
|
187
|
+
"device without a browser. Passwords are always prompted for, "
|
|
188
|
+
"never passed as arguments."
|
|
189
|
+
),
|
|
190
|
+
)
|
|
191
|
+
# bonecli's main() reads args.debug before dispatching, so every subcommand
|
|
192
|
+
# has to carry one.
|
|
193
|
+
accounts_parser.set_defaults(debug=0)
|
|
194
|
+
accounts_parser.add_argument(
|
|
195
|
+
"-c",
|
|
196
|
+
"--config",
|
|
197
|
+
metavar="path_to_config",
|
|
198
|
+
default=os.environ.get("BONEIO_CONFIG", "./config.yaml"),
|
|
199
|
+
help="boneIO config file; users.json lives next to it",
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
actions = accounts_parser.add_subparsers(dest="accounts_action", required=True)
|
|
203
|
+
|
|
204
|
+
def _with_config(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
|
|
205
|
+
"""Accept -c after the subcommand as well as before it.
|
|
206
|
+
|
|
207
|
+
argparse only looks for an option on the parser that is parsing at the
|
|
208
|
+
time, so `accounts add pawel -c cfg.yaml` — the order everyone reaches
|
|
209
|
+
for — is rejected unless each action accepts it too. SUPPRESS keeps the
|
|
210
|
+
action's default from overwriting a value already given to `accounts`.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
parser: Action subparser to extend.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
The same parser, for chaining.
|
|
217
|
+
"""
|
|
218
|
+
parser.add_argument(
|
|
219
|
+
"-c",
|
|
220
|
+
"--config",
|
|
221
|
+
metavar="path_to_config",
|
|
222
|
+
default=argparse.SUPPRESS,
|
|
223
|
+
help="boneIO config file; users.json lives next to it",
|
|
224
|
+
)
|
|
225
|
+
return parser
|
|
226
|
+
|
|
227
|
+
_with_config(actions.add_parser("list", help="List accounts and their roles"))
|
|
228
|
+
|
|
229
|
+
add_action = _with_config(actions.add_parser("add", help="Create an account"))
|
|
230
|
+
add_action.add_argument("username", help="Username to create")
|
|
231
|
+
add_action.add_argument(
|
|
232
|
+
"--role",
|
|
233
|
+
choices=[str(Role.ADMIN), str(Role.VIEWER)],
|
|
234
|
+
default=str(Role.VIEWER),
|
|
235
|
+
help="Role to grant (default: viewer)",
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
reset_action = _with_config(actions.add_parser("reset", help="Set a new password"))
|
|
239
|
+
reset_action.add_argument("username", help="Account to change")
|
|
240
|
+
|
|
241
|
+
delete_action = _with_config(actions.add_parser("delete", help="Remove an account"))
|
|
242
|
+
delete_action.add_argument("username", help="Account to remove")
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Password hashing for boneIO web accounts.
|
|
2
|
+
|
|
3
|
+
Uses scrypt from the standard library, so no new dependency is pulled onto the
|
|
4
|
+
BeagleBone. Parameters live inside the encoded string, which means the cost can
|
|
5
|
+
be raised in a later release without invalidating existing accounts: verify
|
|
6
|
+
still reads the old parameters, and :func:`needs_rehash` tells the caller the
|
|
7
|
+
stored hash is below the current policy so it can be upgraded on next login.
|
|
8
|
+
|
|
9
|
+
The encoding is PHC-inspired and self-describing::
|
|
10
|
+
|
|
11
|
+
$scrypt$n=16384,r=8,p=1$<salt-b64>$<hash-b64>
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import base64
|
|
17
|
+
import hashlib
|
|
18
|
+
import hmac
|
|
19
|
+
import secrets
|
|
20
|
+
|
|
21
|
+
# Cost parameters. n=2**14 with r=8 needs 128 * n * r = 16 MiB of memory per
|
|
22
|
+
# hash. Measured at ~0.9 s per hash on a BeagleBone Black (armv7l) — slow enough
|
|
23
|
+
# to hurt an offline cracker, and only paid at login: a successful login issues
|
|
24
|
+
# a JWT good for weeks (see TOKEN_TTL_DAYS), so the cost is not on the hot path.
|
|
25
|
+
_SCRYPT_N = 2**14
|
|
26
|
+
_SCRYPT_R = 8
|
|
27
|
+
_SCRYPT_P = 1
|
|
28
|
+
_SALT_BYTES = 16
|
|
29
|
+
_KEY_BYTES = 32
|
|
30
|
+
|
|
31
|
+
_PREFIX = "$scrypt$"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _b64(raw: bytes) -> str:
|
|
35
|
+
"""Encode without padding, so the '=' never collides with the k=v syntax."""
|
|
36
|
+
return base64.b64encode(raw).decode("ascii").rstrip("=")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _unb64(text: str) -> bytes:
|
|
40
|
+
"""Decode a padding-stripped base64 string."""
|
|
41
|
+
return base64.b64decode(text + "=" * (-len(text) % 4))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def hash_password(password: str) -> str:
|
|
45
|
+
"""Hash a password with a fresh random salt.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
password: Plain-text password.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Self-describing encoded hash, safe to store as-is.
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ValueError: If the password is empty.
|
|
55
|
+
"""
|
|
56
|
+
if not password:
|
|
57
|
+
raise ValueError("Password must not be empty")
|
|
58
|
+
|
|
59
|
+
salt = secrets.token_bytes(_SALT_BYTES)
|
|
60
|
+
derived = hashlib.scrypt(
|
|
61
|
+
password.encode("utf-8"),
|
|
62
|
+
salt=salt,
|
|
63
|
+
n=_SCRYPT_N,
|
|
64
|
+
r=_SCRYPT_R,
|
|
65
|
+
p=_SCRYPT_P,
|
|
66
|
+
dklen=_KEY_BYTES,
|
|
67
|
+
maxmem=_maxmem(_SCRYPT_N, _SCRYPT_R, _SCRYPT_P),
|
|
68
|
+
)
|
|
69
|
+
params = f"n={_SCRYPT_N},r={_SCRYPT_R},p={_SCRYPT_P}"
|
|
70
|
+
return f"{_PREFIX}{params}${_b64(salt)}${_b64(derived)}"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _maxmem(n: int, r: int, p: int) -> int:
|
|
74
|
+
"""Memory ceiling for :func:`hashlib.scrypt`.
|
|
75
|
+
|
|
76
|
+
OpenSSL defaults to a 32 MiB ceiling and refuses anything above it, so the
|
|
77
|
+
limit is computed from the parameters instead of hardcoded — otherwise
|
|
78
|
+
raising the cost in a later release would fail at runtime rather than in a
|
|
79
|
+
test. The formula is scrypt's own footprint plus headroom for the internal
|
|
80
|
+
buffers.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
n: CPU/memory cost.
|
|
84
|
+
r: Block size.
|
|
85
|
+
p: Parallelisation.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Byte ceiling to hand to :func:`hashlib.scrypt`.
|
|
89
|
+
"""
|
|
90
|
+
return 128 * n * r + 128 * r * p + (1 << 20)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _parse(encoded: str) -> tuple[dict[str, int], bytes, bytes]:
|
|
94
|
+
"""Split an encoded hash into its parameters, salt and digest.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
encoded: String produced by :func:`hash_password`.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Tuple of (parameters, salt, digest).
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
ValueError: If the string is not a well-formed scrypt hash.
|
|
104
|
+
"""
|
|
105
|
+
if not encoded.startswith(_PREFIX):
|
|
106
|
+
raise ValueError("Unsupported password hash format")
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
_, algo, params_text, salt_text, hash_text = encoded.split("$")
|
|
110
|
+
except ValueError as err:
|
|
111
|
+
raise ValueError("Malformed password hash") from err
|
|
112
|
+
|
|
113
|
+
if algo != "scrypt":
|
|
114
|
+
raise ValueError(f"Unsupported password hash algorithm: {algo}")
|
|
115
|
+
|
|
116
|
+
params: dict[str, int] = {}
|
|
117
|
+
for item in params_text.split(","):
|
|
118
|
+
key, _, value = item.partition("=")
|
|
119
|
+
try:
|
|
120
|
+
params[key] = int(value)
|
|
121
|
+
except ValueError as err:
|
|
122
|
+
raise ValueError(f"Malformed hash parameter: {item}") from err
|
|
123
|
+
|
|
124
|
+
if not {"n", "r", "p"} <= params.keys():
|
|
125
|
+
raise ValueError("Password hash is missing scrypt parameters")
|
|
126
|
+
|
|
127
|
+
return params, _unb64(salt_text), _unb64(hash_text)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def verify_password(password: str, encoded: str) -> bool:
|
|
131
|
+
"""Check a password against a stored hash in constant time.
|
|
132
|
+
|
|
133
|
+
A malformed or unreadable stored hash is treated as a failed verification
|
|
134
|
+
rather than an error: a corrupted ``users.json`` entry must lock that
|
|
135
|
+
account out, not crash the login route for everyone.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
password: Plain-text password supplied by the client.
|
|
139
|
+
encoded: Stored hash to check against.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
True if the password matches.
|
|
143
|
+
"""
|
|
144
|
+
if not password or not encoded:
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
try:
|
|
148
|
+
params, salt, expected = _parse(encoded)
|
|
149
|
+
derived = hashlib.scrypt(
|
|
150
|
+
password.encode("utf-8"),
|
|
151
|
+
salt=salt,
|
|
152
|
+
n=params["n"],
|
|
153
|
+
r=params["r"],
|
|
154
|
+
p=params["p"],
|
|
155
|
+
dklen=len(expected),
|
|
156
|
+
maxmem=_maxmem(params["n"], params["r"], params["p"]),
|
|
157
|
+
)
|
|
158
|
+
except (ValueError, KeyError, TypeError):
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
return hmac.compare_digest(derived, expected)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def needs_rehash(encoded: str) -> bool:
|
|
165
|
+
"""Report whether a stored hash is weaker than the current policy.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
encoded: Stored hash.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
True if the hash should be replaced next time the password is known.
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
params, _, _ = _parse(encoded)
|
|
175
|
+
except ValueError:
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
params["n"] < _SCRYPT_N
|
|
180
|
+
or params["r"] < _SCRYPT_R
|
|
181
|
+
or params["p"] < _SCRYPT_P
|
|
182
|
+
)
|