boneIO 1.2.0__tar.gz → 1.2.0.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.2.0/boneio.egg-info → boneio-1.2.0.dev2}/PKG-INFO +1 -1
- boneio-1.2.0.dev2/boneio/components/cover/__init__.py +6 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/cover.py +8 -46
- boneio-1.2.0.dev2/boneio/components/cover/previous.py +354 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/time_based.py +3 -3
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/detectors.py +8 -69
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/event.py +1 -21
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/const.py +0 -30
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/init-certs-cloud.sh +11 -9
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/registration.py +33 -67
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/config_helper.py +1 -5
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/schema_converter.py +3 -3
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/yaml_util.py +86 -54
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/events/bus.py +0 -1
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/__init__.py +0 -3
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/covers.py +37 -75
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/inputs.py +35 -118
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/manager.py +131 -156
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/modbus.py +1 -11
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/outputs.py +15 -39
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/remote.py +8 -109
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/sensors.py +160 -140
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/update.py +17 -294
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/mqtt.py +6 -8
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/esphome.py +24 -150
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/wled.py +6 -7
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/host_data.py +2 -2
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/timeperiod.py +0 -51
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/oled.py +7 -254
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/base.py +0 -11
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/homeassistant.py +3 -165
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/client.py +4 -41
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/coordinator.py +13 -37
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/r4dcb08.json +1 -1
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/logs.py +1 -3
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/runner.py +0 -2
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions.yaml +8 -70
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/schema.yaml +1 -289
- boneio-1.2.0.dev2/boneio/version.py +2 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/app.py +2 -27
- boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/cssMode-Cien7gk3.js +4 -0
- boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +12 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/freemarker2-DbD6A6sh.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/freemarker2-DKeOvJUQ.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/handlebars-CTdnPo2i.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/handlebars-DNnaxdWH.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/html-BZoYb7JD.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/html-DXlp60y1.js +1 -1
- boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/htmlMode-BWwtqU6M.js +4 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/index-DeLJ1p9c.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/index-C_xrObji.js +255 -255
- boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/index-jeVCQb5d.css +1 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/javascript-By5E2Dlg.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/javascript-TNfhzQgr.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +22 -22
- boneio-1.2.0/boneio/webui/frontend-dist/assets/jsonMode-ZwdsxjyQ.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/jsonMode-gvQZVe-P.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/liquid-DTSAXFsq.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/liquid-D9_Zvpcn.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/mdx-AOxBxyYF.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/mdx-BqDp2PG-.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/python-aHpP8PXg.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/python-lO3BnvZK.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/razor-DlXazXnf.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/razor-M254lwEF.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/tsMode-Bg9vUHAv.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/tsMode-D-skKu2E.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/typescript-XXBI8V-E.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/typescript-CAFTqQSw.js +1 -1
- boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-vqzQaGvo.js +2 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/xml-C6ha-iag.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/xml-BGBqYqhB.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml-DMW4SkKa.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/yaml-CaDz2FIb.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +200 -200
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/adc.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/areas.schema.json +2 -2
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +38 -160
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -11
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/config.schema.json +343 -1319
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/cover.schema.json +12 -11
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/ds2482.schema.json +2 -2
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/event.schema.json +129 -579
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/ina219.schema.json +10 -10
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/lm75.schema.json +8 -8
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mcp23017.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mcp9808.schema.json +8 -8
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/modbus.schema.json +6 -26
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/modbus_devices.schema.json +14 -26
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mqtt.schema.json +2 -2
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/oled.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/output.schema.json +12 -12
- {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/pca9685.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/pcf8575.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/remote_devices.schema.json +44 -44
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/sensor.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/web.schema.json +12 -12
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/__init__.py +0 -4
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/config.py +1 -75
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/covers.py +2 -1
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/modbus.py +0 -62
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/sensors.py +0 -17
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/system.py +10 -227
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/update.py +117 -60
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/adc.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/areas.schema.json +2 -2
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/binary_sensor.schema.json +38 -160
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/boneio.schema.json +2 -11
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/config.schema.json +343 -1319
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/cover.schema.json +12 -11
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/ds2482.schema.json +2 -2
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/event.schema.json +129 -579
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/ina219.schema.json +10 -10
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/lm75.schema.json +8 -8
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/mcp23017.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/mcp9808.schema.json +8 -8
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/modbus.schema.json +6 -26
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/modbus_devices.schema.json +14 -26
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/mqtt.schema.json +2 -2
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/oled.schema.json +6 -6
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/output.schema.json +12 -12
- {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/output_group.schema.json +4 -4
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/pca9685.schema.json +6 -6
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/pcf8575.schema.json +6 -6
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/remote_devices.schema.json +44 -44
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/sensor.schema.json +6 -6
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/web.schema.json +12 -12
- boneio-1.2.0.dev2/boneio/webui/services/logs.py +242 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/SOURCES.txt +48 -67
- boneio-1.2.0/boneio/components/cover/__init__.py +0 -5
- boneio-1.2.0/boneio/components/template/__init__.py +0 -15
- boneio-1.2.0/boneio/components/template/alarm_panel.py +0 -755
- boneio-1.2.0/boneio/components/template/gate_cover.py +0 -456
- boneio-1.2.0/boneio/components/template/thermostat.py +0 -313
- boneio-1.2.0/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -38
- boneio-1.2.0/boneio/core/config/migrations/__init__.py +0 -222
- boneio-1.2.0/boneio/core/config/migrations/v1_proxy_port.py +0 -75
- boneio-1.2.0/boneio/core/config/migrations/v2_transition.py +0 -109
- boneio-1.2.0/boneio/core/manager/templates/__init__.py +0 -283
- boneio-1.2.0/boneio/core/manager/templates/alarm.py +0 -300
- boneio-1.2.0/boneio/core/manager/templates/gate_cover.py +0 -242
- boneio-1.2.0/boneio/core/manager/templates/thermostat.py +0 -195
- boneio-1.2.0/boneio/core/manager/templates.py +0 -812
- boneio-1.2.0/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -50
- boneio-1.2.0/boneio/modbus/devices/sensors/gdfs.json +0 -35
- boneio-1.2.0/boneio/modbus/devices/sensors/gdfx.json +0 -41
- boneio-1.2.0/boneio/version.py +0 -2
- boneio-1.2.0/boneio/webui/frontend-dist/assets/cssMode-DuLbOZGP.js +0 -4
- boneio-1.2.0/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -12
- boneio-1.2.0/boneio/webui/frontend-dist/assets/htmlMode-pUcd70MQ.js +0 -4
- boneio-1.2.0/boneio/webui/frontend-dist/assets/index-C77sf6bM.css +0 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -2
- boneio-1.2.0/boneio/webui/frontend-dist/schema/template.schema.json +0 -370
- boneio-1.2.0/boneio/webui/routes/templates.py +0 -195
- boneio-1.2.0/boneio/webui/routes/tools.py +0 -261
- boneio-1.2.0/boneio/webui/schema/template.schema.json +0 -370
- boneio-1.2.0/boneio/webui/services/logs.py +0 -361
- {boneio-1.2.0 → boneio-1.2.0.dev2}/LICENSE +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/MANIFEST.in +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/README.md +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/bonecli.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/group/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/group/output_group.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/basic.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/mcp.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/pca.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/pcf.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/package.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/discovery.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/events/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/display.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/local.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/base.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/base.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/system.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/state/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/state/manager.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/monitor.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/filter.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/logger.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/util.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/exceptions.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/interlock.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/cli.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/utils.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/actions.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/events.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/files.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/mqtt.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/state.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/filters.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/id.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/dallas.schema.json +0 -0
- {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/logger.schema.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/web_server.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/pyproject.toml +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/setup.cfg +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/setup.py +0 -0
- {boneio-1.2.0 → boneio-1.2.0.dev2}/tests/test_py313_compatibility.py +0 -0
|
@@ -16,11 +16,11 @@ from boneio.const import (
|
|
|
16
16
|
OPEN,
|
|
17
17
|
OPENING,
|
|
18
18
|
)
|
|
19
|
-
from boneio.core.events import EventBus
|
|
19
|
+
from boneio.core.events import EventBus, async_track_point_in_time, utcnow
|
|
20
20
|
from boneio.core.messaging import BasicMqtt
|
|
21
21
|
from boneio.core.utils import TimePeriod
|
|
22
22
|
from boneio.models import CoverState, PositionDict
|
|
23
|
-
from boneio.components.output import
|
|
23
|
+
from boneio.components.output import MCPOutput
|
|
24
24
|
from boneio.models.events import CoverEvent
|
|
25
25
|
|
|
26
26
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -30,8 +30,8 @@ class BaseCoverABC(ABC):
|
|
|
30
30
|
|
|
31
31
|
@abstractmethod
|
|
32
32
|
def __init__(self, id: str,
|
|
33
|
-
open_relay:
|
|
34
|
-
close_relay:
|
|
33
|
+
open_relay: MCPOutput,
|
|
34
|
+
close_relay: MCPOutput,
|
|
35
35
|
state_save: Callable,
|
|
36
36
|
open_time: TimePeriod,
|
|
37
37
|
close_time: TimePeriod,
|
|
@@ -147,8 +147,8 @@ class BaseVenetianCoverABC:
|
|
|
147
147
|
|
|
148
148
|
class BaseCover(BaseCoverABC, BasicMqtt):
|
|
149
149
|
def __init__(self, id: str,
|
|
150
|
-
open_relay:
|
|
151
|
-
close_relay:
|
|
150
|
+
open_relay: MCPOutput,
|
|
151
|
+
close_relay: MCPOutput,
|
|
152
152
|
state_save: Callable,
|
|
153
153
|
open_time: TimePeriod,
|
|
154
154
|
close_time: TimePeriod,
|
|
@@ -171,7 +171,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
171
171
|
self._position = position
|
|
172
172
|
self._initial_position = None
|
|
173
173
|
self._current_operation = IDLE
|
|
174
|
-
self._last_operation = CLOSING
|
|
175
174
|
_LOGGER.debug(
|
|
176
175
|
"BaseCover %s initialized: open_time=%dms, close_time=%dms, initial_position=%d%%",
|
|
177
176
|
id, self._open_time, self._close_time, position
|
|
@@ -208,8 +207,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
208
207
|
# Send relay states to WebSocket (not MQTT - that's handled by output_type check)
|
|
209
208
|
asyncio.create_task(self._open_relay.async_send_state())
|
|
210
209
|
asyncio.create_task(self._close_relay.async_send_state())
|
|
211
|
-
if self._current_operation in (OPENING, CLOSING):
|
|
212
|
-
self._last_operation = self._current_operation
|
|
213
210
|
self._current_operation = IDLE
|
|
214
211
|
if not on_exit:
|
|
215
212
|
self.send_state(self.state, self.json_position)
|
|
@@ -222,7 +219,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
222
219
|
"Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms)",
|
|
223
220
|
self._id, self._position, estimated_time_s, self._open_time
|
|
224
221
|
)
|
|
225
|
-
self._last_operation = OPENING
|
|
226
222
|
await self.run_cover(current_operation=OPENING)
|
|
227
223
|
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
|
|
228
224
|
|
|
@@ -234,7 +230,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
234
230
|
"Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms)",
|
|
235
231
|
self._id, self._position, estimated_time_s, self._close_time
|
|
236
232
|
)
|
|
237
|
-
self._last_operation = CLOSING
|
|
238
233
|
await self.run_cover(current_operation=CLOSING)
|
|
239
234
|
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
|
|
240
235
|
|
|
@@ -263,16 +258,10 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
263
258
|
|
|
264
259
|
async def toggle(self) -> None:
|
|
265
260
|
_LOGGER.debug("Toggle cover %s from input.", self._id)
|
|
266
|
-
if self.
|
|
267
|
-
await self.stop()
|
|
268
|
-
elif self._position >= 100:
|
|
261
|
+
if self._position > 50:
|
|
269
262
|
await self.close()
|
|
270
|
-
elif self._position <= 0:
|
|
271
|
-
await self.open()
|
|
272
|
-
elif self._last_operation == CLOSING:
|
|
273
|
-
await self.open()
|
|
274
263
|
else:
|
|
275
|
-
await self.
|
|
264
|
+
await self.open()
|
|
276
265
|
|
|
277
266
|
async def toggle_open(self) -> None:
|
|
278
267
|
_LOGGER.debug("Toggle open cover %s from input.", self._id)
|
|
@@ -288,33 +277,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
288
277
|
else:
|
|
289
278
|
await self.close()
|
|
290
279
|
|
|
291
|
-
async def smart_toggle(self, always_open_till: int = 50) -> None:
|
|
292
|
-
"""Smart toggle with position threshold.
|
|
293
|
-
|
|
294
|
-
If cover is moving → stop.
|
|
295
|
-
If position <= always_open_till → open (to 100%).
|
|
296
|
-
If position > always_open_till → normal toggle (based on last_operation).
|
|
297
|
-
|
|
298
|
-
Args:
|
|
299
|
-
always_open_till: Position threshold (0-100%). Below or equal this
|
|
300
|
-
value the cover will always open. Above it, normal toggle applies.
|
|
301
|
-
"""
|
|
302
|
-
_LOGGER.debug(
|
|
303
|
-
"Smart toggle cover %s (position=%d%%, threshold=%d%%)",
|
|
304
|
-
self._id, self._position, always_open_till,
|
|
305
|
-
)
|
|
306
|
-
if self._current_operation != IDLE:
|
|
307
|
-
await self.stop()
|
|
308
|
-
elif self._position <= always_open_till:
|
|
309
|
-
await self.open()
|
|
310
|
-
elif self._position >= 100:
|
|
311
|
-
await self.close()
|
|
312
|
-
elif self._position <= 0:
|
|
313
|
-
await self.open()
|
|
314
|
-
elif self._last_operation == CLOSING:
|
|
315
|
-
await self.open()
|
|
316
|
-
else:
|
|
317
|
-
await self.close()
|
|
318
280
|
|
|
319
281
|
@property
|
|
320
282
|
def state(self) -> str:
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"""Cover module."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import logging
|
|
7
|
+
import time
|
|
8
|
+
from collections.abc import Callable
|
|
9
|
+
|
|
10
|
+
from boneio.components.output import MCPOutput
|
|
11
|
+
from boneio.const import (
|
|
12
|
+
CLOSE,
|
|
13
|
+
CLOSED,
|
|
14
|
+
CLOSING,
|
|
15
|
+
COVER,
|
|
16
|
+
IDLE,
|
|
17
|
+
OPEN,
|
|
18
|
+
OPENING,
|
|
19
|
+
STOP,
|
|
20
|
+
)
|
|
21
|
+
from boneio.core.events import EventBus
|
|
22
|
+
from boneio.core.utils import TimePeriod
|
|
23
|
+
from boneio.core.messaging import BasicMqtt
|
|
24
|
+
from boneio.models import CoverState
|
|
25
|
+
from boneio.models.events import CoverEvent
|
|
26
|
+
|
|
27
|
+
_LOGGER = logging.getLogger(__name__)
|
|
28
|
+
DEFAULT_RESTORED_STATE = {"position": 100}
|
|
29
|
+
COVER_COMMANDS = {
|
|
30
|
+
OPEN: "open_cover",
|
|
31
|
+
CLOSE: "close_cover",
|
|
32
|
+
STOP: "stop",
|
|
33
|
+
"toggle": "toggle",
|
|
34
|
+
"toggle_open": "toggle_open",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class RelayHelper:
|
|
39
|
+
"""Relay helper for cover either open/close."""
|
|
40
|
+
|
|
41
|
+
def __init__(self, relay: MCPOutput, time: TimePeriod) -> None:
|
|
42
|
+
"""Initialize helper."""
|
|
43
|
+
self._relay = relay
|
|
44
|
+
self._steps = 100 / time.total_seconds
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def relay(self) -> MCPOutput:
|
|
48
|
+
"""Get relay."""
|
|
49
|
+
return self._relay
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def steps(self) -> int:
|
|
53
|
+
"""Get steps for each time."""
|
|
54
|
+
return int(self._steps)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class PreviousCover(BasicMqtt):
|
|
58
|
+
"""Cover class of boneIO"""
|
|
59
|
+
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
id: str,
|
|
63
|
+
open_relay: MCPOutput,
|
|
64
|
+
close_relay: MCPOutput,
|
|
65
|
+
state_save: Callable,
|
|
66
|
+
open_time: TimePeriod,
|
|
67
|
+
close_time: TimePeriod,
|
|
68
|
+
event_bus: EventBus,
|
|
69
|
+
restored_state: dict = DEFAULT_RESTORED_STATE,
|
|
70
|
+
**kwargs,
|
|
71
|
+
) -> None:
|
|
72
|
+
"""Initialize cover class."""
|
|
73
|
+
self._loop = asyncio.get_event_loop()
|
|
74
|
+
self._id = id
|
|
75
|
+
super().__init__(id=id, name=id, topic_type=COVER, **kwargs)
|
|
76
|
+
self._lock = asyncio.Lock()
|
|
77
|
+
self._state_save = state_save
|
|
78
|
+
self._open = RelayHelper(relay=open_relay, time=open_time)
|
|
79
|
+
self._close = RelayHelper(relay=close_relay, time=close_time)
|
|
80
|
+
self._open_time = open_time
|
|
81
|
+
self._close_time = close_time
|
|
82
|
+
_LOGGER.debug(
|
|
83
|
+
"Cover %s initialized: open_time=%s (%dms), close_time=%s (%dms), open_steps=%d/s, close_steps=%d/s",
|
|
84
|
+
id, open_time, open_time.total_milliseconds, close_time, close_time.total_milliseconds,
|
|
85
|
+
self._open.steps, self._close.steps
|
|
86
|
+
)
|
|
87
|
+
self._set_position = None
|
|
88
|
+
self._current_operation = IDLE
|
|
89
|
+
self._position = float(restored_state.get("position", DEFAULT_RESTORED_STATE["position"]))
|
|
90
|
+
self._requested_closing = True
|
|
91
|
+
self._event_bus = event_bus
|
|
92
|
+
self._timer_handle = None
|
|
93
|
+
self._last_timestamp = 0.0
|
|
94
|
+
if self._position is None:
|
|
95
|
+
self._closed = True
|
|
96
|
+
else:
|
|
97
|
+
self._closed = self._position <= 0
|
|
98
|
+
self._event_bus.add_sigterm_listener(self.on_exit)
|
|
99
|
+
self._loop.call_soon_threadsafe(
|
|
100
|
+
self._loop.call_later,
|
|
101
|
+
0.5,
|
|
102
|
+
self.send_state,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def run_cover(
|
|
106
|
+
self,
|
|
107
|
+
current_operation: str,
|
|
108
|
+
) -> None:
|
|
109
|
+
"""Run cover engine."""
|
|
110
|
+
if self._current_operation != IDLE:
|
|
111
|
+
self._stop_cover()
|
|
112
|
+
self._current_operation = current_operation
|
|
113
|
+
|
|
114
|
+
def get_relays():
|
|
115
|
+
if current_operation == OPENING:
|
|
116
|
+
return (self._open.relay, self._close.relay)
|
|
117
|
+
else:
|
|
118
|
+
return (self._close.relay, self._open.relay)
|
|
119
|
+
|
|
120
|
+
(relay, inverted_relay) = get_relays()
|
|
121
|
+
async with self._lock:
|
|
122
|
+
if inverted_relay.is_active:
|
|
123
|
+
inverted_relay.turn_off()
|
|
124
|
+
self._timer_handle = self._event_bus.add_every_second_listener(
|
|
125
|
+
f"{COVER}{self.id}", self.listen_cover
|
|
126
|
+
)
|
|
127
|
+
relay.turn_on()
|
|
128
|
+
|
|
129
|
+
def on_exit(self) -> None:
|
|
130
|
+
"""Stop on exit."""
|
|
131
|
+
self._stop_cover(on_exit=True)
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def state(self) -> str:
|
|
135
|
+
"""Current state of cover."""
|
|
136
|
+
return CLOSED if self._closed else OPEN
|
|
137
|
+
|
|
138
|
+
async def stop(self) -> None:
|
|
139
|
+
"""Public Stop cover graceful."""
|
|
140
|
+
_LOGGER.info("Stopping cover %s.", self._id)
|
|
141
|
+
if self._current_operation != IDLE:
|
|
142
|
+
self._stop_cover(on_exit=False)
|
|
143
|
+
await self.async_send_state()
|
|
144
|
+
|
|
145
|
+
async def async_send_state(self) -> None:
|
|
146
|
+
"""Send state to Websocket on action asynchronously."""
|
|
147
|
+
self._last_timestamp = time.time()
|
|
148
|
+
event = CoverState(
|
|
149
|
+
id=self.id,
|
|
150
|
+
name=self.name,
|
|
151
|
+
state=self.state,
|
|
152
|
+
position=int(round(self._position, 0)),
|
|
153
|
+
kind=self.kind,
|
|
154
|
+
timestamp=self.last_timestamp,
|
|
155
|
+
current_operation=self._current_operation,
|
|
156
|
+
)
|
|
157
|
+
self._event_bus.trigger_event(CoverEvent(entity_id=self.id, state=event))
|
|
158
|
+
|
|
159
|
+
def send_state(self) -> None:
|
|
160
|
+
"""Send state of cover to mqtt."""
|
|
161
|
+
self._message_bus.send_message(
|
|
162
|
+
topic=f"{self._send_topic}/state", payload=self.state
|
|
163
|
+
)
|
|
164
|
+
pos = round(self._position, 0)
|
|
165
|
+
self._message_bus.send_message(topic=f"{self._send_topic}/pos", payload={ "position": str(pos) })
|
|
166
|
+
self._state_save(value={"position": pos})
|
|
167
|
+
|
|
168
|
+
def _stop_cover(self, on_exit=False) -> None:
|
|
169
|
+
"""Stop cover."""
|
|
170
|
+
self._open.relay.turn_off()
|
|
171
|
+
self._close.relay.turn_off()
|
|
172
|
+
if self._timer_handle is not None:
|
|
173
|
+
self._event_bus.remove_every_second_listener(f"{COVER}{self.id}")
|
|
174
|
+
self._timer_handle = None
|
|
175
|
+
self._set_position = None
|
|
176
|
+
if not on_exit:
|
|
177
|
+
self.send_state()
|
|
178
|
+
self._current_operation = IDLE
|
|
179
|
+
|
|
180
|
+
@property
|
|
181
|
+
def current_cover_position(self) -> int:
|
|
182
|
+
"""Return the current position of the cover."""
|
|
183
|
+
return int(round(self._position, 0))
|
|
184
|
+
|
|
185
|
+
def listen_cover(self, *args) -> None:
|
|
186
|
+
"""Listen for change in cover."""
|
|
187
|
+
if self._current_operation == IDLE:
|
|
188
|
+
return
|
|
189
|
+
|
|
190
|
+
def get_step():
|
|
191
|
+
"""Get step for current operation."""
|
|
192
|
+
if self._requested_closing:
|
|
193
|
+
return -self._close.steps
|
|
194
|
+
else:
|
|
195
|
+
return self._open.steps
|
|
196
|
+
|
|
197
|
+
step = get_step()
|
|
198
|
+
self._position += step
|
|
199
|
+
rounded_pos = round(self._position, 0)
|
|
200
|
+
if self._set_position:
|
|
201
|
+
# Set position is only working for every 10%, so round to nearest 10.
|
|
202
|
+
# Except for start moving time
|
|
203
|
+
if (
|
|
204
|
+
self._requested_closing and rounded_pos < 95
|
|
205
|
+
) or rounded_pos > 5:
|
|
206
|
+
rounded_pos = round(self._position, -1)
|
|
207
|
+
else:
|
|
208
|
+
if rounded_pos > 100:
|
|
209
|
+
rounded_pos = 100
|
|
210
|
+
elif rounded_pos < 0:
|
|
211
|
+
rounded_pos = 0
|
|
212
|
+
self._message_bus.send_message(topic=f"{self._send_topic}/pos", payload={"position": str(rounded_pos)})
|
|
213
|
+
asyncio.create_task(self.async_send_state())
|
|
214
|
+
if rounded_pos == self._set_position or (
|
|
215
|
+
self._set_position is None
|
|
216
|
+
and (rounded_pos >= 100 or rounded_pos <= 0)
|
|
217
|
+
):
|
|
218
|
+
self._position = rounded_pos
|
|
219
|
+
self._closed = self.current_cover_position <= 0
|
|
220
|
+
self._stop_cover()
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
self._closed = self.current_cover_position <= 0
|
|
224
|
+
|
|
225
|
+
async def close_cover(self) -> None:
|
|
226
|
+
"""Close cover."""
|
|
227
|
+
if self._position == 0:
|
|
228
|
+
return
|
|
229
|
+
if self._position is None:
|
|
230
|
+
self._closed = True
|
|
231
|
+
return
|
|
232
|
+
estimated_time_s = self._position / self._close.steps
|
|
233
|
+
_LOGGER.info(
|
|
234
|
+
"Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms, steps=%d/s)",
|
|
235
|
+
self._id, self._position, estimated_time_s, self._close_time.total_milliseconds, self._close.steps
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
self._requested_closing = True
|
|
239
|
+
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
|
|
240
|
+
await self.run_cover(
|
|
241
|
+
current_operation=CLOSING,
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
async def open_cover(self) -> None:
|
|
245
|
+
"""Open cover."""
|
|
246
|
+
if self._position == 100:
|
|
247
|
+
return
|
|
248
|
+
if self._position is None:
|
|
249
|
+
self._closed = False
|
|
250
|
+
return
|
|
251
|
+
estimated_time_s = (100 - self._position) / self._open.steps
|
|
252
|
+
_LOGGER.info(
|
|
253
|
+
"Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms, steps=%d/s)",
|
|
254
|
+
self._id, self._position, estimated_time_s, self._open_time.total_milliseconds, self._open.steps
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
self._requested_closing = False
|
|
258
|
+
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
|
|
259
|
+
await self.run_cover(
|
|
260
|
+
current_operation=OPENING,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
async def set_cover_position(self, position: int) -> None:
|
|
264
|
+
"""Move cover to a specific position."""
|
|
265
|
+
set_position = round(position, -1)
|
|
266
|
+
if self._position == position or set_position == self._set_position:
|
|
267
|
+
return
|
|
268
|
+
if self._set_position:
|
|
269
|
+
self._stop_cover(on_exit=True)
|
|
270
|
+
self._set_position = set_position
|
|
271
|
+
|
|
272
|
+
self._requested_closing = set_position < self._position
|
|
273
|
+
current_operation = CLOSING if self._requested_closing else OPENING
|
|
274
|
+
|
|
275
|
+
# Calculate estimated time
|
|
276
|
+
position_diff = abs(self._position - set_position)
|
|
277
|
+
if self._requested_closing:
|
|
278
|
+
steps = self._close.steps
|
|
279
|
+
time_config = self._close_time
|
|
280
|
+
else:
|
|
281
|
+
steps = self._open.steps
|
|
282
|
+
time_config = self._open_time
|
|
283
|
+
estimated_time_s = position_diff / steps if steps > 0 else 0
|
|
284
|
+
|
|
285
|
+
_LOGGER.info(
|
|
286
|
+
"Setting cover %s position from %d%% to %d%% (%s). Estimated time: %.1fs (time_config=%dms, steps=%d/s)",
|
|
287
|
+
self._id, self._position, set_position, current_operation,
|
|
288
|
+
estimated_time_s, time_config.total_milliseconds, steps
|
|
289
|
+
)
|
|
290
|
+
self._message_bus.send_message(
|
|
291
|
+
topic=f"{self._send_topic}/state", payload=current_operation
|
|
292
|
+
)
|
|
293
|
+
await self.run_cover(
|
|
294
|
+
current_operation=current_operation,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
async def open(self) -> None:
|
|
298
|
+
_LOGGER.debug("Opening cover %s.", self._id)
|
|
299
|
+
await self.open_cover()
|
|
300
|
+
|
|
301
|
+
async def close(self) -> None:
|
|
302
|
+
_LOGGER.debug("Closing cover %s.", self._id)
|
|
303
|
+
await self.close_cover()
|
|
304
|
+
|
|
305
|
+
async def toggle(self) -> None:
|
|
306
|
+
_LOGGER.debug("Toggle cover %s from input.", self._id)
|
|
307
|
+
if self.state == CLOSED:
|
|
308
|
+
await self.close()
|
|
309
|
+
else:
|
|
310
|
+
await self.open()
|
|
311
|
+
|
|
312
|
+
async def toggle_open(self) -> None:
|
|
313
|
+
_LOGGER.debug("Toggle open cover %s from input.", self._id)
|
|
314
|
+
if self._current_operation != IDLE:
|
|
315
|
+
await self.stop()
|
|
316
|
+
else:
|
|
317
|
+
await self.open()
|
|
318
|
+
|
|
319
|
+
async def toggle_close(self) -> None:
|
|
320
|
+
_LOGGER.debug("Toggle close cover %s from input.", self._id)
|
|
321
|
+
if self._current_operation != IDLE:
|
|
322
|
+
await self.stop()
|
|
323
|
+
else:
|
|
324
|
+
await self.close()
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def last_timestamp(self) -> float:
|
|
328
|
+
return self._last_timestamp
|
|
329
|
+
|
|
330
|
+
@property
|
|
331
|
+
def position(self) -> int:
|
|
332
|
+
return int(round(self._position, 0))
|
|
333
|
+
|
|
334
|
+
@property
|
|
335
|
+
def current_operation(self) -> str:
|
|
336
|
+
return self._current_operation
|
|
337
|
+
|
|
338
|
+
@property
|
|
339
|
+
def kind(self) -> str:
|
|
340
|
+
return "previous"
|
|
341
|
+
|
|
342
|
+
def update_config_times(self, config: dict) -> None:
|
|
343
|
+
"""Update cover timing configuration.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
config: Dictionary with timing values as TimePeriod objects.
|
|
347
|
+
Keys: open_time, close_time
|
|
348
|
+
"""
|
|
349
|
+
if "open_time" in config:
|
|
350
|
+
self._open_time = config["open_time"]
|
|
351
|
+
self._open = RelayHelper(relay=self._open.relay, time=config["open_time"])
|
|
352
|
+
if "close_time" in config:
|
|
353
|
+
self._close_time = config["close_time"]
|
|
354
|
+
self._close = RelayHelper(relay=self._close.relay, time=config["close_time"])
|
|
@@ -10,7 +10,7 @@ from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
|
|
|
10
10
|
from boneio.components.cover.cover import BaseCover
|
|
11
11
|
from boneio.core.events import EventBus
|
|
12
12
|
from boneio.core.utils import TimePeriod
|
|
13
|
-
from boneio.components.output import
|
|
13
|
+
from boneio.components.output import MCPOutput
|
|
14
14
|
|
|
15
15
|
_LOGGER = logging.getLogger(__name__)
|
|
16
16
|
DEFAULT_RESTORED_STATE = {"position": 100}
|
|
@@ -19,8 +19,8 @@ class TimeBasedCover(BaseCover):
|
|
|
19
19
|
"""Time-based cover algorithm similar to ESPHome."""
|
|
20
20
|
def __init__(
|
|
21
21
|
self,
|
|
22
|
-
open_relay:
|
|
23
|
-
close_relay:
|
|
22
|
+
open_relay: MCPOutput,
|
|
23
|
+
close_relay: MCPOutput,
|
|
24
24
|
state_save: Callable,
|
|
25
25
|
open_time: TimePeriod,
|
|
26
26
|
close_time: TimePeriod,
|
|
@@ -31,7 +31,6 @@ class ClickState:
|
|
|
31
31
|
"""State for tracking multi-click detection."""
|
|
32
32
|
click_count: int = 0
|
|
33
33
|
last_press_ts: float | None = None
|
|
34
|
-
last_press_loop_ts: float | None = None # Event loop time of last press (for duration calc)
|
|
35
34
|
last_release_ts: float | None = None
|
|
36
35
|
finalizer: asyncio.TimerHandle | None = None
|
|
37
36
|
finalizer_scheduled_loop_ts: float | None = None
|
|
@@ -47,7 +46,6 @@ class ClickState:
|
|
|
47
46
|
# Long hold periodic events
|
|
48
47
|
long_hold_periodic_timer: asyncio.TimerHandle | None = None
|
|
49
48
|
executed_long_actions: set[int] = field(default_factory=set) # Track which long actions already executed
|
|
50
|
-
last_repeat_times: dict[int, float] = field(default_factory=dict) # Track last execution time per repeat action index
|
|
51
49
|
|
|
52
50
|
|
|
53
51
|
@dataclass
|
|
@@ -78,7 +76,6 @@ class MultiClickDetector:
|
|
|
78
76
|
enable_triple_click: bool = False,
|
|
79
77
|
name: str = "unknown",
|
|
80
78
|
pin: str = "unknown",
|
|
81
|
-
max_long_press_seconds: float = 120.0,
|
|
82
79
|
):
|
|
83
80
|
"""Initialize multiclick detector.
|
|
84
81
|
|
|
@@ -94,7 +91,6 @@ class MultiClickDetector:
|
|
|
94
91
|
enable_triple_click: Enable triple click detection (default: False)
|
|
95
92
|
name: Name of the input
|
|
96
93
|
pin: Pin name for logging
|
|
97
|
-
max_long_press_seconds: Safety timeout for long press in seconds (default: 120s)
|
|
98
94
|
"""
|
|
99
95
|
self._loop = loop
|
|
100
96
|
self._callback = callback
|
|
@@ -107,7 +103,6 @@ class MultiClickDetector:
|
|
|
107
103
|
self._enable_triple_click = enable_triple_click
|
|
108
104
|
self._name = name
|
|
109
105
|
self._pin = pin
|
|
110
|
-
self._max_long_press_seconds = max_long_press_seconds
|
|
111
106
|
self._state = ClickState()
|
|
112
107
|
|
|
113
108
|
# Pre-compute which click types should be delayed in exclusive mode
|
|
@@ -361,14 +356,13 @@ class MultiClickDetector:
|
|
|
361
356
|
|
|
362
357
|
def _detect_long_press(self) -> None:
|
|
363
358
|
"""Detect and report a long press and start periodic updates."""
|
|
364
|
-
if not self._state.
|
|
359
|
+
if not self._state.last_press_ts:
|
|
365
360
|
return
|
|
366
361
|
|
|
367
362
|
# Reset executed actions for new long press
|
|
368
363
|
self._state.executed_long_actions = set()
|
|
369
|
-
self._state.last_repeat_times = {}
|
|
370
364
|
|
|
371
|
-
duration = self._loop.time() - self._state.
|
|
365
|
+
duration = self._loop.time() - self._state.last_press_ts
|
|
372
366
|
|
|
373
367
|
_LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
|
|
374
368
|
|
|
@@ -387,24 +381,11 @@ class MultiClickDetector:
|
|
|
387
381
|
|
|
388
382
|
def _send_periodic_long_event(self) -> None:
|
|
389
383
|
"""Send periodic 'long' event with updated duration."""
|
|
390
|
-
if not self._state.
|
|
384
|
+
if not self._state.last_press_ts or self._state.last_release_ts:
|
|
391
385
|
# Button released or invalid state
|
|
392
386
|
return
|
|
393
387
|
|
|
394
|
-
duration = self._loop.time() - self._state.
|
|
395
|
-
|
|
396
|
-
# Safety timeout: stop periodic events if duration exceeds max
|
|
397
|
-
if duration > self._max_long_press_seconds:
|
|
398
|
-
_LOGGER.warning(
|
|
399
|
-
"Safety timeout: long press on %s (%s) exceeded %.0fs (duration=%.1fs). "
|
|
400
|
-
"Possible missed RELEASE event. Forcing stop.",
|
|
401
|
-
self._name,
|
|
402
|
-
self._pin,
|
|
403
|
-
self._max_long_press_seconds,
|
|
404
|
-
duration,
|
|
405
|
-
)
|
|
406
|
-
self._force_stop_long_press()
|
|
407
|
-
return
|
|
388
|
+
duration = self._loop.time() - self._state.last_press_ts
|
|
408
389
|
|
|
409
390
|
_LOGGER.debug(
|
|
410
391
|
"Periodic long event on %s (%s), duration=%.3fs",
|
|
@@ -421,34 +402,6 @@ class MultiClickDetector:
|
|
|
421
402
|
0.2,
|
|
422
403
|
self._send_periodic_long_event
|
|
423
404
|
)
|
|
424
|
-
|
|
425
|
-
def _force_stop_long_press(self) -> None:
|
|
426
|
-
"""Force stop a long press due to safety timeout (missed RELEASE).
|
|
427
|
-
|
|
428
|
-
Cleans up all long-press related state as if a RELEASE event occurred.
|
|
429
|
-
"""
|
|
430
|
-
if self._state.long_hold_periodic_timer:
|
|
431
|
-
self._state.long_hold_periodic_timer.cancel()
|
|
432
|
-
self._state.long_hold_periodic_timer = None
|
|
433
|
-
|
|
434
|
-
if self._state.long_press_timer:
|
|
435
|
-
self._state.long_press_timer.cancel()
|
|
436
|
-
self._state.long_press_timer = None
|
|
437
|
-
self._state.long_press_scheduled_loop_ts = None
|
|
438
|
-
|
|
439
|
-
# Simulate release: use last_press_ts (kernel time) as base to stay
|
|
440
|
-
# consistent with debounce comparisons that use kernel timestamps
|
|
441
|
-
self._state.last_release_ts = self._state.last_press_ts or 0.0
|
|
442
|
-
|
|
443
|
-
# Reset long press action tracking
|
|
444
|
-
self._state.executed_long_actions = set()
|
|
445
|
-
self._state.last_repeat_times = {}
|
|
446
|
-
|
|
447
|
-
_LOGGER.info(
|
|
448
|
-
"Forced long press stop on %s (%s) - state cleaned up",
|
|
449
|
-
self._name,
|
|
450
|
-
self._pin,
|
|
451
|
-
)
|
|
452
405
|
|
|
453
406
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
454
407
|
"""Process a GPIO edge event and update click state.
|
|
@@ -480,7 +433,6 @@ class MultiClickDetector:
|
|
|
480
433
|
|
|
481
434
|
_LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
|
|
482
435
|
self._state.last_press_ts = timestamp_s
|
|
483
|
-
self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
|
|
484
436
|
self._state.last_release_ts = None # Reset release timestamp for new press
|
|
485
437
|
|
|
486
438
|
# Cancel any pending finalizer for a multi-click sequence
|
|
@@ -516,7 +468,7 @@ class MultiClickDetector:
|
|
|
516
468
|
elif event.event_type is event.Type.RISING_EDGE:
|
|
517
469
|
# Button released (RISING_EDGE on BeagleBone with pull-up)
|
|
518
470
|
|
|
519
|
-
# Software debounce
|
|
471
|
+
# Software debounce
|
|
520
472
|
if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
|
|
521
473
|
delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
|
|
522
474
|
_LOGGER.debug(
|
|
@@ -525,20 +477,8 @@ class MultiClickDetector:
|
|
|
525
477
|
delta_ms,
|
|
526
478
|
)
|
|
527
479
|
return
|
|
528
|
-
|
|
529
|
-
# Cross-debounce: ignore release too close to press (bounce on rising edge)
|
|
530
|
-
if self._state.last_press_ts and (timestamp_s - self._state.last_press_ts) < self._debounce_seconds:
|
|
531
|
-
delta_ms = (timestamp_s - self._state.last_press_ts) * 1000
|
|
532
|
-
_LOGGER.debug(
|
|
533
|
-
"Ignoring bounced release on %s (%.3f ms since press, debounce %.3f ms)",
|
|
534
|
-
self._name,
|
|
535
|
-
delta_ms,
|
|
536
|
-
self._debounce_seconds * 1000,
|
|
537
|
-
)
|
|
538
|
-
return
|
|
539
480
|
|
|
540
|
-
|
|
541
|
-
_LOGGER.debug("RELEASED: %s (%s) after %.1f ms", self._name, self._pin, press_duration_ms)
|
|
481
|
+
_LOGGER.debug("RELEASED: %s (%s)", self._name, self._pin)
|
|
542
482
|
self._state.last_release_ts = timestamp_s
|
|
543
483
|
|
|
544
484
|
_LOGGER.debug(
|
|
@@ -556,8 +496,8 @@ class MultiClickDetector:
|
|
|
556
496
|
# Note: The callback creates an async task, so we need to delay
|
|
557
497
|
# the reset of executed_actions to allow the async handler to
|
|
558
498
|
# read the current state before it's cleared
|
|
559
|
-
if self._state.
|
|
560
|
-
duration =
|
|
499
|
+
if self._state.last_press_ts:
|
|
500
|
+
duration = timestamp_s - self._state.last_press_ts
|
|
561
501
|
_LOGGER.debug(
|
|
562
502
|
"Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
|
|
563
503
|
self._name,
|
|
@@ -571,7 +511,6 @@ class MultiClickDetector:
|
|
|
571
511
|
# need to give it time to start and read executed_long_actions.
|
|
572
512
|
def reset_executed_actions():
|
|
573
513
|
self._state.executed_long_actions = set()
|
|
574
|
-
self._state.last_repeat_times = {}
|
|
575
514
|
_LOGGER.debug("Reset executed_long_actions for %s", self._name)
|
|
576
515
|
self._loop.call_later(0.05, reset_executed_actions)
|
|
577
516
|
|