boneIO 1.1.0.dev6__tar.gz → 1.2.0__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.1.0.dev6/boneio.egg-info → boneio-1.2.0}/PKG-INFO +2 -2
- boneio-1.2.0/boneio/components/cover/__init__.py +5 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/cover.py +46 -8
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/time_based.py +3 -3
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/detectors.py +69 -8
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/event.py +21 -1
- boneio-1.2.0/boneio/components/template/__init__.py +15 -0
- boneio-1.2.0/boneio/components/template/alarm_panel.py +755 -0
- boneio-1.2.0/boneio/components/template/gate_cover.py +456 -0
- boneio-1.2.0/boneio/components/template/thermostat.py +313 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/const.py +30 -0
- boneio-1.2.0/boneio/core/cloud/__init__.py +5 -0
- boneio-1.2.0/boneio/core/cloud/data/docker-compose-cloud.yaml +38 -0
- boneio-1.2.0/boneio/core/cloud/data/docker-compose.yaml +37 -0
- boneio-1.2.0/boneio/core/cloud/data/init-certs-cloud.sh +152 -0
- boneio-1.2.0/boneio/core/cloud/registration.py +539 -0
- boneio-1.2.0/boneio/core/cloud/secrets.py +56 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/config_helper.py +37 -1
- boneio-1.2.0/boneio/core/config/migrations/__init__.py +222 -0
- boneio-1.2.0/boneio/core/config/migrations/v1_proxy_port.py +75 -0
- boneio-1.2.0/boneio/core/config/migrations/v2_transition.py +109 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/schema_converter.py +3 -3
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/yaml_util.py +150 -86
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/events/bus.py +1 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/__init__.py +3 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/covers.py +75 -37
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/inputs.py +118 -35
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/manager.py +156 -131
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/modbus.py +11 -1
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/outputs.py +39 -15
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/remote.py +109 -8
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/sensors.py +140 -160
- boneio-1.2.0/boneio/core/manager/templates/__init__.py +283 -0
- boneio-1.2.0/boneio/core/manager/templates/alarm.py +300 -0
- boneio-1.2.0/boneio/core/manager/templates/gate_cover.py +242 -0
- boneio-1.2.0/boneio/core/manager/templates/thermostat.py +195 -0
- boneio-1.2.0/boneio/core/manager/templates.py +812 -0
- boneio-1.2.0/boneio/core/manager/update.py +641 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/mqtt.py +8 -6
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/esphome.py +150 -24
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/wled.py +7 -6
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/host_data.py +2 -2
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/timeperiod.py +51 -0
- boneio-1.2.0/boneio/example_config/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/oled.py +254 -7
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/base.py +11 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/homeassistant.py +165 -3
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/client.py +41 -4
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/coordinator.py +37 -13
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/r4dcb08.json +1 -1
- boneio-1.2.0/boneio/modbus/devices/sensors/boneio-edge-temp.json +50 -0
- boneio-1.2.0/boneio/modbus/devices/sensors/gdfs.json +35 -0
- boneio-1.2.0/boneio/modbus/devices/sensors/gdfx.json +41 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/logs.py +3 -1
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/runner.py +29 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions.yaml +70 -8
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/schema.yaml +319 -1
- boneio-1.2.0/boneio/version.py +2 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/app.py +100 -6
- boneio-1.2.0/boneio/webui/frontend-dist/assets/cssMode-DuLbOZGP.js +4 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +12 -0
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/freemarker2-DXMvZO7c.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/freemarker2-DbD6A6sh.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/handlebars-DldmTvGn.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/handlebars-CTdnPo2i.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/html-BeFUXNc_.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/html-BZoYb7JD.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/htmlMode-pUcd70MQ.js +4 -0
- boneio-1.2.0/boneio/webui/frontend-dist/assets/index-C77sf6bM.css +1 -0
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/index-AE1j15fF.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/index-DeLJ1p9c.js +256 -256
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/javascript-tD5AV0w8.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/javascript-By5E2Dlg.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +22 -22
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/jsonMode-D8KZNSNi.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/jsonMode-ZwdsxjyQ.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/liquid-B4w537sW.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/liquid-DTSAXFsq.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/mdx-DB1izvJl.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/mdx-AOxBxyYF.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/python-CG6dl7EF.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/python-aHpP8PXg.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/razor-BqVac-Wv.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/razor-DlXazXnf.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/tsMode-CvBEEAxI.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/tsMode-Bg9vUHAv.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/typescript-BIvQiQJr.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/typescript-XXBI8V-E.js +1 -1
- boneio-1.2.0/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/xml-BtFDS-MH.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/xml-C6ha-iag.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/yaml-D0Bwrhp9.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml-DMW4SkKa.js +1 -1
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +200 -200
- boneio-1.2.0/boneio/webui/frontend-dist/boneio-192.png +0 -0
- boneio-1.2.0/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/index.html +9 -2
- {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +128 -6
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/boneio.schema.json +9 -0
- {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/config.schema.json +1055 -37
- {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/cover.schema.json +1 -2
- {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/event.schema.json +471 -21
- {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/modbus.schema.json +20 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/modbus_devices.schema.json +14 -2
- boneio-1.2.0/boneio/webui/frontend-dist/schema/template.schema.json +370 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/web.schema.json +43 -1
- boneio-1.2.0/boneio/webui/frontend-dist/sw.js +1 -0
- boneio-1.2.0/boneio/webui/frontend-dist/workbox-226dbdbf.js +1 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/__init__.py +4 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/config.py +75 -1
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/covers.py +1 -2
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/modbus.py +62 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/sensors.py +17 -0
- boneio-1.2.0/boneio/webui/routes/system.py +648 -0
- boneio-1.2.0/boneio/webui/routes/templates.py +195 -0
- boneio-1.2.0/boneio/webui/routes/tools.py +261 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/update.py +87 -133
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/binary_sensor.schema.json +128 -6
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/boneio.schema.json +9 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/config.schema.json +1055 -37
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/cover.schema.json +1 -2
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/event.schema.json +471 -21
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/modbus.schema.json +20 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/modbus_devices.schema.json +14 -2
- boneio-1.2.0/boneio/webui/schema/template.schema.json +370 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/web.schema.json +43 -1
- boneio-1.2.0/boneio/webui/services/logs.py +361 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0/boneio.egg-info}/PKG-INFO +2 -2
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/SOURCES.txt +77 -47
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/requires.txt +1 -1
- {boneio-1.1.0.dev6 → boneio-1.2.0}/pyproject.toml +2 -2
- boneio-1.1.0.dev6/boneio/components/cover/__init__.py +0 -6
- boneio-1.1.0.dev6/boneio/components/cover/previous.py +0 -354
- boneio-1.1.0.dev6/boneio/core/manager/update.py +0 -341
- boneio-1.1.0.dev6/boneio/version.py +0 -2
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/cssMode-SLqjH3qK.js +0 -4
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -12
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/htmlMode-D4OnYTmf.js +0 -4
- boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +0 -1
- boneio-1.1.0.dev6/boneio/webui/routes/system.py +0 -314
- boneio-1.1.0.dev6/boneio/webui/services/logs.py +0 -242
- {boneio-1.1.0.dev6 → boneio-1.2.0}/LICENSE +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/MANIFEST.in +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/README.md +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/bonecli.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/group/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/group/output_group.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/basic.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/mcp.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/pca.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/pcf.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/__init__.py +0 -0
- {boneio-1.1.0.dev6/boneio/example_config → boneio-1.2.0/boneio/core/cloud/data}/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/package.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/discovery.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/events/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/display.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/local.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/base.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/base.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/system.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/state/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/state/manager.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/monitor.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/filter.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/logger.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/util.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/exceptions.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/interlock.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/cli.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/utils.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/actions.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/events.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/files.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/mqtt.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/state.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/filters.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/id.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/adc.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/areas.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/dallas.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/ina219.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/lm75.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/logger.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/oled.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/output.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/output_group.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/sensor.schema.json +0 -0
- {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/web_server.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/setup.cfg +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/setup.py +0 -0
- {boneio-1.1.0.dev6 → boneio-1.2.0}/tests/test_py313_compatibility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Python App for BoneIO
|
|
5
5
|
Author-email: Paweł Szafer <pszafer@gmail.com>
|
|
6
6
|
License: GNU General Public License v3.0
|
|
@@ -28,7 +28,7 @@ Requires-Dist: pydantic==2.11.9
|
|
|
28
28
|
Requires-Dist: hypercorn==0.17.3
|
|
29
29
|
Requires-Dist: websockets==15.0.1
|
|
30
30
|
Requires-Dist: python-jose[cryptography]==3.5.0
|
|
31
|
-
Requires-Dist: python-multipart==0.0.
|
|
31
|
+
Requires-Dist: python-multipart==0.0.22
|
|
32
32
|
Requires-Dist: qrcode==8.2
|
|
33
33
|
Requires-Dist: gpiod==2.3.0
|
|
34
34
|
Requires-Dist: requests==2.32.5
|
|
@@ -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
|
|
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 BasicOutput
|
|
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: BasicOutput,
|
|
34
|
+
close_relay: BasicOutput,
|
|
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: BasicOutput,
|
|
151
|
+
close_relay: BasicOutput,
|
|
152
152
|
state_save: Callable,
|
|
153
153
|
open_time: TimePeriod,
|
|
154
154
|
close_time: TimePeriod,
|
|
@@ -171,6 +171,7 @@ 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
|
|
174
175
|
_LOGGER.debug(
|
|
175
176
|
"BaseCover %s initialized: open_time=%dms, close_time=%dms, initial_position=%d%%",
|
|
176
177
|
id, self._open_time, self._close_time, position
|
|
@@ -207,6 +208,8 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
207
208
|
# Send relay states to WebSocket (not MQTT - that's handled by output_type check)
|
|
208
209
|
asyncio.create_task(self._open_relay.async_send_state())
|
|
209
210
|
asyncio.create_task(self._close_relay.async_send_state())
|
|
211
|
+
if self._current_operation in (OPENING, CLOSING):
|
|
212
|
+
self._last_operation = self._current_operation
|
|
210
213
|
self._current_operation = IDLE
|
|
211
214
|
if not on_exit:
|
|
212
215
|
self.send_state(self.state, self.json_position)
|
|
@@ -219,6 +222,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
219
222
|
"Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms)",
|
|
220
223
|
self._id, self._position, estimated_time_s, self._open_time
|
|
221
224
|
)
|
|
225
|
+
self._last_operation = OPENING
|
|
222
226
|
await self.run_cover(current_operation=OPENING)
|
|
223
227
|
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
|
|
224
228
|
|
|
@@ -230,6 +234,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
230
234
|
"Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms)",
|
|
231
235
|
self._id, self._position, estimated_time_s, self._close_time
|
|
232
236
|
)
|
|
237
|
+
self._last_operation = CLOSING
|
|
233
238
|
await self.run_cover(current_operation=CLOSING)
|
|
234
239
|
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
|
|
235
240
|
|
|
@@ -258,10 +263,16 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
258
263
|
|
|
259
264
|
async def toggle(self) -> None:
|
|
260
265
|
_LOGGER.debug("Toggle cover %s from input.", self._id)
|
|
261
|
-
if self.
|
|
266
|
+
if self._current_operation != IDLE:
|
|
267
|
+
await self.stop()
|
|
268
|
+
elif self._position >= 100:
|
|
262
269
|
await self.close()
|
|
263
|
-
|
|
270
|
+
elif self._position <= 0:
|
|
264
271
|
await self.open()
|
|
272
|
+
elif self._last_operation == CLOSING:
|
|
273
|
+
await self.open()
|
|
274
|
+
else:
|
|
275
|
+
await self.close()
|
|
265
276
|
|
|
266
277
|
async def toggle_open(self) -> None:
|
|
267
278
|
_LOGGER.debug("Toggle open cover %s from input.", self._id)
|
|
@@ -277,6 +288,33 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
277
288
|
else:
|
|
278
289
|
await self.close()
|
|
279
290
|
|
|
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()
|
|
280
318
|
|
|
281
319
|
@property
|
|
282
320
|
def state(self) -> str:
|
|
@@ -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 BasicOutput
|
|
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: BasicOutput,
|
|
23
|
+
close_relay: BasicOutput,
|
|
24
24
|
state_save: Callable,
|
|
25
25
|
open_time: TimePeriod,
|
|
26
26
|
close_time: TimePeriod,
|
|
@@ -31,6 +31,7 @@ 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)
|
|
34
35
|
last_release_ts: float | None = None
|
|
35
36
|
finalizer: asyncio.TimerHandle | None = None
|
|
36
37
|
finalizer_scheduled_loop_ts: float | None = None
|
|
@@ -46,6 +47,7 @@ class ClickState:
|
|
|
46
47
|
# Long hold periodic events
|
|
47
48
|
long_hold_periodic_timer: asyncio.TimerHandle | None = None
|
|
48
49
|
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
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
@dataclass
|
|
@@ -76,6 +78,7 @@ class MultiClickDetector:
|
|
|
76
78
|
enable_triple_click: bool = False,
|
|
77
79
|
name: str = "unknown",
|
|
78
80
|
pin: str = "unknown",
|
|
81
|
+
max_long_press_seconds: float = 120.0,
|
|
79
82
|
):
|
|
80
83
|
"""Initialize multiclick detector.
|
|
81
84
|
|
|
@@ -91,6 +94,7 @@ class MultiClickDetector:
|
|
|
91
94
|
enable_triple_click: Enable triple click detection (default: False)
|
|
92
95
|
name: Name of the input
|
|
93
96
|
pin: Pin name for logging
|
|
97
|
+
max_long_press_seconds: Safety timeout for long press in seconds (default: 120s)
|
|
94
98
|
"""
|
|
95
99
|
self._loop = loop
|
|
96
100
|
self._callback = callback
|
|
@@ -103,6 +107,7 @@ class MultiClickDetector:
|
|
|
103
107
|
self._enable_triple_click = enable_triple_click
|
|
104
108
|
self._name = name
|
|
105
109
|
self._pin = pin
|
|
110
|
+
self._max_long_press_seconds = max_long_press_seconds
|
|
106
111
|
self._state = ClickState()
|
|
107
112
|
|
|
108
113
|
# Pre-compute which click types should be delayed in exclusive mode
|
|
@@ -356,13 +361,14 @@ class MultiClickDetector:
|
|
|
356
361
|
|
|
357
362
|
def _detect_long_press(self) -> None:
|
|
358
363
|
"""Detect and report a long press and start periodic updates."""
|
|
359
|
-
if not self._state.
|
|
364
|
+
if not self._state.last_press_loop_ts:
|
|
360
365
|
return
|
|
361
366
|
|
|
362
367
|
# Reset executed actions for new long press
|
|
363
368
|
self._state.executed_long_actions = set()
|
|
369
|
+
self._state.last_repeat_times = {}
|
|
364
370
|
|
|
365
|
-
duration = self._loop.time() - self._state.
|
|
371
|
+
duration = self._loop.time() - self._state.last_press_loop_ts
|
|
366
372
|
|
|
367
373
|
_LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
|
|
368
374
|
|
|
@@ -381,11 +387,24 @@ class MultiClickDetector:
|
|
|
381
387
|
|
|
382
388
|
def _send_periodic_long_event(self) -> None:
|
|
383
389
|
"""Send periodic 'long' event with updated duration."""
|
|
384
|
-
if not self._state.
|
|
390
|
+
if not self._state.last_press_loop_ts or self._state.last_release_ts:
|
|
385
391
|
# Button released or invalid state
|
|
386
392
|
return
|
|
387
393
|
|
|
388
|
-
duration = self._loop.time() - self._state.
|
|
394
|
+
duration = self._loop.time() - self._state.last_press_loop_ts
|
|
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
|
|
389
408
|
|
|
390
409
|
_LOGGER.debug(
|
|
391
410
|
"Periodic long event on %s (%s), duration=%.3fs",
|
|
@@ -402,6 +421,34 @@ class MultiClickDetector:
|
|
|
402
421
|
0.2,
|
|
403
422
|
self._send_periodic_long_event
|
|
404
423
|
)
|
|
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
|
+
)
|
|
405
452
|
|
|
406
453
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
407
454
|
"""Process a GPIO edge event and update click state.
|
|
@@ -433,6 +480,7 @@ class MultiClickDetector:
|
|
|
433
480
|
|
|
434
481
|
_LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
|
|
435
482
|
self._state.last_press_ts = timestamp_s
|
|
483
|
+
self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
|
|
436
484
|
self._state.last_release_ts = None # Reset release timestamp for new press
|
|
437
485
|
|
|
438
486
|
# Cancel any pending finalizer for a multi-click sequence
|
|
@@ -468,7 +516,7 @@ class MultiClickDetector:
|
|
|
468
516
|
elif event.event_type is event.Type.RISING_EDGE:
|
|
469
517
|
# Button released (RISING_EDGE on BeagleBone with pull-up)
|
|
470
518
|
|
|
471
|
-
# Software debounce
|
|
519
|
+
# Software debounce (release-vs-release)
|
|
472
520
|
if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
|
|
473
521
|
delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
|
|
474
522
|
_LOGGER.debug(
|
|
@@ -477,8 +525,20 @@ class MultiClickDetector:
|
|
|
477
525
|
delta_ms,
|
|
478
526
|
)
|
|
479
527
|
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
|
|
480
539
|
|
|
481
|
-
|
|
540
|
+
press_duration_ms = (timestamp_s - self._state.last_press_ts) * 1000 if self._state.last_press_ts else 0
|
|
541
|
+
_LOGGER.debug("RELEASED: %s (%s) after %.1f ms", self._name, self._pin, press_duration_ms)
|
|
482
542
|
self._state.last_release_ts = timestamp_s
|
|
483
543
|
|
|
484
544
|
_LOGGER.debug(
|
|
@@ -496,8 +556,8 @@ class MultiClickDetector:
|
|
|
496
556
|
# Note: The callback creates an async task, so we need to delay
|
|
497
557
|
# the reset of executed_actions to allow the async handler to
|
|
498
558
|
# read the current state before it's cleared
|
|
499
|
-
if self._state.
|
|
500
|
-
duration =
|
|
559
|
+
if self._state.last_press_loop_ts:
|
|
560
|
+
duration = self._loop.time() - self._state.last_press_loop_ts
|
|
501
561
|
_LOGGER.debug(
|
|
502
562
|
"Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
|
|
503
563
|
self._name,
|
|
@@ -511,6 +571,7 @@ class MultiClickDetector:
|
|
|
511
571
|
# need to give it time to start and read executed_long_actions.
|
|
512
572
|
def reset_executed_actions():
|
|
513
573
|
self._state.executed_long_actions = set()
|
|
574
|
+
self._state.last_repeat_times = {}
|
|
514
575
|
_LOGGER.debug("Reset executed_long_actions for %s", self._name)
|
|
515
576
|
self._loop.call_later(0.05, reset_executed_actions)
|
|
516
577
|
|
|
@@ -89,6 +89,12 @@ class GpioEventButton(GpioBaseClass):
|
|
|
89
89
|
# Get enable_triple_click setting (default: False)
|
|
90
90
|
enable_triple_click = kwargs.get('enable_triple_click', False)
|
|
91
91
|
|
|
92
|
+
# Safety timeout for long press (default: 120s)
|
|
93
|
+
max_long_press_seconds = _to_milliseconds(
|
|
94
|
+
kwargs.get('max_long_press_duration'),
|
|
95
|
+
120 * 1000 # 120s default
|
|
96
|
+
) / 1000.0
|
|
97
|
+
|
|
92
98
|
# Create multiclick detector
|
|
93
99
|
self._detector = MultiClickDetector(
|
|
94
100
|
loop=self._loop,
|
|
@@ -102,6 +108,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
102
108
|
enable_triple_click=enable_triple_click,
|
|
103
109
|
name=self._name,
|
|
104
110
|
pin=self._pin,
|
|
111
|
+
max_long_press_seconds=max_long_press_seconds,
|
|
105
112
|
)
|
|
106
113
|
|
|
107
114
|
# Register with GPIO manager
|
|
@@ -147,6 +154,8 @@ class GpioEventButton(GpioBaseClass):
|
|
|
147
154
|
actions: dict | None = None,
|
|
148
155
|
mqtt_sequences: dict | None = None,
|
|
149
156
|
enable_triple_click: bool | None = None,
|
|
157
|
+
long_press_mqtt_mode: str | None = None,
|
|
158
|
+
max_long_press_duration: int | float | None = None,
|
|
150
159
|
) -> None:
|
|
151
160
|
"""Update timing parameters for click detection.
|
|
152
161
|
|
|
@@ -161,6 +170,8 @@ class GpioEventButton(GpioBaseClass):
|
|
|
161
170
|
actions: Actions dict to determine enabled sequences
|
|
162
171
|
mqtt_sequences: MQTT sequences dict to determine enabled sequences
|
|
163
172
|
enable_triple_click: Enable triple click detection
|
|
173
|
+
long_press_mqtt_mode: 'single' or 'periodic' for MQTT long press events
|
|
174
|
+
max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
|
|
164
175
|
"""
|
|
165
176
|
from boneio.const import CLICK_SEQUENCES
|
|
166
177
|
|
|
@@ -213,4 +224,13 @@ class GpioEventButton(GpioBaseClass):
|
|
|
213
224
|
if seq_name == seq:
|
|
214
225
|
self._detector._delay_click_types.add(first)
|
|
215
226
|
break
|
|
216
|
-
_LOGGER.debug("Updated enabled_sequences to %s for %s", enabled_sequences, self._name)
|
|
227
|
+
_LOGGER.debug("Updated enabled_sequences to %s for %s", enabled_sequences, self._name)
|
|
228
|
+
|
|
229
|
+
if max_long_press_duration is not None:
|
|
230
|
+
value_ms = _to_milliseconds(max_long_press_duration, 120 * 1000)
|
|
231
|
+
self._detector._max_long_press_seconds = value_ms / 1000.0
|
|
232
|
+
_LOGGER.debug("Updated max_long_press_duration to %dms for %s", value_ms, self._name)
|
|
233
|
+
|
|
234
|
+
if long_press_mqtt_mode is not None:
|
|
235
|
+
self._long_press_mqtt_mode = long_press_mqtt_mode
|
|
236
|
+
_LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Template components — composite virtual entities.
|
|
2
|
+
|
|
3
|
+
Combines existing boneIO primitives (inputs, outputs, sensors) into
|
|
4
|
+
higher-level Home Assistant entities (climate, alarm_control_panel, cover, etc.).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from boneio.components.template.thermostat import BoneIOThermostat
|
|
8
|
+
from boneio.components.template.alarm_panel import BoneIOAlarmPanel
|
|
9
|
+
from boneio.components.template.gate_cover import BoneIOGateCover
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BoneIOThermostat",
|
|
13
|
+
"BoneIOAlarmPanel",
|
|
14
|
+
"BoneIOGateCover",
|
|
15
|
+
]
|