boneIO 1.5.6__tar.gz → 1.6.0.dev1__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.5.6/boneio.egg-info → boneio-1.6.0.dev1}/PKG-INFO +1 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/bonecli.py +3 -0
- boneio-1.6.0.dev1/boneio/components/cover/__init__.py +6 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/cover.py +3 -17
- boneio-1.6.0.dev1/boneio/components/cover/remote.py +277 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/time_based.py +0 -14
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/venetian.py +0 -14
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/binary_sensor.py +0 -71
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/detectors.py +1 -62
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/event.py +11 -34
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/controller.py +1 -29
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/yaml_util.py +6 -49
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/events/bus.py +1 -67
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/covers.py +8 -45
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/inputs.py +3 -20
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/manager.py +138 -71
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/outputs.py +0 -49
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/sensors.py +8 -24
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/update.py +4 -21
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/esphome.py +38 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/monitor.py +2 -18
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/async_updater.py +2 -30
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/oled.py +1 -6
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +21 -163
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/base.py +3 -13
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219.py +1 -39
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/base.py +1 -9
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/actions.py +0 -68
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/MANIFEST.sha256 +4 -11
- boneio-1.6.0.dev1/boneio/migrations/assets/journald/journald.conf +6 -0
- boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio-oled-boot.service +17 -0
- boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio.service +15 -0
- boneio-1.6.0.dev1/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +10 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/boneio-migrate +1 -130
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/runner.py +0 -155
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/wanas415.json +1 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/runner.py +1 -4
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_outputs.yaml +2 -1
- boneio-1.6.0.dev1/boneio/version.py +2 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/action_validation.py +4 -7
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/BindingMatrix-BNqK7tIZ.js +1 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/ConfigEditor-DeE7U2yr.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-BbAOE4qq.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EditItemDialog-C0WDUAld.js +66 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/EntityCard-MIm2X0xL.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityCard-xdVpUoDY.js +1 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/EntityGrid-DXAibzFZ.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityGrid-gh0rv5_A.js +1 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/FormInputToggle-CKmTOUV2.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/FormInputToggle-B-viFZz5.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/InputsView-7BXiGozL.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/LogViewer-DoFcRAEu.js +2 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/ModbusView-BkLPDyTp.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ModbusView-DX2BOSsr.js +1 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/NodeRedView-Cm3TBtDf.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/NodeRedView-BdZeZ91F.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/OutputsView-BaZRxY6O.js +1 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/SensorView-BGvX8Zku.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SensorView-BS6L9UKi.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BBw56CUu.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SystemState-3DdCx89h.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/TemplatesView-C2wBfPOg.js +1 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/Tools-DX1geom0.js +14 -0
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/UISettings-BAXtlmBZ.js +38 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/gi-DaFhuK3L.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/gi-D-jcrHWa.js +1 -1
- boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-B-isv7qh.js +6 -0
- boneio-1.5.6/boneio/webui/frontend-dist/assets/index-CqtrKdPF.css → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-pwUtHTme.css +1 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/index.html +2 -24
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +2 -1
- {boneio-1.5.6/boneio/webui → boneio-1.6.0.dev1/boneio/webui/frontend-dist}/schema/remote_outputs.schema.json +2 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_core.py +0 -20
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/nodered.py +2 -28
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/remote_devices.py +88 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/system.py +10 -35
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/update.py +2 -34
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/config.schema.json +2 -1
- {boneio-1.5.6/boneio/webui/frontend-dist → boneio-1.6.0.dev1/boneio/webui}/schema/remote_outputs.schema.json +2 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/websocket_manager.py +31 -81
- {boneio-1.5.6 → boneio-1.6.0.dev1/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/SOURCES.txt +21 -42
- boneio-1.5.6/boneio/components/cover/__init__.py +0 -5
- boneio-1.5.6/boneio/core/utils/overlay.py +0 -159
- boneio-1.5.6/boneio/migrations/assets/journald/journald.conf +0 -43
- boneio-1.5.6/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -79
- boneio-1.5.6/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -30
- boneio-1.5.6/boneio/migrations/assets/systemd/boneio.service +0 -49
- boneio-1.5.6/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -11
- boneio-1.5.6/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -22
- boneio-1.5.6/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -16
- boneio-1.5.6/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -21
- boneio-1.5.6/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -27
- boneio-1.5.6/boneio/migrations/assets/systemd/linger-marker +0 -0
- boneio-1.5.6/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -15
- boneio-1.5.6/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -33
- boneio-1.5.6/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -64
- boneio-1.5.6/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -69
- boneio-1.5.6/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -43
- boneio-1.5.6/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -50
- boneio-1.5.6/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -37
- boneio-1.5.6/boneio/migrations/versions/v1_5_16_login_linger.py +0 -53
- boneio-1.5.6/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -60
- boneio-1.5.6/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -57
- boneio-1.5.6/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -32
- boneio-1.5.6/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -59
- boneio-1.5.6/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -47
- boneio-1.5.6/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -72
- boneio-1.5.6/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -50
- boneio-1.5.6/boneio/version.py +0 -2
- boneio-1.5.6/boneio/webui/frontend-dist/assets/BindingMatrix-C4JLRTbH.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/EditItemDialog-DAL7SSTN.js +0 -66
- boneio-1.5.6/boneio/webui/frontend-dist/assets/InputsView-BvUAn54U.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/LogViewer-DdM372kc.js +0 -2
- boneio-1.5.6/boneio/webui/frontend-dist/assets/OutputsView-SU0EQQ3a.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BHYIALWE.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/SystemState-D3GEjPni.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/TemplatesView-BRIdzlbF.js +0 -1
- boneio-1.5.6/boneio/webui/frontend-dist/assets/Tools-BJTVhILd.js +0 -14
- boneio-1.5.6/boneio/webui/frontend-dist/assets/UISettings-124Db9Cg.js +0 -38
- boneio-1.5.6/boneio/webui/frontend-dist/assets/index-ChQOzHhp.js +0 -6
- {boneio-1.5.6 → boneio-1.6.0.dev1}/LICENSE +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/MANIFEST.in +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/README.md +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/group/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/group/output_group.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/basic.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/mcp.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/pca.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/pcf.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/remote.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/const.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/package.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/discovery.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/events/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/display.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/remote.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/local.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/base.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/can.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/wled.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/base.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/system.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/state/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/state/manager.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/host_data.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/filter.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/logger.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/util.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/exceptions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/client.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/node.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/interlock.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/lox_template.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/cli.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/client.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/utils.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/actions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/events.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/files.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/logs.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/mqtt.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/state.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/condition.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/filters.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/id.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/schema.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/app.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/axios-DHUeYRnu.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/configCache-BAkc0Ye7.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/can.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/services/logs.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/web_server.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/pyproject.toml +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/setup.cfg +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/setup.py +0 -0
- {boneio-1.5.6 → boneio-1.6.0.dev1}/tests/test_py313_compatibility.py +0 -0
|
@@ -258,6 +258,9 @@ def run(
|
|
|
258
258
|
from boneio.const import ACTION
|
|
259
259
|
_LOGGER.debug("[RUNNER IMPORT] boneio.const: %.2fs", _time.monotonic() - _t_a)
|
|
260
260
|
_t_a = _time.monotonic()
|
|
261
|
+
from boneio.core.cloud import CloudRegistration
|
|
262
|
+
_LOGGER.debug("[RUNNER IMPORT] boneio.core.cloud: %.2fs", _time.monotonic() - _t_a)
|
|
263
|
+
_t_a = _time.monotonic()
|
|
261
264
|
from boneio.core.manager import Manager
|
|
262
265
|
_LOGGER.debug("[RUNNER IMPORT] boneio.core.manager: %.2fs", _time.monotonic() - _t_a)
|
|
263
266
|
_t_a = _time.monotonic()
|
|
@@ -210,23 +210,9 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
210
210
|
async def stop(self, on_exit=False) -> None:
|
|
211
211
|
if self._movement_thread and self._movement_thread.is_alive():
|
|
212
212
|
self._stop_event.set()
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
# over I2C behind a bus lock shared with every other device. Run
|
|
217
|
-
# inline they were the *event loop's* wait — up to half a second of
|
|
218
|
-
# frozen loop on every cover stop, and a cover stop is the first
|
|
219
|
-
# thing `toggle`, `toggle_open` and `toggle_close` do, so an
|
|
220
|
-
# ordinary button press paid it. Nothing reads GPIO while the loop
|
|
221
|
-
# is stopped. Order is unchanged: join first, then de-energise.
|
|
222
|
-
thread = self._movement_thread
|
|
223
|
-
|
|
224
|
-
def _halt() -> None:
|
|
225
|
-
thread.join(timeout=0.5)
|
|
226
|
-
self._open_relay.turn_off()
|
|
227
|
-
self._close_relay.turn_off()
|
|
228
|
-
|
|
229
|
-
await asyncio.get_running_loop().run_in_executor(None, _halt)
|
|
213
|
+
self._movement_thread.join(timeout=0.5)
|
|
214
|
+
self._open_relay.turn_off()
|
|
215
|
+
self._close_relay.turn_off()
|
|
230
216
|
# Send relay states to WebSocket (not MQTT - that's handled by output_type check)
|
|
231
217
|
with suppress(RuntimeError):
|
|
232
218
|
asyncio.create_task(self._open_relay.async_send_state())
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Remote cover output for covers on remote devices (ESPHome API).
|
|
2
|
+
|
|
3
|
+
``RemoteCoverOutput`` provides a duck-type compatible interface with
|
|
4
|
+
:class:`TimeBasedCover` / :class:`VenetianCover` so that the conditions
|
|
5
|
+
system (``is_open`` / ``is_closed``), ``CoverManager.get_cover()``,
|
|
6
|
+
and WebSocket event emission work transparently with remote covers.
|
|
7
|
+
|
|
8
|
+
The actual hardware control is delegated to the parent
|
|
9
|
+
``ESPHomeDeviceManager`` via ``control_cover()``.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
import time
|
|
16
|
+
from typing import TYPE_CHECKING, Any
|
|
17
|
+
|
|
18
|
+
from boneio.const import CLOSED, CLOSING, COVER, IDLE, OPEN, OPENING
|
|
19
|
+
from boneio.core.events import EventBus
|
|
20
|
+
from boneio.models import CoverState
|
|
21
|
+
from boneio.models.events import CoverEvent
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from boneio.core.messaging import MessageBus
|
|
25
|
+
|
|
26
|
+
_LOGGER = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RemoteCoverOutput:
|
|
30
|
+
"""Remote cover from ESPHome — duck-type compatible with local Cover.
|
|
31
|
+
|
|
32
|
+
Provides the same public interface that the condition evaluators and
|
|
33
|
+
the ``CoverManager`` expect:
|
|
34
|
+
|
|
35
|
+
- ``is_open`` / ``is_closed`` property for action conditions
|
|
36
|
+
- ``state`` / ``position`` / ``tilt`` for state reporting
|
|
37
|
+
- ``on_remote_state_change()`` callback from ESPHome subscription
|
|
38
|
+
- ``CoverEvent`` emission on EventBus for WebSocket clients
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
id: Entity identifier (usually ``{device_id}_{cover_id}``).
|
|
42
|
+
name: Human-readable display name.
|
|
43
|
+
device_id: ID of the remote device hosting this cover.
|
|
44
|
+
cover_id: Entity object_id on the remote device.
|
|
45
|
+
remote_source: Transport protocol (``esphome_api``).
|
|
46
|
+
event_bus: Central event bus for emitting ``CoverEvent`` objects.
|
|
47
|
+
kind: Cover device class (``blind``, ``shutter``, ``gate``, etc.).
|
|
48
|
+
show_in_ha: Whether to publish HA autodiscovery.
|
|
49
|
+
area: Optional HA area assignment.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
# Duck-type compatibility with local covers
|
|
53
|
+
is_remote: bool = True
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
*,
|
|
58
|
+
id: str,
|
|
59
|
+
name: str,
|
|
60
|
+
device_id: str,
|
|
61
|
+
cover_id: str,
|
|
62
|
+
remote_source: str,
|
|
63
|
+
event_bus: EventBus,
|
|
64
|
+
message_bus: MessageBus | None = None,
|
|
65
|
+
topic_prefix: str = "",
|
|
66
|
+
kind: str = "cover",
|
|
67
|
+
show_in_ha: bool = False,
|
|
68
|
+
area: str | None = None,
|
|
69
|
+
) -> None:
|
|
70
|
+
self._id = id
|
|
71
|
+
self._name = name
|
|
72
|
+
self._device_id = device_id
|
|
73
|
+
self._cover_id = cover_id
|
|
74
|
+
self._remote_source = remote_source
|
|
75
|
+
self._event_bus = event_bus
|
|
76
|
+
self._message_bus: MessageBus | None = message_bus
|
|
77
|
+
self._send_topic = f"{topic_prefix}/{COVER}/{id}" if topic_prefix else ""
|
|
78
|
+
self._kind = kind
|
|
79
|
+
self.show_in_ha = show_in_ha
|
|
80
|
+
self.area: str | None = area
|
|
81
|
+
|
|
82
|
+
# State tracking
|
|
83
|
+
self._position: int = 0 # 0=closed, 100=open
|
|
84
|
+
self._tilt: int = 0
|
|
85
|
+
self._current_operation: str = IDLE
|
|
86
|
+
self._last_timestamp: float = 0.0
|
|
87
|
+
self._available: bool = False
|
|
88
|
+
|
|
89
|
+
# Reference to remote device manager — set by registration.
|
|
90
|
+
self._device_manager: Any = None
|
|
91
|
+
self._remote_devices_ref: Any = None
|
|
92
|
+
|
|
93
|
+
# ------------------------------------------------------------------
|
|
94
|
+
# Public properties (duck-type compatible with TimeBasedCover)
|
|
95
|
+
# ------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def id(self) -> str:
|
|
99
|
+
"""Entity identifier."""
|
|
100
|
+
return self._id
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def name(self) -> str:
|
|
104
|
+
"""Human-readable name."""
|
|
105
|
+
return self._name
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def kind(self) -> str:
|
|
109
|
+
"""Cover device class (blind, shutter, gate, etc.)."""
|
|
110
|
+
return self._kind
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def state(self) -> str:
|
|
114
|
+
"""Current state as string (open/closed/opening/closing)."""
|
|
115
|
+
if self._current_operation == OPENING:
|
|
116
|
+
return OPENING
|
|
117
|
+
elif self._current_operation == CLOSING:
|
|
118
|
+
return CLOSING
|
|
119
|
+
else:
|
|
120
|
+
return CLOSED if self._position == 0 else OPEN
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def is_open(self) -> bool:
|
|
124
|
+
"""True when cover position > 0 (not fully closed)."""
|
|
125
|
+
return self._position > 0
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def is_closed(self) -> bool:
|
|
129
|
+
"""True when cover is fully closed (position == 0)."""
|
|
130
|
+
return self._position == 0
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def position(self) -> int:
|
|
134
|
+
"""Current cover position (0-100)."""
|
|
135
|
+
return self._position
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def tilt(self) -> int:
|
|
139
|
+
"""Current tilt position (0-100)."""
|
|
140
|
+
return self._tilt
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def current_operation(self) -> str:
|
|
144
|
+
"""Current operation (idle/opening/closing)."""
|
|
145
|
+
return self._current_operation
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def last_timestamp(self) -> float:
|
|
149
|
+
"""Timestamp of last state update."""
|
|
150
|
+
return self._last_timestamp
|
|
151
|
+
|
|
152
|
+
# ------------------------------------------------------------------
|
|
153
|
+
# Remote state callback
|
|
154
|
+
# ------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
def on_remote_state_change(self, state_dict: dict[str, Any]) -> None:
|
|
157
|
+
"""Called by ESPHome device manager when cover state changes.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
state_dict: Cover state from ESPHome containing:
|
|
161
|
+
- position: float (0.0-1.0)
|
|
162
|
+
- tilt: float | None
|
|
163
|
+
- current_operation: int (0=IDLE, 1=OPENING, 2=CLOSING)
|
|
164
|
+
"""
|
|
165
|
+
position_raw = state_dict.get("position")
|
|
166
|
+
if position_raw is not None:
|
|
167
|
+
self._position = round(float(position_raw) * 100)
|
|
168
|
+
|
|
169
|
+
tilt_raw = state_dict.get("tilt")
|
|
170
|
+
if tilt_raw is not None:
|
|
171
|
+
self._tilt = round(float(tilt_raw) * 100)
|
|
172
|
+
|
|
173
|
+
current_op_int = state_dict.get("current_operation", 0)
|
|
174
|
+
if current_op_int == 1:
|
|
175
|
+
self._current_operation = OPENING
|
|
176
|
+
elif current_op_int == 2:
|
|
177
|
+
self._current_operation = CLOSING
|
|
178
|
+
else:
|
|
179
|
+
self._current_operation = IDLE
|
|
180
|
+
|
|
181
|
+
self._last_timestamp = time.time()
|
|
182
|
+
self._available = True
|
|
183
|
+
|
|
184
|
+
_LOGGER.debug(
|
|
185
|
+
"Remote cover '%s' state: position=%d%%, tilt=%d%%, operation=%s",
|
|
186
|
+
self._id,
|
|
187
|
+
self._position,
|
|
188
|
+
self._tilt,
|
|
189
|
+
self._current_operation,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Emit CoverEvent for WebSocket clients
|
|
193
|
+
self._emit_cover_event()
|
|
194
|
+
|
|
195
|
+
def _emit_cover_event(self) -> None:
|
|
196
|
+
"""Emit a CoverEvent on the event bus."""
|
|
197
|
+
event = CoverState(
|
|
198
|
+
id=self._id,
|
|
199
|
+
name=self._name,
|
|
200
|
+
state=self.state,
|
|
201
|
+
kind=self._kind,
|
|
202
|
+
timestamp=self._last_timestamp,
|
|
203
|
+
current_operation=self._current_operation,
|
|
204
|
+
position=self._position,
|
|
205
|
+
tilt=self._tilt,
|
|
206
|
+
)
|
|
207
|
+
self._event_bus.trigger_event(CoverEvent(entity_id=self._id, state=event))
|
|
208
|
+
|
|
209
|
+
# ------------------------------------------------------------------
|
|
210
|
+
# Device manager resolution (lazy — same pattern as RemoteOutputBase)
|
|
211
|
+
# ------------------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
def _resolve_device_manager(self) -> bool:
|
|
214
|
+
"""Try to resolve device manager lazily from remote_devices reference.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
``True`` if device manager is now available.
|
|
218
|
+
"""
|
|
219
|
+
if self._device_manager is not None:
|
|
220
|
+
return True
|
|
221
|
+
if self._remote_devices_ref is None:
|
|
222
|
+
return False
|
|
223
|
+
device = self._remote_devices_ref.get_device(self._device_id)
|
|
224
|
+
if device is not None:
|
|
225
|
+
self._device_manager = device
|
|
226
|
+
self._remote_devices_ref = None
|
|
227
|
+
self._register_state_callback()
|
|
228
|
+
_LOGGER.info(
|
|
229
|
+
"Lazily resolved device manager for remote cover '%s' (device '%s')",
|
|
230
|
+
self._id,
|
|
231
|
+
self._device_id,
|
|
232
|
+
)
|
|
233
|
+
return True
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
def _register_state_callback(self) -> None:
|
|
237
|
+
"""Register a cover state change callback on the device manager.
|
|
238
|
+
|
|
239
|
+
Called after device manager is resolved (lazy or immediate).
|
|
240
|
+
ESPHome devices will call back on cover state changes.
|
|
241
|
+
Also syncs current state from the device if available.
|
|
242
|
+
"""
|
|
243
|
+
if self._device_manager is None:
|
|
244
|
+
return
|
|
245
|
+
register_fn = getattr(self._device_manager, "register_cover_callback", None)
|
|
246
|
+
if register_fn is not None:
|
|
247
|
+
register_fn(self._cover_id, self.on_remote_state_change)
|
|
248
|
+
_LOGGER.debug(
|
|
249
|
+
"Registered cover callback for remote cover '%s' on device '%s'",
|
|
250
|
+
self._id,
|
|
251
|
+
self._device_id,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
# Sync initial state from device's current known states
|
|
255
|
+
self._sync_initial_state()
|
|
256
|
+
|
|
257
|
+
def _sync_initial_state(self) -> None:
|
|
258
|
+
"""Sync initial state from ESPHome device's cached cover states."""
|
|
259
|
+
if self._device_manager is None:
|
|
260
|
+
return
|
|
261
|
+
|
|
262
|
+
cover_states: dict[str, dict[str, Any]] = getattr(
|
|
263
|
+
self._device_manager, "_cover_states", {}
|
|
264
|
+
)
|
|
265
|
+
if self._cover_id in cover_states:
|
|
266
|
+
self.on_remote_state_change(cover_states[self._cover_id])
|
|
267
|
+
_LOGGER.debug(
|
|
268
|
+
"Synced initial cover state for '%s': position=%d%%",
|
|
269
|
+
self._id,
|
|
270
|
+
self._position,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
def __repr__(self) -> str:
|
|
274
|
+
return (
|
|
275
|
+
f"RemoteCoverOutput(id={self._id!r}, device={self._device_id!r}, "
|
|
276
|
+
f"cover={self._cover_id!r}, position={self._position})"
|
|
277
|
+
)
|
|
@@ -61,20 +61,6 @@ class TimeBasedCover(BaseCover):
|
|
|
61
61
|
else:
|
|
62
62
|
return
|
|
63
63
|
|
|
64
|
-
if duration == 0:
|
|
65
|
-
# A zero open_time/close_time makes movement impossible: the guard
|
|
66
|
-
# below returns before relay.turn_on(), so the relay is never
|
|
67
|
-
# energised and the motor never gets voltage — while the cover still
|
|
68
|
-
# reports IDLE and publishes state, so the UI looks like it worked.
|
|
69
|
-
# This is always a misconfiguration, never a normal outcome.
|
|
70
|
-
_LOGGER.error(
|
|
71
|
-
"Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
|
|
72
|
-
"switched. Set a non-zero time in the cover configuration.",
|
|
73
|
-
self._id,
|
|
74
|
-
direction,
|
|
75
|
-
"open" if direction == OPEN else "close",
|
|
76
|
-
)
|
|
77
|
-
|
|
78
64
|
if total_steps == 0 or duration == 0:
|
|
79
65
|
self._current_operation = IDLE
|
|
80
66
|
with suppress(RuntimeError):
|
|
@@ -93,20 +93,6 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
93
93
|
else:
|
|
94
94
|
total_steps = 1
|
|
95
95
|
|
|
96
|
-
if duration == 0:
|
|
97
|
-
# A zero open_time/close_time makes movement impossible: the guard
|
|
98
|
-
# below returns before relay.turn_on(), so the relay is never
|
|
99
|
-
# energised and the motor never gets voltage — while the cover still
|
|
100
|
-
# reports IDLE and publishes state, so the UI looks like it worked.
|
|
101
|
-
# This is always a misconfiguration, never a normal outcome.
|
|
102
|
-
_LOGGER.error(
|
|
103
|
-
"Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
|
|
104
|
-
"switched. Set a non-zero time in the cover configuration.",
|
|
105
|
-
self._id,
|
|
106
|
-
direction,
|
|
107
|
-
"open" if direction == OPEN else "close",
|
|
108
|
-
)
|
|
109
|
-
|
|
110
96
|
if total_steps == 0 or duration == 0:
|
|
111
97
|
self._current_operation = IDLE
|
|
112
98
|
self._loop.call_soon_threadsafe(self.send_state, self.state, self.json_position)
|
|
@@ -8,18 +8,12 @@ from typing import cast
|
|
|
8
8
|
|
|
9
9
|
from boneio.components.input.detectors import BinarySensorDetector
|
|
10
10
|
from boneio.const import PRESSED, RELEASED, BinaryStateTypes, ClickTypes
|
|
11
|
-
from boneio.core.utils.timeperiod import parse_time_to_ms
|
|
12
11
|
from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
|
|
13
12
|
from boneio.models import InputState
|
|
14
13
|
from boneio.models.events import InputEvent
|
|
15
14
|
|
|
16
15
|
_LOGGER = logging.getLogger(__name__)
|
|
17
16
|
|
|
18
|
-
# Matches the binary_sensor bounce_time default in schema.yaml. Needed on the
|
|
19
|
-
# hot-reload path, which reads the YAML without running Cerberus, so an
|
|
20
|
-
# omitted bounce_time arrives as None rather than as the schema default.
|
|
21
|
-
DEFAULT_BOUNCE_TIME_MS = 120
|
|
22
|
-
|
|
23
17
|
|
|
24
18
|
class GpioInputBinarySensor(GpioBaseClass):
|
|
25
19
|
"""Represent Gpio binary sensor on input boards."""
|
|
@@ -63,71 +57,6 @@ class GpioInputBinarySensor(GpioBaseClass):
|
|
|
63
57
|
if kwargs.get("initial_send", False):
|
|
64
58
|
gpio_manager.register_on_start_callback(self._send_initial_state)
|
|
65
59
|
|
|
66
|
-
def update_inverted(self, inverted: bool) -> bool:
|
|
67
|
-
"""Apply a new ``inverted`` setting to a running sensor.
|
|
68
|
-
|
|
69
|
-
Polarity is decided in ``__init__`` and baked into the detector, so a
|
|
70
|
-
config reload alone used to leave the running sensor on the old
|
|
71
|
-
polarity until the application was restarted.
|
|
72
|
-
|
|
73
|
-
Args:
|
|
74
|
-
inverted: New inverted flag from the reloaded config.
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
True if the polarity actually changed (caller should re-publish
|
|
78
|
-
the state), False if it was already set that way.
|
|
79
|
-
"""
|
|
80
|
-
inverted = bool(inverted)
|
|
81
|
-
if inverted == self._inverted:
|
|
82
|
-
return False
|
|
83
|
-
|
|
84
|
-
self._inverted = inverted
|
|
85
|
-
self._click_type = (RELEASED, PRESSED) if inverted else (PRESSED, RELEASED)
|
|
86
|
-
|
|
87
|
-
# Re-read the pin and re-anchor the detector with the new polarity.
|
|
88
|
-
gpio_manager = get_gpio_manager(loop=self._loop)
|
|
89
|
-
current_value = gpio_manager.read_value(self._pin)
|
|
90
|
-
is_pressed = current_value if inverted else not current_value
|
|
91
|
-
self._detector.resync(inverted=inverted, current_state=is_pressed)
|
|
92
|
-
|
|
93
|
-
_LOGGER.info(
|
|
94
|
-
"Binary sensor %s (%s): inverted changed to %s without restart",
|
|
95
|
-
self._name,
|
|
96
|
-
self._pin,
|
|
97
|
-
inverted,
|
|
98
|
-
)
|
|
99
|
-
return True
|
|
100
|
-
|
|
101
|
-
def update_bounce_time(self, bounce_time) -> bool:
|
|
102
|
-
"""Apply a new debounce window to a running sensor.
|
|
103
|
-
|
|
104
|
-
Like ``inverted``, ``bounce_time`` is read in ``__init__`` and handed to
|
|
105
|
-
the detector, so a config reload used to leave the old window in place
|
|
106
|
-
until the application was restarted.
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
bounce_time: Value straight from the reloaded config — a TimePeriod
|
|
110
|
-
at startup, but a bare number of milliseconds (WebUI) or a string
|
|
111
|
-
such as "120ms" (hand-written YAML) on the hot-reload path, which
|
|
112
|
-
skips Cerberus coercion. ``None`` means the schema default.
|
|
113
|
-
|
|
114
|
-
Returns:
|
|
115
|
-
True if the window actually changed.
|
|
116
|
-
"""
|
|
117
|
-
seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
|
|
118
|
-
if seconds == self._bounce_time:
|
|
119
|
-
return False
|
|
120
|
-
|
|
121
|
-
self._bounce_time = seconds
|
|
122
|
-
self._detector.set_debounce(seconds)
|
|
123
|
-
_LOGGER.info(
|
|
124
|
-
"Binary sensor %s (%s): bounce_time changed to %.0fms without restart",
|
|
125
|
-
self._name,
|
|
126
|
-
self._pin,
|
|
127
|
-
seconds * 1000,
|
|
128
|
-
)
|
|
129
|
-
return True
|
|
130
|
-
|
|
131
60
|
def _send_initial_state(self) -> None:
|
|
132
61
|
"""Send initial state after setup."""
|
|
133
62
|
self.send_current_state()
|
|
@@ -135,14 +135,6 @@ class MultiClickDetector:
|
|
|
135
135
|
self._delay_click_types.add(first)
|
|
136
136
|
break
|
|
137
137
|
|
|
138
|
-
def set_debounce(self, debounce_seconds: float) -> None:
|
|
139
|
-
"""Change the debounce window on a running detector.
|
|
140
|
-
|
|
141
|
-
Only the window is replaced; timestamps already recorded stay valid
|
|
142
|
-
and are simply compared against the new window from now on.
|
|
143
|
-
"""
|
|
144
|
-
self._debounce_seconds = debounce_seconds
|
|
145
|
-
|
|
146
138
|
def _finalize_clicks(self) -> None:
|
|
147
139
|
"""Finalize a multi-click sequence."""
|
|
148
140
|
count = self._state.click_count
|
|
@@ -423,18 +415,13 @@ class MultiClickDetector:
|
|
|
423
415
|
GPIO state to detect missed RELEASE edge events.
|
|
424
416
|
"""
|
|
425
417
|
if not self._state.last_press_loop_ts or self._state.last_release_ts:
|
|
426
|
-
# Button released or invalid state
|
|
427
|
-
# chain is ending here, and a handle left pointing at a timer that
|
|
428
|
-
# has already fired reads as "a long press is running" to the
|
|
429
|
-
# release path, which then emits a phantom final LONG on the next
|
|
430
|
-
# ordinary click.
|
|
418
|
+
# Button released or invalid state
|
|
431
419
|
_LOGGER.debug(
|
|
432
420
|
"Periodic long skipped for %s: press_ts=%s, release_ts=%s",
|
|
433
421
|
self._name,
|
|
434
422
|
self._state.last_press_loop_ts is not None,
|
|
435
423
|
self._state.last_release_ts,
|
|
436
424
|
)
|
|
437
|
-
self._state.long_hold_periodic_timer = None
|
|
438
425
|
return
|
|
439
426
|
|
|
440
427
|
now = self._loop.time()
|
|
@@ -583,27 +570,6 @@ class MultiClickDetector:
|
|
|
583
570
|
return
|
|
584
571
|
|
|
585
572
|
_LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
|
|
586
|
-
|
|
587
|
-
# End any long-hold chain still running from the previous press.
|
|
588
|
-
# It can still be running only because that press never saw its
|
|
589
|
-
# release — the edge was lost while the event loop was blocked, or
|
|
590
|
-
# it was swallowed as a bounce. Left alone, the old chain keeps
|
|
591
|
-
# rescheduling itself and now measures against *this* press, so its
|
|
592
|
-
# safety timeout never trips and nothing can ever cancel it: the
|
|
593
|
-
# handle below is about to be overwritten. Every such press adds
|
|
594
|
-
# another immortal chain emitting LONG five times a second.
|
|
595
|
-
if self._state.long_hold_periodic_timer:
|
|
596
|
-
_LOGGER.warning(
|
|
597
|
-
"New press on %s (%s) while a long-hold chain was still "
|
|
598
|
-
"running — the previous release was never seen. Ending it.",
|
|
599
|
-
self._name,
|
|
600
|
-
self._pin,
|
|
601
|
-
)
|
|
602
|
-
self._state.long_hold_periodic_timer.cancel()
|
|
603
|
-
self._state.long_hold_periodic_timer = None
|
|
604
|
-
self._state.executed_long_actions = set()
|
|
605
|
-
self._state.last_repeat_times = {}
|
|
606
|
-
|
|
607
573
|
self._state.last_press_ts = timestamp_s
|
|
608
574
|
self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
|
|
609
575
|
self._state.last_release_ts = None # Reset release timestamp for new press
|
|
@@ -881,33 +847,6 @@ class BinarySensorDetector:
|
|
|
881
847
|
self._pin = pin
|
|
882
848
|
self._state = BinarySensorState()
|
|
883
849
|
|
|
884
|
-
def set_debounce(self, debounce_seconds: float) -> None:
|
|
885
|
-
"""Change the debounce window on a running detector.
|
|
886
|
-
|
|
887
|
-
Only the window is replaced; timestamps already recorded stay valid
|
|
888
|
-
and are simply compared against the new window from now on.
|
|
889
|
-
"""
|
|
890
|
-
self._debounce_seconds = debounce_seconds
|
|
891
|
-
|
|
892
|
-
def resync(self, inverted: bool, current_state: bool) -> None:
|
|
893
|
-
"""Apply a new polarity to a running detector.
|
|
894
|
-
|
|
895
|
-
Called when ``inverted`` is changed in the config and reloaded, so the
|
|
896
|
-
user does not have to restart the application for it to take effect.
|
|
897
|
-
|
|
898
|
-
Args:
|
|
899
|
-
inverted: New inverted flag.
|
|
900
|
-
current_state: Pressed state as read from the pin right now, already
|
|
901
|
-
interpreted with the *new* polarity. Without re-anchoring it the
|
|
902
|
-
cached state would still describe the old polarity and the next
|
|
903
|
-
edge would be dropped by the "state unchanged" guard.
|
|
904
|
-
"""
|
|
905
|
-
self._inverted = bool(inverted)
|
|
906
|
-
self._state.current_state = bool(current_state)
|
|
907
|
-
# Drop the debounce anchor — the pending window belongs to the old
|
|
908
|
-
# polarity and would swallow the first edge after the change.
|
|
909
|
-
self._state.last_press_ts = None
|
|
910
|
-
|
|
911
850
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
912
851
|
"""Process a GPIO edge event for binary sensor.
|
|
913
852
|
|
|
@@ -7,7 +7,7 @@ import time
|
|
|
7
7
|
|
|
8
8
|
from boneio.components.input.detectors import MultiClickDetector
|
|
9
9
|
from boneio.const import ClickTypes
|
|
10
|
-
from boneio.core.utils
|
|
10
|
+
from boneio.core.utils import TimePeriod
|
|
11
11
|
from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
|
|
12
12
|
|
|
13
13
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -16,31 +16,25 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
16
16
|
DEFAULT_DOUBLE_CLICK_DURATION_MS = 220
|
|
17
17
|
DEFAULT_LONG_PRESS_DURATION_MS = 400
|
|
18
18
|
DEFAULT_SEQUENCE_WINDOW_MS = 500
|
|
19
|
-
# Matches the event bounce_time default in schema.yaml. Needed on the hot-reload
|
|
20
|
-
# path, which reads the YAML without running Cerberus, so an omitted bounce_time
|
|
21
|
-
# arrives as None rather than as the schema default.
|
|
22
|
-
DEFAULT_BOUNCE_TIME_MS = 30
|
|
23
19
|
|
|
24
20
|
|
|
25
21
|
def _to_milliseconds(value, default_ms: int) -> int:
|
|
26
22
|
"""Convert a value to milliseconds.
|
|
27
23
|
|
|
28
24
|
Args:
|
|
29
|
-
value:
|
|
30
|
-
|
|
31
|
-
default_ms: Default value in milliseconds if value is None or unusable.
|
|
25
|
+
value: Can be int, float, TimePeriod, or None
|
|
26
|
+
default_ms: Default value in milliseconds if value is None
|
|
32
27
|
|
|
33
28
|
Returns:
|
|
34
|
-
Value in milliseconds as integer
|
|
35
|
-
|
|
36
|
-
Note:
|
|
37
|
-
Strings have to be handled here, not just TimePeriod: Cerberus coerces
|
|
38
|
-
these fields at startup, but the hot-reload path reads the YAML without
|
|
39
|
-
validating, and EventForm writes them as strings like "300ms". Falling
|
|
40
|
-
back to the default for those quietly reset every custom click timing on
|
|
41
|
-
each reload.
|
|
29
|
+
Value in milliseconds as integer
|
|
42
30
|
"""
|
|
43
|
-
|
|
31
|
+
if value is None:
|
|
32
|
+
return default_ms
|
|
33
|
+
if isinstance(value, TimePeriod):
|
|
34
|
+
return int(value.total_milliseconds)
|
|
35
|
+
if isinstance(value, (int, float)):
|
|
36
|
+
return int(value)
|
|
37
|
+
return default_ms
|
|
44
38
|
|
|
45
39
|
|
|
46
40
|
class GpioEventButton(GpioBaseClass):
|
|
@@ -179,7 +173,6 @@ class GpioEventButton(GpioBaseClass):
|
|
|
179
173
|
enable_triple_click: bool | None = None,
|
|
180
174
|
long_press_mqtt_mode: str | None = None,
|
|
181
175
|
max_long_press_duration: int | float | None = None,
|
|
182
|
-
bounce_time: object | None = None,
|
|
183
176
|
) -> None:
|
|
184
177
|
"""Update timing parameters for click detection.
|
|
185
178
|
|
|
@@ -196,9 +189,6 @@ class GpioEventButton(GpioBaseClass):
|
|
|
196
189
|
enable_triple_click: Enable triple click detection
|
|
197
190
|
long_press_mqtt_mode: 'single' or 'periodic' for MQTT long press events
|
|
198
191
|
max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
|
|
199
|
-
bounce_time: Debounce window — a TimePeriod at startup, but a bare
|
|
200
|
-
number of milliseconds or a string such as "30ms" on the
|
|
201
|
-
hot-reload path, which skips Cerberus coercion
|
|
202
192
|
"""
|
|
203
193
|
from boneio.const import CLICK_SEQUENCES
|
|
204
194
|
|
|
@@ -270,16 +260,3 @@ class GpioEventButton(GpioBaseClass):
|
|
|
270
260
|
if long_press_mqtt_mode is not None:
|
|
271
261
|
self._long_press_mqtt_mode = long_press_mqtt_mode
|
|
272
262
|
_LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
|
|
273
|
-
|
|
274
|
-
# bounce_time is handed to the detector in __init__, so it needs pushing
|
|
275
|
-
# through explicitly — None here means "back to the schema default".
|
|
276
|
-
seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
|
|
277
|
-
if seconds != self._bounce_time:
|
|
278
|
-
self._bounce_time = seconds
|
|
279
|
-
self._detector.set_debounce(seconds)
|
|
280
|
-
_LOGGER.info(
|
|
281
|
-
"Event input %s (%s): bounce_time changed to %.0fms without restart",
|
|
282
|
-
self._name,
|
|
283
|
-
self._pin,
|
|
284
|
-
seconds * 1000,
|
|
285
|
-
)
|