boneio 1.6.0.dev22__tar.gz → 1.6.0.dev24__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.dev22/boneio.egg-info → boneio-1.6.0.dev24}/PKG-INFO +1 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/binary_sensor.py +9 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/remote/base.py +11 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/remote/mqtt.py +14 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/models.py +66 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/store.py +87 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/registration.py +4 -4
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/secret_masking.py +3 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/containers.py +12 -13
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/inputs.py +19 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/manager.py +6 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/remote_input_registrar.py +1 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/security_alert.py +28 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/basic.py +16 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/composite.py +8 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/local.py +12 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/lox.py +8 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/mqtt.py +23 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/net/discovery_guard.py +8 -9
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/security/posture.py +11 -6
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/system_ops.py +19 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/input/manager.py +3 -2
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/integration/homeassistant.py +34 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/MANIFEST.sha256 +4 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/helpers/boneio-system +204 -12
- boneio-1.6.0.dev24/boneio/migrations/assets/motd/20-boneio +158 -0
- boneio-1.6.0.dev24/boneio/migrations/assets/sshd/20-boneio-banner.conf +6 -0
- boneio-1.6.0.dev24/boneio/migrations/assets/sshd/boneio-banner +2 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.17.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.17.sig +0 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.18.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.18.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.22.json +1 -1
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.22.sig +0 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.26.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.26.sig +0 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.27.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.27.sig +0 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.28.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.28.sig +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.29.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.29.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.5.json +1 -1
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.5.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.8.json +1 -1
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.8.sig +0 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.9.json +1 -0
- boneio-1.6.0.dev24/boneio/migrations/plans/1.6.9.sig +1 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev24/boneio/migrations/plans/manifest.sig +1 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/runner.py +10 -5
- boneio-1.6.0.dev24/boneio/migrations/versions/v1_6_28_ssh_login_screen.py +102 -0
- boneio-1.6.0.dev24/boneio/migrations/versions/v1_6_29_service_password_change.py +61 -0
- boneio-1.6.0.dev24/boneio/version.py +2 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/app.py +13 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/bind.py +25 -0
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/AccountsView-DzMzR689.js +1 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/AppInitContext-BL616lQR.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/AppInitContext-COhrck8P.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/BackupSection-Dsjck3YU.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/BackupSection-CpB1zH1A.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/BindingMatrix-CM0nlDNk.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/BindingMatrix-Cr_r5j_J.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/DeviceControlSection-p-vfKyn_.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/DeviceControlSection-CSFxkNJ3.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/DiagnosticsView-q_pysQ5c.js +5 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/EntityGrid-CuU32z0i.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/EntityGrid-DTXYymFp.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/FactoryResetSection-0-n-q7hL.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/FactoryResetSection-C9Ic1Gul.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/FormInputToggle-Dibs4Ze4.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/FormInputToggle-DUuZpcH7.js +2 -2
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/HaDashboardWizard-DdH70_zV.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/HaDashboardWizard-CsuzHfak.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/HostnameSection-Cr8XthQe.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/HostnameSection-CPlIs7a2.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/InputsView-DnSIYZyL.js +1 -0
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/LocationSection-DQC6bRTq.js +2 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/LoggerForm-CJHoif6x.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/LoggerForm-CaCSkc4Y.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/LongPressWrapper-CZxppyE5.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/LongPressWrapper-BGI4Mfep.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/MigrationsSection-BvnXC_Bu.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/MigrationsSection-B57JM6UN.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/ModbusView-CHhPZ0Qn.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/ModbusView-DaenSnn0.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BntHkRCp.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/MqttPasswordsSection-Nz6n93FV.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/NodeRedManagement-4v-7oU8t.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/NodeRedManagement-CILkUr5g.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/NodeRedView-CtAdqW4R.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/NodeRedView-DD4OSonB.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/NumericInput-DNZTgusN.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/NumericInput-Cw4ZtDAj.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/OutputsView-CDQCgACY.js +1 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/SecurityView-DaVxDa7A.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/SecurityView-BrON2LgE.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/SensorView-Dwbxn7dc.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/SensorView-ef6JhhwM.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/Sparkline-DbzEbKjI.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/Sparkline-BFRz293c.js +2 -2
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/SystemState-DZbieWdN.js +2 -0
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/TemplatesView-Bvf8jtAd.js +1 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/TilePicker-wCRR-95S.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/TilePicker-isXeI1rD.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/TimezoneSection-4WrA4QVx.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/TimezoneSection-KLsjH2rG.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/UISettings-B6Gmcue6.js +100 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-DqgegOrx.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-B0XQXR7H.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/ViewToggle-WmyFZWEj.js +1 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/aiConfig-BG8fc2KC.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/aiConfig-CXA_ucVM.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/aiWizardPrompt-gdQBmsHK.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/aiWizardPrompt-Il_YU72f.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/axios-DJBeJS4R.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/axios-DulIOGd1.js +4 -4
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/bodies-CjF4pwp7.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/bodies-U_fokrs3.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/configCache-BS98BpF9.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/configCache-CPKXFBoa.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/dialog-Dyh6AFFV.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/dialog-CkWtsgYG.js +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/fa-i12cJwlu.js +1 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/gi-BPK6jryY.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/gi-BK6tS-OO.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/index-COqAjAHR.css → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/index-ppSEa9nm.css +1 -1
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/index-v3pbw5Yp.js +42 -0
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/monaco-B_5BWTJG.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/monaco-Ceuxyn8H.js +3 -3
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/monaco-Dnjb8Zxh.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/monaco-za8ZSaP0.js +1 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/select-yXAsrSOf.js → boneio-1.6.0.dev24/boneio/webui/frontend-dist/assets/select-DsR6_rF9.js +1 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/index.html +7 -7
- boneio-1.6.0.dev24/boneio/webui/frontend-dist/sw.js +1 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/middleware/auth.py +210 -35
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/middleware/csrf.py +5 -6
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/middleware/policy.py +72 -0
- boneio-1.6.0.dev24/boneio/webui/middleware/proxy.py +112 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/rate_limit.py +2 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/app.py +2 -2
- boneio-1.6.0.dev24/boneio/webui/routes/accounts.py +466 -0
- boneio-1.6.0.dev24/boneio/webui/routes/auth.py +356 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config_core.py +3 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/mqtt_reference.py +8 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/nodered.py +1 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/onboarding.py +3 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/remote_devices.py +6 -6
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/security.py +6 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/system.py +5 -7
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/update.py +13 -6
- boneio-1.6.0.dev24/boneio/webui/security_events.py +104 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/security_headers.py +2 -3
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/websocket_manager.py +13 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio.egg-info/SOURCES.txt +56 -45
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.17.json +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.17.sig +0 -2
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.18.json +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.18.sig +0 -2
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.22.sig +0 -0
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.26.json +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.26.sig +0 -2
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.27.json +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.27.sig +0 -2
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.5.sig +0 -0
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.8.sig +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.9.json +0 -1
- boneio-1.6.0.dev22/boneio/migrations/plans/1.6.9.sig +0 -0
- boneio-1.6.0.dev22/boneio/migrations/plans/manifest.sig +0 -0
- boneio-1.6.0.dev22/boneio/version.py +0 -2
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/AccountsView-DrYCKrnn.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/DiagnosticsView-BusyzwzV.js +0 -5
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/InputsView-COvuriaS.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/LocationSection-Bs9uyL64.js +0 -2
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/OutputsView-dhaCBScV.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/SystemState-B25n_1RT.js +0 -2
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/TemplatesView-BkWBNuBt.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/UISettings-6-YfhSfU.js +0 -100
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/ViewToggle-B-Y9KKFZ.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/fa-BhM0fApf.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/assets/index-0xWkEPA0.js +0 -42
- boneio-1.6.0.dev22/boneio/webui/frontend-dist/sw.js +0 -1
- boneio-1.6.0.dev22/boneio/webui/routes/accounts.py +0 -272
- boneio-1.6.0.dev22/boneio/webui/routes/auth.py +0 -134
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/LICENSE +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/README.md +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/input.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/output_cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/boards/1.1/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/components/virtual_switch.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/const.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/atomic_file.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/jwt_secret.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v6_input_keys.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/migrations/v7_mqtt_password_secret.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/provenance.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/write_lock.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/scheduler.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/sun.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/manager/virtual_switches.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/recovery.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/security/certificate.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/sensor/sun.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/naming.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/sun.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/hardware/udev_wait.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/actions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/apt/52boneio-periodic +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/apt/52boneio-unattended +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/helpers/boneio-migrate-v2 +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/issue.d/10-boneio.issue +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/journald/boneio-console.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/boneio-dpkg-recover.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/apt-daily-priority.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.0.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.0.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.0.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.0.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.10.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.10.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.11.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.11.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.12.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.12.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.13.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.13.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.14.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.14.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.15.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.15.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.16.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.16.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.19.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.19.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.20.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.20.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.21.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.21.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.23.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.23.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.24.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.24.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.25.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.25.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_11_drop_docker_group.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_12_console_shows_ip.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_13_custom_certificate.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_14_certificate_lifetime.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_15_web_port_reaches_caddy.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_16_release_floor_ordering.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_17_service_password.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_18_os_updates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_19_helper_apt_purge.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_20_drop_packagekit.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_21_caddy_pinned.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_22_security_autoupdates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_23_helper_fstab_options.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_24_boot_partition_nofail.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_25_journal_to_serial_console.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_26_kernel_check_old_images.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_27_startup_overlay_repair.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_5_trust_transition.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/migrations/versions/v1_6_9_ntp_servers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/runner.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/condition.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/schema.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/action_validation.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/formatters-Cc0QIRxb.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/rolldown-runtime-hePW80VL.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/server.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/static/index.html +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/static/recovery.css +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/recovery/static/recovery.js +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/os_update.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/schedule.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/sun.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/pyproject.toml +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/setup.cfg +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/setup.py +0 -0
- {boneio-1.6.0.dev22 → boneio-1.6.0.dev24}/tests/test_py313_compatibility.py +0 -0
|
@@ -131,6 +131,15 @@ class GpioInputBinarySensor(GpioBaseClass):
|
|
|
131
131
|
"""Send initial state after setup."""
|
|
132
132
|
self.send_current_state()
|
|
133
133
|
|
|
134
|
+
def send_current_state_when_ready(self) -> None:
|
|
135
|
+
"""Send the current state now, or as soon as the GPIO manager starts.
|
|
136
|
+
|
|
137
|
+
Before start the pin cannot be read, and ``read_value`` answers False —
|
|
138
|
+
which a non-inverted input reports as ``pressed``. Publishing that would
|
|
139
|
+
put a wrong state on a retained topic.
|
|
140
|
+
"""
|
|
141
|
+
get_gpio_manager(loop=self._loop).register_on_start_callback(self.send_current_state)
|
|
142
|
+
|
|
134
143
|
def send_current_state(self) -> None:
|
|
135
144
|
"""Send current state to MQTT without triggering actions.
|
|
136
145
|
|
|
@@ -137,7 +137,7 @@ class RemoteInputBase:
|
|
|
137
137
|
# Helpers for subclasses
|
|
138
138
|
# ------------------------------------------------------------------
|
|
139
139
|
|
|
140
|
-
def _handle_binary_state_change(self, new_state: bool) -> None:
|
|
140
|
+
def _handle_binary_state_change(self, new_state: bool, publish_only: bool = False) -> None:
|
|
141
141
|
"""Process a state change in binary_sensor mode.
|
|
142
142
|
|
|
143
143
|
Emits ``pressed`` or ``released`` directly to EventBus.
|
|
@@ -146,10 +146,14 @@ class RemoteInputBase:
|
|
|
146
146
|
|
|
147
147
|
Args:
|
|
148
148
|
new_state: ``True`` if the sensor is now active/on.
|
|
149
|
+
publish_only: Take the state without running actions — for a state
|
|
150
|
+
learnt rather than seen changing, e.g. a retained replay.
|
|
149
151
|
"""
|
|
150
152
|
self._state = new_state
|
|
151
153
|
click_type = PRESSED if new_state else RELEASED
|
|
152
|
-
self.press_callback(
|
|
154
|
+
self.press_callback(
|
|
155
|
+
click_type=click_type, duration=None, start_time=time.time(), publish_only=publish_only
|
|
156
|
+
)
|
|
153
157
|
|
|
154
158
|
def _feed_detector(self, is_pressed: bool) -> None:
|
|
155
159
|
"""Feed a state change into the MultiClickDetector (event mode).
|
|
@@ -189,6 +193,7 @@ class RemoteInputBase:
|
|
|
189
193
|
click_type: ClickTypes,
|
|
190
194
|
duration: float | None = None,
|
|
191
195
|
start_time: float | None = None,
|
|
196
|
+
publish_only: bool = False,
|
|
192
197
|
) -> None:
|
|
193
198
|
"""Schedule async event processing.
|
|
194
199
|
|
|
@@ -196,14 +201,16 @@ class RemoteInputBase:
|
|
|
196
201
|
click_type: Type of click.
|
|
197
202
|
duration: Duration of the press in seconds.
|
|
198
203
|
start_time: Start time of the press.
|
|
204
|
+
publish_only: Publish the state, run no actions.
|
|
199
205
|
"""
|
|
200
|
-
asyncio.create_task(self._handle_press_with_lock(click_type, duration, start_time))
|
|
206
|
+
asyncio.create_task(self._handle_press_with_lock(click_type, duration, start_time, publish_only))
|
|
201
207
|
|
|
202
208
|
async def _handle_press_with_lock(
|
|
203
209
|
self,
|
|
204
210
|
click_type: ClickTypes,
|
|
205
211
|
duration: float | None = None,
|
|
206
212
|
start_time: float | None = None,
|
|
213
|
+
publish_only: bool = False,
|
|
207
214
|
) -> None:
|
|
208
215
|
"""Emit InputEvent on EventBus (serialised with lock)."""
|
|
209
216
|
async with self._event_lock:
|
|
@@ -232,6 +239,7 @@ class RemoteInputBase:
|
|
|
232
239
|
click_type=click_type,
|
|
233
240
|
duration=duration,
|
|
234
241
|
state=event_state,
|
|
242
|
+
publish_only=publish_only,
|
|
235
243
|
)
|
|
236
244
|
)
|
|
237
245
|
|
|
@@ -98,7 +98,7 @@ class MqttBinarySensorInput(RemoteInputBase):
|
|
|
98
98
|
return False
|
|
99
99
|
return None
|
|
100
100
|
|
|
101
|
-
async def on_mqtt_message(self, _topic: str, payload: str) -> None:
|
|
101
|
+
async def on_mqtt_message(self, _topic: str, payload: str, retained: bool = False) -> None:
|
|
102
102
|
"""Handle a message on the subscribed topic.
|
|
103
103
|
|
|
104
104
|
Two payload shapes are understood. A plain on/off state is the usual
|
|
@@ -107,12 +107,24 @@ class MqttBinarySensorInput(RemoteInputBase):
|
|
|
107
107
|
mode it is passed through as-is rather than re-derived from a state
|
|
108
108
|
this side never saw.
|
|
109
109
|
|
|
110
|
+
A retained message is the broker replaying what it stored, on every
|
|
111
|
+
subscribe — so on every reconnect. It says what the state *is*, not
|
|
112
|
+
that it just changed: binary_sensor mode takes it without running
|
|
113
|
+
actions, and event mode ignores it, because a lone ``pressed`` with no
|
|
114
|
+
release would turn into a long press.
|
|
115
|
+
|
|
110
116
|
Args:
|
|
111
117
|
_topic: The topic it arrived on; unused, one subscription per input.
|
|
112
118
|
payload: The message.
|
|
119
|
+
retained: The broker is replaying its stored copy, not forwarding
|
|
120
|
+
a live message.
|
|
113
121
|
"""
|
|
114
122
|
text = (payload or "").strip()
|
|
115
123
|
|
|
124
|
+
if retained and self._mode == "event":
|
|
125
|
+
_LOGGER.debug("Input %s: ignoring retained message in event mode", self.id)
|
|
126
|
+
return
|
|
127
|
+
|
|
116
128
|
if text.startswith("{"):
|
|
117
129
|
try:
|
|
118
130
|
event_type = json.loads(text).get("event_type")
|
|
@@ -145,4 +157,4 @@ class MqttBinarySensorInput(RemoteInputBase):
|
|
|
145
157
|
if self._mode == "event":
|
|
146
158
|
self._feed_detector(is_pressed=state)
|
|
147
159
|
else:
|
|
148
|
-
self._handle_binary_state_change(state)
|
|
160
|
+
self._handle_binary_state_change(state, publish_only=retained)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from dataclasses import dataclass
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
6
|
from datetime import UTC, datetime
|
|
7
7
|
from enum import StrEnum
|
|
8
8
|
|
|
@@ -37,6 +37,18 @@ class User:
|
|
|
37
37
|
role: Role = Role.ADMIN
|
|
38
38
|
created_at: str = ""
|
|
39
39
|
updated_at: str = ""
|
|
40
|
+
# Bumped whenever the password changes. Login tokens carry the value they
|
|
41
|
+
# were issued under, and one that no longer matches is refused, which is
|
|
42
|
+
# how a password change signs every other session out.
|
|
43
|
+
session_version: int = 0
|
|
44
|
+
# Single browser sessions cut off after too many wrong passwords, as
|
|
45
|
+
# session id → the unix time its token expires, after which the entry is
|
|
46
|
+
# pointless and gets pruned.
|
|
47
|
+
revoked_sessions: dict[str, int] = field(default_factory=dict)
|
|
48
|
+
# Wrong passwords typed per session while it was signed in, as session id
|
|
49
|
+
# → {"count": n, "until": token expiry}. Kept here, not in memory, so a
|
|
50
|
+
# restart does not hand a guessing session a fresh allowance.
|
|
51
|
+
session_failures: dict[str, dict] = field(default_factory=dict)
|
|
40
52
|
|
|
41
53
|
def to_dict(self) -> dict:
|
|
42
54
|
"""Serialise for ``users.json``.
|
|
@@ -50,6 +62,9 @@ class User:
|
|
|
50
62
|
"role": str(self.role),
|
|
51
63
|
"created_at": self.created_at,
|
|
52
64
|
"updated_at": self.updated_at,
|
|
65
|
+
"session_version": self.session_version,
|
|
66
|
+
"revoked_sessions": dict(self.revoked_sessions),
|
|
67
|
+
"session_failures": {k: dict(v) for k, v in self.session_failures.items()},
|
|
53
68
|
}
|
|
54
69
|
|
|
55
70
|
@classmethod
|
|
@@ -79,12 +94,22 @@ class User:
|
|
|
79
94
|
except ValueError:
|
|
80
95
|
role = Role.VIEWER
|
|
81
96
|
|
|
97
|
+
# Absent in every users.json written before 1.6.0.dev23, and those
|
|
98
|
+
# accounts' tokens carry no version either: both read as 0.
|
|
99
|
+
try:
|
|
100
|
+
session_version = int(raw.get("session_version", 0))
|
|
101
|
+
except (TypeError, ValueError):
|
|
102
|
+
session_version = 0
|
|
103
|
+
|
|
82
104
|
return cls(
|
|
105
|
+
revoked_sessions=_int_map(raw.get("revoked_sessions")),
|
|
106
|
+
session_failures=_failure_map(raw.get("session_failures")),
|
|
83
107
|
username=username,
|
|
84
108
|
password_hash=password_hash,
|
|
85
109
|
role=role,
|
|
86
110
|
created_at=str(raw.get("created_at", "")),
|
|
87
111
|
updated_at=str(raw.get("updated_at", "")),
|
|
112
|
+
session_version=session_version,
|
|
88
113
|
)
|
|
89
114
|
|
|
90
115
|
def to_public_dict(self) -> dict:
|
|
@@ -99,3 +124,43 @@ class User:
|
|
|
99
124
|
"created_at": self.created_at,
|
|
100
125
|
"updated_at": self.updated_at,
|
|
101
126
|
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _int_map(raw) -> dict[str, int]:
|
|
130
|
+
"""Read a ``{str: int}`` map from users.json, dropping what does not fit.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
raw: Whatever the file holds under the key.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
The well-formed entries.
|
|
137
|
+
"""
|
|
138
|
+
if not isinstance(raw, dict):
|
|
139
|
+
return {}
|
|
140
|
+
out: dict[str, int] = {}
|
|
141
|
+
for key, value in raw.items():
|
|
142
|
+
if isinstance(key, str) and isinstance(value, int) and not isinstance(value, bool):
|
|
143
|
+
out[key] = value
|
|
144
|
+
return out
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _failure_map(raw) -> dict[str, dict]:
|
|
148
|
+
"""Read the per-session failure counts, dropping what does not fit.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
raw: Whatever the file holds under the key.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
``{session_id: {"count": int, "until": int}}`` for the entries that
|
|
155
|
+
have both.
|
|
156
|
+
"""
|
|
157
|
+
if not isinstance(raw, dict):
|
|
158
|
+
return {}
|
|
159
|
+
out: dict[str, dict] = {}
|
|
160
|
+
for key, value in raw.items():
|
|
161
|
+
if not isinstance(key, str) or not isinstance(value, dict):
|
|
162
|
+
continue
|
|
163
|
+
count, until = value.get("count"), value.get("until")
|
|
164
|
+
if all(isinstance(v, int) and not isinstance(v, bool) for v in (count, until)):
|
|
165
|
+
out[key] = {"count": count, "until": until}
|
|
166
|
+
return out
|
|
@@ -18,6 +18,7 @@ import logging
|
|
|
18
18
|
import os
|
|
19
19
|
import tempfile
|
|
20
20
|
import threading
|
|
21
|
+
import time
|
|
21
22
|
from pathlib import Path
|
|
22
23
|
|
|
23
24
|
from boneio.core.auth.hashing import hash_password, verify_password
|
|
@@ -390,7 +391,11 @@ class UserStore:
|
|
|
390
391
|
return user
|
|
391
392
|
|
|
392
393
|
def set_password(self, username: str, password: str) -> User:
|
|
393
|
-
"""Replace an account's password.
|
|
394
|
+
"""Replace an account's password and revoke its sessions.
|
|
395
|
+
|
|
396
|
+
Every token issued before the change stops being honoured; the caller
|
|
397
|
+
that made the change has to be handed a fresh one if it is to stay
|
|
398
|
+
signed in.
|
|
394
399
|
|
|
395
400
|
Args:
|
|
396
401
|
username: Account to change.
|
|
@@ -413,11 +418,79 @@ class UserStore:
|
|
|
413
418
|
raise UserStoreError(f"No such account: {username}")
|
|
414
419
|
user.password_hash = hash_password(password)
|
|
415
420
|
user.updated_at = utc_now()
|
|
421
|
+
# Signs out every session opened with the old password, the
|
|
422
|
+
# stolen one being the point.
|
|
423
|
+
user.session_version += 1
|
|
416
424
|
self._save()
|
|
417
425
|
|
|
418
426
|
_LOGGER.info("Password changed for account '%s'", user.username)
|
|
419
427
|
return user
|
|
420
428
|
|
|
429
|
+
def record_session_failure(self, username: str, session_id: str, until: int) -> int:
|
|
430
|
+
"""Count a wrong password typed by one signed-in session.
|
|
431
|
+
|
|
432
|
+
Cumulative for the life of the session, not a sliding window: a window
|
|
433
|
+
lets a patient guesser stay under it forever, a few tries at a time.
|
|
434
|
+
The count goes when the password is typed right or the token expires.
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
username: Account the session belongs to.
|
|
438
|
+
session_id: The session (see middleware.auth.session_id_of).
|
|
439
|
+
until: Unix time the session's token expires.
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
The session's count after this one, or 0 if the account is gone.
|
|
443
|
+
"""
|
|
444
|
+
self._ensure_loaded()
|
|
445
|
+
key = normalize_username(username)
|
|
446
|
+
with self._lock:
|
|
447
|
+
user = self._users.get(key)
|
|
448
|
+
if user is None:
|
|
449
|
+
return 0
|
|
450
|
+
_prune(user)
|
|
451
|
+
entry = user.session_failures.get(session_id, {"count": 0, "until": until})
|
|
452
|
+
entry = {"count": entry["count"] + 1, "until": max(entry["until"], until)}
|
|
453
|
+
user.session_failures[session_id] = entry
|
|
454
|
+
self._save()
|
|
455
|
+
return entry["count"]
|
|
456
|
+
|
|
457
|
+
def clear_session_failures(self, username: str, session_id: str) -> None:
|
|
458
|
+
"""Forget a session's wrong passwords once it has typed the right one.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
username: Account the session belongs to.
|
|
462
|
+
session_id: The session.
|
|
463
|
+
"""
|
|
464
|
+
self._ensure_loaded()
|
|
465
|
+
key = normalize_username(username)
|
|
466
|
+
with self._lock:
|
|
467
|
+
user = self._users.get(key)
|
|
468
|
+
if user is None or session_id not in user.session_failures:
|
|
469
|
+
return
|
|
470
|
+
del user.session_failures[session_id]
|
|
471
|
+
self._save()
|
|
472
|
+
|
|
473
|
+
def revoke_session(self, username: str, session_id: str, until: int) -> None:
|
|
474
|
+
"""Sign one session out, leaving the account's other sessions alone.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
username: Account the session belongs to.
|
|
478
|
+
session_id: The session to refuse from now on.
|
|
479
|
+
until: Unix time its token expires; the entry is useless after.
|
|
480
|
+
"""
|
|
481
|
+
self._ensure_loaded()
|
|
482
|
+
key = normalize_username(username)
|
|
483
|
+
with self._lock:
|
|
484
|
+
user = self._users.get(key)
|
|
485
|
+
if user is None:
|
|
486
|
+
return
|
|
487
|
+
_prune(user)
|
|
488
|
+
user.revoked_sessions[session_id] = until
|
|
489
|
+
user.session_failures.pop(session_id, None)
|
|
490
|
+
self._save()
|
|
491
|
+
|
|
492
|
+
_LOGGER.warning("Signed out one session of '%s'", user.username)
|
|
493
|
+
|
|
421
494
|
def set_role(self, username: str, role: Role) -> User:
|
|
422
495
|
"""Change an account's role.
|
|
423
496
|
|
|
@@ -520,3 +593,16 @@ def dummy_hash() -> str:
|
|
|
520
593
|
if _DUMMY_HASH is None:
|
|
521
594
|
_DUMMY_HASH = hash_password("boneio-nonexistent-account-placeholder")
|
|
522
595
|
return _DUMMY_HASH
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _prune(user: User) -> None:
|
|
599
|
+
"""Drop session entries whose tokens have expired anyway.
|
|
600
|
+
|
|
601
|
+
Args:
|
|
602
|
+
user: Account to tidy, modified in place.
|
|
603
|
+
"""
|
|
604
|
+
now = int(time.time())
|
|
605
|
+
user.revoked_sessions = {k: v for k, v in user.revoked_sessions.items() if v > now}
|
|
606
|
+
user.session_failures = {
|
|
607
|
+
k: v for k, v in user.session_failures.items() if v["until"] > now
|
|
608
|
+
}
|
|
@@ -524,10 +524,10 @@ class CloudRegistration:
|
|
|
524
524
|
def _check_compose_ownership(self) -> bool:
|
|
525
525
|
"""Check the compose file is managed by the privileged helper.
|
|
526
526
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
527
|
+
The file must *not* be writable by the application, and no error here
|
|
528
|
+
should tell the operator to ``chown`` it: ``docker compose up`` executes
|
|
529
|
+
this file, so whoever can write it can start a container as root with
|
|
530
|
+
the host filesystem mounted.
|
|
531
531
|
|
|
532
532
|
Returns:
|
|
533
533
|
True when the cloud switch can proceed.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"""Keep configured secrets out of API responses
|
|
1
|
+
"""Keep configured secrets out of API responses.
|
|
2
2
|
|
|
3
|
-
``GET /api/config``
|
|
4
|
-
configuration, in clear text. Masking it is only half the job: the settings
|
|
3
|
+
Unmasked, ``GET /api/config`` would return the MQTT password, and any other
|
|
4
|
+
password in the configuration, in clear text. Masking it is only half the job: the settings
|
|
5
5
|
forms are populated from that same response and post the whole section back, so
|
|
6
6
|
a mask that is written straight through would overwrite the real password with
|
|
7
7
|
its own placeholder the first time anyone saved an unrelated field.
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"""Container operations, through the privileged helper when it is there.
|
|
2
2
|
|
|
3
|
-
The
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
nothing from the caller to Docker.
|
|
3
|
+
The ``boneio`` account is kept out of the ``docker`` group, because that group
|
|
4
|
+
is root-equivalent: a container can bind-mount the host root and write to it.
|
|
5
|
+
Every container operation goes through ``boneio-containers`` instead, which
|
|
6
|
+
accepts a fixed verb and passes nothing from the caller to Docker. Nothing else
|
|
7
|
+
in the application should call ``docker``; it comes through here.
|
|
9
8
|
|
|
10
9
|
Direct ``docker`` invocation stays as a fallback while the helper is not
|
|
11
|
-
installed. That is not a loophole
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
installed. That is not a loophole: a device that has not applied the
|
|
11
|
+
trust-transition migration yet still has the account in the ``docker`` group,
|
|
12
|
+
and refusing to manage its containers would break Node-RED and the TLS panel
|
|
13
|
+
for no gain. Once the helper is present it is always preferred, and once
|
|
15
14
|
the account leaves the ``docker`` group the fallback stops working on its own.
|
|
16
15
|
|
|
17
16
|
Nothing here is a security boundary. The boundary is the helper, which refuses
|
|
@@ -466,9 +465,9 @@ def set_project_env(name: str, value: str) -> bool:
|
|
|
466
465
|
the compose file, which is how the panel's own port reaches Caddy. The
|
|
467
466
|
application may write this file: the directory belongs to it. It may not
|
|
468
467
|
write the compose file beside it, which is root-owned because
|
|
469
|
-
``docker compose up`` executes it
|
|
470
|
-
|
|
471
|
-
|
|
468
|
+
``docker compose up`` executes it. Writing ``.env`` does not undo that:
|
|
469
|
+
interpolation substitutes into scalar values after the YAML is parsed, so
|
|
470
|
+
nothing passed this way can introduce a volume or an entrypoint.
|
|
472
471
|
|
|
473
472
|
Read-modify-write rather than truncate: an operator may have put their own
|
|
474
473
|
variables here, and a port change is no reason to lose them. Comments and
|
|
@@ -624,6 +624,20 @@ class InputManager:
|
|
|
624
624
|
# Global listeners will receive these events for all inputs (including new ones)
|
|
625
625
|
self._broadcast_all_input_states()
|
|
626
626
|
|
|
627
|
+
def resend_binary_sensor_states(self) -> None:
|
|
628
|
+
"""Publish the pin state of every GPIO binary sensor, MQTT only.
|
|
629
|
+
|
|
630
|
+
Called on each MQTT connect. The topics are retained, and nothing else
|
|
631
|
+
corrects the broker's copy when an input changed while boneIO was off.
|
|
632
|
+
Actions do not run: these are ``publish_only`` events.
|
|
633
|
+
"""
|
|
634
|
+
for input_ in self._inputs.values():
|
|
635
|
+
if isinstance(input_, GpioInputBinarySensor):
|
|
636
|
+
try:
|
|
637
|
+
input_.send_current_state_when_ready()
|
|
638
|
+
except Exception as e:
|
|
639
|
+
_LOGGER.debug("Error resending binary sensor state %s: %s", input_.id, e)
|
|
640
|
+
|
|
627
641
|
def _broadcast_all_input_states(self) -> None:
|
|
628
642
|
"""Broadcast current state of all inputs via WebSocket.
|
|
629
643
|
|
|
@@ -766,9 +780,14 @@ class InputManager:
|
|
|
766
780
|
elif input_type == INPUT_SENSOR:
|
|
767
781
|
payload = str(click_type) # "pressed" or "released"
|
|
768
782
|
|
|
783
|
+
# Retained: a float switch can hold one position for weeks, and
|
|
784
|
+
# without the broker's copy HA shows `unknown` after every restart
|
|
785
|
+
# until the input moves. Events above stay unretained — a click
|
|
786
|
+
# replayed on subscribe would be a click that never happened.
|
|
769
787
|
self._manager.send_message(
|
|
770
788
|
topic=topic,
|
|
771
789
|
payload=payload,
|
|
790
|
+
retain=True,
|
|
772
791
|
)
|
|
773
792
|
_LOGGER.debug("Published binary sensor state to MQTT: topic=%s, payload=%s", topic, payload)
|
|
774
793
|
|
|
@@ -618,6 +618,7 @@ class Manager:
|
|
|
618
618
|
self.send_message(
|
|
619
619
|
topic=f"{topic_prefix}/input/{input_id}",
|
|
620
620
|
payload=state,
|
|
621
|
+
retain=True,
|
|
621
622
|
)
|
|
622
623
|
except Exception as e:
|
|
623
624
|
_LOGGER.debug(
|
|
@@ -2005,6 +2006,11 @@ class Manager:
|
|
|
2005
2006
|
# trusts, and a reinstalled broker comes back with no retained set.
|
|
2006
2007
|
await self.virtual_switches.republish_states()
|
|
2007
2008
|
|
|
2009
|
+
# Binary sensors are retained, so the broker would otherwise keep
|
|
2010
|
+
# serving whatever they were before this boot, however long ago that
|
|
2011
|
+
# was. Read the pins and publish what is true now.
|
|
2012
|
+
self.inputs.resend_binary_sensor_states()
|
|
2013
|
+
|
|
2008
2014
|
_LOGGER.info(
|
|
2009
2015
|
"Resent states: %d outputs, %d covers.",
|
|
2010
2016
|
len([o for o in self.outputs.get_all_outputs().values() if o.output_type not in ("cover", "none")]),
|
|
@@ -117,7 +117,7 @@ class RemoteInputRegistrar:
|
|
|
117
117
|
for remote_input in self._mqtt_inputs:
|
|
118
118
|
try:
|
|
119
119
|
await self._manager.message_bus.subscribe_and_listen(
|
|
120
|
-
remote_input.topic, remote_input.on_mqtt_message
|
|
120
|
+
remote_input.topic, remote_input.on_mqtt_message, retain_aware=True
|
|
121
121
|
)
|
|
122
122
|
_LOGGER.debug(
|
|
123
123
|
"Remote input '%s' listening on %s",
|
|
@@ -164,8 +164,36 @@ class SecurityAlertPublisher:
|
|
|
164
164
|
# Still publish: the entity may already exist from a previous run,
|
|
165
165
|
# and a stale retained state is worse than a corrected one.
|
|
166
166
|
|
|
167
|
+
try:
|
|
168
|
+
from boneio.integration.homeassistant import ha_security_event_message
|
|
169
|
+
|
|
170
|
+
self._manager.publish_ha_discovery(
|
|
171
|
+
id="security_event",
|
|
172
|
+
ha_type="event",
|
|
173
|
+
payload=ha_security_event_message(
|
|
174
|
+
config_helper=self._manager._config_helper
|
|
175
|
+
),
|
|
176
|
+
)
|
|
177
|
+
except Exception as err: # noqa: BLE001 - discovery must not stop startup
|
|
178
|
+
_LOGGER.warning("Could not register the security events entity: %s", err)
|
|
179
|
+
|
|
167
180
|
await self.publish_state()
|
|
168
181
|
|
|
182
|
+
def publish_event(self, payload: dict) -> None:
|
|
183
|
+
"""Fire the Security events entity.
|
|
184
|
+
|
|
185
|
+
Not retained: an event is something that happened, and a retained one
|
|
186
|
+
would fire again every time Home Assistant reconnects.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
payload: ``{"event_type": ..., ...}`` from boneio.webui.security_events.
|
|
190
|
+
"""
|
|
191
|
+
self._manager.send_message(
|
|
192
|
+
topic=f"{self._manager._topic_prefix}/security/event",
|
|
193
|
+
payload=json.dumps(payload),
|
|
194
|
+
retain=False,
|
|
195
|
+
)
|
|
196
|
+
|
|
169
197
|
async def publish_state(self) -> None:
|
|
170
198
|
"""Publish the current posture.
|
|
171
199
|
|
|
@@ -55,8 +55,22 @@ class MessageBus(ABC):
|
|
|
55
55
|
pass
|
|
56
56
|
|
|
57
57
|
@abstractmethod
|
|
58
|
-
async def subscribe_and_listen(
|
|
59
|
-
|
|
58
|
+
async def subscribe_and_listen(
|
|
59
|
+
self,
|
|
60
|
+
topic: str,
|
|
61
|
+
callback: Callable[..., Awaitable[None]],
|
|
62
|
+
*,
|
|
63
|
+
retain_aware: bool = False,
|
|
64
|
+
) -> None:
|
|
65
|
+
"""Subscribe to a topic and listen for messages.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
topic: Topic to subscribe to.
|
|
69
|
+
callback: Called as ``callback(topic, payload)``.
|
|
70
|
+
retain_aware: Also pass ``retained=`` — True when the broker is
|
|
71
|
+
replaying a stored message on subscribe rather than forwarding
|
|
72
|
+
a live one. Buses without retained messages always pass False.
|
|
73
|
+
"""
|
|
60
74
|
pass
|
|
61
75
|
|
|
62
76
|
@abstractmethod
|
|
@@ -82,10 +82,16 @@ class CompositeMessageBus(MessageBus):
|
|
|
82
82
|
if tasks:
|
|
83
83
|
await asyncio.gather(*tasks, return_exceptions=True)
|
|
84
84
|
|
|
85
|
-
async def subscribe_and_listen(
|
|
85
|
+
async def subscribe_and_listen(
|
|
86
|
+
self,
|
|
87
|
+
topic: str,
|
|
88
|
+
callback: Callable[..., Awaitable[None]],
|
|
89
|
+
*,
|
|
90
|
+
retain_aware: bool = False,
|
|
91
|
+
) -> None:
|
|
86
92
|
"""Subscribe to a topic and listen for messages on all buses."""
|
|
87
93
|
for bus in self._buses:
|
|
88
|
-
await bus.subscribe_and_listen(topic, callback)
|
|
94
|
+
await bus.subscribe_and_listen(topic, callback, retain_aware=retain_aware)
|
|
89
95
|
|
|
90
96
|
async def unsubscribe_and_stop_listen(self, topic: str) -> None:
|
|
91
97
|
"""Unsubscribe from a topic and stop listening on all buses."""
|
|
@@ -80,8 +80,18 @@ class LocalMessageBus(MessageBus):
|
|
|
80
80
|
"""Announce that the device is offline."""
|
|
81
81
|
pass
|
|
82
82
|
|
|
83
|
-
async def subscribe_and_listen(
|
|
84
|
-
|
|
83
|
+
async def subscribe_and_listen(
|
|
84
|
+
self,
|
|
85
|
+
topic: str,
|
|
86
|
+
callback: Callable[..., Any],
|
|
87
|
+
*,
|
|
88
|
+
retain_aware: bool = False,
|
|
89
|
+
) -> None:
|
|
90
|
+
"""Subscribe to a topic and listen for messages.
|
|
91
|
+
|
|
92
|
+
``retain_aware`` is accepted for the interface and ignored: the callback
|
|
93
|
+
is called with two arguments, so ``retained`` keeps its default.
|
|
94
|
+
"""
|
|
85
95
|
await self.subscribe(topic, callback)
|
|
86
96
|
|
|
87
97
|
async def unsubscribe_and_stop_listen(self, topic: str) -> None:
|
|
@@ -388,8 +388,14 @@ class LoxUDPClient(MessageBus):
|
|
|
388
388
|
if self._transport:
|
|
389
389
|
self._transport.sendto(b"boneio=offline", (self.host, self.send_port))
|
|
390
390
|
|
|
391
|
-
async def subscribe_and_listen(
|
|
392
|
-
|
|
391
|
+
async def subscribe_and_listen(
|
|
392
|
+
self,
|
|
393
|
+
topic: str,
|
|
394
|
+
callback: Callable[..., Coroutine[Any, Any, None]],
|
|
395
|
+
*,
|
|
396
|
+
retain_aware: bool = False,
|
|
397
|
+
) -> None:
|
|
398
|
+
"""Register a listener for a topic pattern. Lox has no retained messages."""
|
|
393
399
|
self._listeners[topic] = callback
|
|
394
400
|
|
|
395
401
|
async def unsubscribe_and_stop_listen(self, topic: str) -> None:
|
|
@@ -56,7 +56,9 @@ class MQTTClient(MessageBus):
|
|
|
56
56
|
self.reconnect_interval = 1
|
|
57
57
|
self._connection_established = False
|
|
58
58
|
self.publish_queue: UniqueQueue = UniqueQueue()
|
|
59
|
-
self._mqtt_energy_listeners: dict[str, Callable[
|
|
59
|
+
self._mqtt_energy_listeners: dict[str, Callable[..., Awaitable[None]]] = {}
|
|
60
|
+
# Listeners that are told whether a message is a retained replay.
|
|
61
|
+
self._retain_aware_listeners: set[str] = set()
|
|
60
62
|
self._discovery_topics = (
|
|
61
63
|
[
|
|
62
64
|
f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_number}/#"
|
|
@@ -144,8 +146,18 @@ class MQTTClient(MessageBus):
|
|
|
144
146
|
)
|
|
145
147
|
|
|
146
148
|
@override
|
|
147
|
-
async def subscribe_and_listen(
|
|
149
|
+
async def subscribe_and_listen(
|
|
150
|
+
self,
|
|
151
|
+
topic: str,
|
|
152
|
+
callback: Callable[..., Awaitable[None]],
|
|
153
|
+
*,
|
|
154
|
+
retain_aware: bool = False,
|
|
155
|
+
) -> None:
|
|
148
156
|
self._mqtt_energy_listeners[topic] = callback
|
|
157
|
+
if retain_aware:
|
|
158
|
+
self._retain_aware_listeners.add(topic)
|
|
159
|
+
else:
|
|
160
|
+
self._retain_aware_listeners.discard(topic)
|
|
149
161
|
# Subscribe immediately if already connected
|
|
150
162
|
if self._connection_established:
|
|
151
163
|
await self.subscribe(topics=[topic])
|
|
@@ -154,6 +166,7 @@ class MQTTClient(MessageBus):
|
|
|
154
166
|
async def unsubscribe_and_stop_listen(self, topic: str) -> None:
|
|
155
167
|
await self.unsubscribe([topic])
|
|
156
168
|
del self._mqtt_energy_listeners[topic]
|
|
169
|
+
self._retain_aware_listeners.discard(topic)
|
|
157
170
|
|
|
158
171
|
async def unsubscribe(
|
|
159
172
|
self,
|
|
@@ -439,7 +452,14 @@ class MQTTClient(MessageBus):
|
|
|
439
452
|
if message.topic.matches(topic):
|
|
440
453
|
callback_start = False
|
|
441
454
|
try:
|
|
442
|
-
|
|
455
|
+
if topic in self._retain_aware_listeners:
|
|
456
|
+
# v3.1.1: the broker sets retain only when replaying
|
|
457
|
+
# its stored copy on subscribe, never on live ones.
|
|
458
|
+
await listener_callback(
|
|
459
|
+
str(message.topic), payload, retained=bool(message.retain)
|
|
460
|
+
)
|
|
461
|
+
else:
|
|
462
|
+
await listener_callback(str(message.topic), payload)
|
|
443
463
|
except Exception as exc:
|
|
444
464
|
_LOGGER.error(
|
|
445
465
|
"Error in MQTT listener callback for topic %s: %s",
|