boneIO 1.2.0.dev20__tar.gz → 1.2.0.dev23__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.dev20/boneio.egg-info → boneio-1.2.0.dev23}/PKG-INFO +1 -1
- boneio-1.2.0.dev23/boneio/components/cover/__init__.py +5 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/cover/cover.py +29 -6
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/cover/time_based.py +3 -3
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/const.py +1 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/covers.py +48 -25
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/display/oled.py +254 -7
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/actions.yaml +13 -1
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/schema.yaml +1 -1
- boneio-1.2.0.dev23/boneio/version.py +2 -0
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/cssMode-BHZPp78f.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/cssMode-CNfUxfgr.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/freemarker2-Gq7HtJkv.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/freemarker2-DWjclh22.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/handlebars-Dl5XhQoH.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/handlebars-i2k_xWAf.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/html-CG7ii1Dn.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/html-5waqLOui.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/htmlMode-83WbNL3N.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/htmlMode-Bwf-0-Bn.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/index-mCESNbCd.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/index-CRX9Ew8L.js +124 -124
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/javascript-BUqaGj1p.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/javascript-Kj8C4y4i.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/jsonMode-CIdUoO6F.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/jsonMode-CHLWjsUA.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/liquid-DtqyUk9h.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/liquid-3gxkDJwa.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/mdx-kNl4Uhpp.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/mdx-CvlTe6nf.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/python-Bedb7xre.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/python-BK_KcnMp.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/razor-C2EXH41r.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/razor-DiDDF06t.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/tsMode-BPzMKbZ6.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/tsMode-B_ZhXLqZ.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/typescript-BJAuthjt.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/typescript-FjIJU2QD.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/xml-DbvkqOFg.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/xml-DiHsfIX6.js +1 -1
- boneio-1.2.0.dev20/boneio/webui/frontend-dist/assets/yaml-s0P1upYd.js → boneio-1.2.0.dev23/boneio/webui/frontend-dist/assets/yaml-GoVS_T5n.js +1 -1
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/index.html +1 -1
- {boneio-1.2.0.dev20/boneio/webui → boneio-1.2.0.dev23/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +20 -0
- {boneio-1.2.0.dev20/boneio/webui → boneio-1.2.0.dev23/boneio/webui/frontend-dist}/schema/config.schema.json +91 -2
- {boneio-1.2.0.dev20/boneio/webui → boneio-1.2.0.dev23/boneio/webui/frontend-dist}/schema/cover.schema.json +1 -2
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/event.schema.json +70 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/covers.py +1 -2
- {boneio-1.2.0.dev20/boneio/webui/frontend-dist → boneio-1.2.0.dev23/boneio/webui}/schema/binary_sensor.schema.json +20 -0
- {boneio-1.2.0.dev20/boneio/webui/frontend-dist → boneio-1.2.0.dev23/boneio/webui}/schema/config.schema.json +91 -2
- {boneio-1.2.0.dev20/boneio/webui/frontend-dist → boneio-1.2.0.dev23/boneio/webui}/schema/cover.schema.json +1 -2
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/event.schema.json +70 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio.egg-info/SOURCES.txt +16 -17
- boneio-1.2.0.dev20/boneio/components/cover/__init__.py +0 -6
- boneio-1.2.0.dev20/boneio/components/cover/previous.py +0 -354
- boneio-1.2.0.dev20/boneio/version.py +0 -2
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/LICENSE +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/MANIFEST.in +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/README.md +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/bonecli.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/group/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/group/output_group.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/input/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/input/detectors.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/input/event.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/output/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/output/basic.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/output/mcp.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/output/pca.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/output/pcf.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/template/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/package.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/discovery.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/events/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/events/bus.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/display.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/manager.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/remote.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/templates.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/manager/update.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/local.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/remote/base.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/remote/wled.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/sensor/base.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/sensor/system.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/state/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/state/manager.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/system/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/system/host_data.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/system/monitor.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/filter.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/logger.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/core/utils/util.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/exceptions.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/integration/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/integration/interlock.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/cli.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/client.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/modbus/utils.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/actions.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/events.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/files.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/logs.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/mqtt.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/models/state.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/runner.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/filters.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/id.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/app.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/index-BkP1mrhT.css +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/config.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/system.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/routes/update.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/services/logs.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/web_server.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/pyproject.toml +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/setup.cfg +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/setup.py +0 -0
- {boneio-1.2.0.dev20 → boneio-1.2.0.dev23}/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
|
|
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,
|
|
@@ -284,6 +284,29 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
284
284
|
else:
|
|
285
285
|
await self.close()
|
|
286
286
|
|
|
287
|
+
async def smart_toggle(self, always_open_till: int = 50) -> None:
|
|
288
|
+
"""Smart toggle with position threshold.
|
|
289
|
+
|
|
290
|
+
If cover is moving → stop.
|
|
291
|
+
If position <= always_open_till → open (to 100%).
|
|
292
|
+
If position > always_open_till → normal toggle (based on last_operation).
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
always_open_till: Position threshold (0-100%). Below or equal this
|
|
296
|
+
value the cover will always open. Above it, normal toggle applies.
|
|
297
|
+
"""
|
|
298
|
+
_LOGGER.debug(
|
|
299
|
+
"Smart toggle cover %s (position=%d%%, threshold=%d%%)",
|
|
300
|
+
self._id, self._position, always_open_till,
|
|
301
|
+
)
|
|
302
|
+
if self._current_operation != IDLE:
|
|
303
|
+
await self.stop()
|
|
304
|
+
elif self._position <= always_open_till:
|
|
305
|
+
await self.open()
|
|
306
|
+
elif self._last_operation == CLOSING:
|
|
307
|
+
await self.open()
|
|
308
|
+
else:
|
|
309
|
+
await self.close()
|
|
287
310
|
|
|
288
311
|
@property
|
|
289
312
|
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,
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
This module manages all cover devices including:
|
|
4
4
|
- Time-based covers
|
|
5
|
-
- Previous-state covers
|
|
6
5
|
- Venetian blinds
|
|
7
6
|
- Cover actions and callbacks
|
|
8
7
|
"""
|
|
@@ -21,14 +20,14 @@ from boneio.integration import ha_cover_availabilty_message
|
|
|
21
20
|
from boneio.integration.homeassistant import ha_cover_with_tilt_availabilty_message
|
|
22
21
|
|
|
23
22
|
if TYPE_CHECKING:
|
|
24
|
-
from boneio.components.cover import
|
|
23
|
+
from boneio.components.cover import TimeBasedCover, VenetianCover
|
|
25
24
|
from boneio.core.manager import Manager
|
|
26
25
|
|
|
27
26
|
_LOGGER = logging.getLogger(__name__)
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
class CoverManager:
|
|
31
|
-
"""Manages all covers (time-based,
|
|
30
|
+
"""Manages all covers (time-based, venetian).
|
|
32
31
|
|
|
33
32
|
This manager handles:
|
|
34
33
|
- Cover configuration and initialization
|
|
@@ -49,7 +48,7 @@ class CoverManager:
|
|
|
49
48
|
):
|
|
50
49
|
"""Initialize cover manager."""
|
|
51
50
|
self._manager = manager
|
|
52
|
-
self._covers: dict[str,
|
|
51
|
+
self._covers: dict[str, TimeBasedCover | VenetianCover] = {}
|
|
53
52
|
self._config_covers = cover_config
|
|
54
53
|
|
|
55
54
|
# Configure covers if outputs exist
|
|
@@ -73,6 +72,28 @@ class CoverManager:
|
|
|
73
72
|
config = self._manager._config_helper.reload_config()
|
|
74
73
|
self._config_covers = config.get(COVER, [])
|
|
75
74
|
self._manager._config_helper.clear_autodiscovery_type(ha_type=COVER)
|
|
75
|
+
|
|
76
|
+
# Remove covers that are no longer in config
|
|
77
|
+
new_ids = set()
|
|
78
|
+
for _cfg in self._config_covers:
|
|
79
|
+
if _cfg.get(ID):
|
|
80
|
+
new_ids.add(strip_accents(_cfg[ID]))
|
|
81
|
+
else:
|
|
82
|
+
_open = str(_cfg.get("open_relay", ""))
|
|
83
|
+
_close = str(_cfg.get("close_relay", ""))
|
|
84
|
+
new_ids.add(f"cover_{_open}_{_close}".lower().replace(" ", "_"))
|
|
85
|
+
|
|
86
|
+
removed_ids = [cid for cid in self._covers if cid not in new_ids]
|
|
87
|
+
for cid in removed_ids:
|
|
88
|
+
_LOGGER.info("Cover %s removed from config, cleaning up", cid)
|
|
89
|
+
cover = self._covers.pop(cid)
|
|
90
|
+
# Stop cover movement if running
|
|
91
|
+
try:
|
|
92
|
+
asyncio.ensure_future(cover.stop())
|
|
93
|
+
except Exception:
|
|
94
|
+
pass
|
|
95
|
+
# Remove HA autodiscovery
|
|
96
|
+
self._remove_cover_ha_discovery(cid)
|
|
76
97
|
|
|
77
98
|
for _config in self._config_covers:
|
|
78
99
|
# Get relay outputs for cover
|
|
@@ -110,11 +131,11 @@ class CoverManager:
|
|
|
110
131
|
# Update existing cover or create new one
|
|
111
132
|
if _id in self._covers:
|
|
112
133
|
_cover = self._covers[_id]
|
|
113
|
-
new_platform = _config.get("platform", "
|
|
134
|
+
new_platform = _config.get("platform", "time_based")
|
|
114
135
|
|
|
115
136
|
# Check if platform (cover type) changed - need to recreate cover
|
|
116
137
|
current_kind = _cover.kind
|
|
117
|
-
new_kind = "venetian" if new_platform == "venetian" else
|
|
138
|
+
new_kind = "venetian" if new_platform == "venetian" else "time"
|
|
118
139
|
|
|
119
140
|
if current_kind != new_kind:
|
|
120
141
|
# Platform changed - remove old cover and create new one
|
|
@@ -127,7 +148,16 @@ class CoverManager:
|
|
|
127
148
|
# Remove old cover from dict (will be recreated below)
|
|
128
149
|
del self._covers[_id]
|
|
129
150
|
else:
|
|
130
|
-
# Same platform -
|
|
151
|
+
# Same platform - update relays, times and autodiscovery
|
|
152
|
+
old_open = getattr(_cover._open_relay, 'id', None)
|
|
153
|
+
old_close = getattr(_cover._close_relay, 'id', None)
|
|
154
|
+
if old_open != open_relay_id or old_close != close_relay_id:
|
|
155
|
+
_LOGGER.info(
|
|
156
|
+
"Cover %s relays changed: open %s->%s, close %s->%s",
|
|
157
|
+
_id, old_open, open_relay_id, old_close, close_relay_id
|
|
158
|
+
)
|
|
159
|
+
_cover._open_relay = open_relay
|
|
160
|
+
_cover._close_relay = close_relay
|
|
131
161
|
_cover.update_config_times(_config)
|
|
132
162
|
# Re-send HA autodiscovery with potentially new area
|
|
133
163
|
if _config.get(SHOW_HA, True):
|
|
@@ -170,7 +200,7 @@ class CoverManager:
|
|
|
170
200
|
cover_name: str,
|
|
171
201
|
config: dict,
|
|
172
202
|
tilt_duration: TimePeriod | None,
|
|
173
|
-
) ->
|
|
203
|
+
) -> TimeBasedCover | VenetianCover:
|
|
174
204
|
"""Configure a cover instance.
|
|
175
205
|
|
|
176
206
|
Args:
|
|
@@ -185,7 +215,7 @@ class CoverManager:
|
|
|
185
215
|
Raises:
|
|
186
216
|
CoverConfigurationException: If cover configuration is invalid
|
|
187
217
|
"""
|
|
188
|
-
from boneio.components.cover import
|
|
218
|
+
from boneio.components.cover import TimeBasedCover, VenetianCover
|
|
189
219
|
|
|
190
220
|
platform = config.get("platform", "time_based")
|
|
191
221
|
|
|
@@ -241,8 +271,11 @@ class CoverManager:
|
|
|
241
271
|
**{k: v for k, v in config.items() if k not in ("id", "platform", RESTORE_STATE, SHOW_HA, DEVICE_CLASS, NAME)},
|
|
242
272
|
)
|
|
243
273
|
availability_msg_func = ha_cover_availabilty_message
|
|
244
|
-
|
|
245
|
-
_LOGGER.
|
|
274
|
+
else:
|
|
275
|
+
_LOGGER.warning(
|
|
276
|
+
"Unknown cover platform '%s' for %s, falling back to time_based",
|
|
277
|
+
platform, cover_id
|
|
278
|
+
)
|
|
246
279
|
restored_state = self._manager._state_manager.get(
|
|
247
280
|
attr_type=COVER, attr=cover_id, default_value={"position": 100}
|
|
248
281
|
)
|
|
@@ -250,7 +283,7 @@ class CoverManager:
|
|
|
250
283
|
restored_state = {"position": restored_state}
|
|
251
284
|
elif isinstance(restored_state, str):
|
|
252
285
|
restored_state = {"position": 100}
|
|
253
|
-
cover =
|
|
286
|
+
cover = TimeBasedCover(
|
|
254
287
|
id=cover_id,
|
|
255
288
|
name=cover_name,
|
|
256
289
|
state_save=state_save,
|
|
@@ -298,7 +331,7 @@ class CoverManager:
|
|
|
298
331
|
# Remove from internal cache
|
|
299
332
|
self._manager._config_helper.remove_autodiscovery_msg(ha_type, topic)
|
|
300
333
|
|
|
301
|
-
def get_cover(self, id: str) ->
|
|
334
|
+
def get_cover(self, id: str) -> TimeBasedCover | VenetianCover | None:
|
|
302
335
|
"""Get cover by ID.
|
|
303
336
|
|
|
304
337
|
Args:
|
|
@@ -309,7 +342,7 @@ class CoverManager:
|
|
|
309
342
|
"""
|
|
310
343
|
return self._covers.get(id)
|
|
311
344
|
|
|
312
|
-
def get_all_covers(self) -> dict[str,
|
|
345
|
+
def get_all_covers(self) -> dict[str, TimeBasedCover | VenetianCover]:
|
|
313
346
|
"""Get all covers.
|
|
314
347
|
|
|
315
348
|
Returns:
|
|
@@ -391,20 +424,10 @@ class CoverManager:
|
|
|
391
424
|
|
|
392
425
|
This is called after reload to ensure frontend receives
|
|
393
426
|
the state of all covers, including newly created ones.
|
|
394
|
-
|
|
395
|
-
Handles both PreviousCover (send_state with no args) and BaseCover
|
|
396
|
-
(send_state with state and json_position args) implementations.
|
|
397
427
|
"""
|
|
398
|
-
from boneio.components.cover import PreviousCover, TimeBasedCover, VenetianCover
|
|
399
|
-
|
|
400
428
|
for cover in self._covers.values():
|
|
401
429
|
try:
|
|
402
|
-
|
|
403
|
-
# PreviousCover.send_state() takes no arguments
|
|
404
|
-
cover.send_state()
|
|
405
|
-
elif isinstance(cover, (TimeBasedCover, VenetianCover)):
|
|
406
|
-
# BaseCover.send_state(state, json_position) takes 2 arguments
|
|
407
|
-
cover.send_state(cover.state, cover.json_position)
|
|
430
|
+
cover.send_state(cover.state, cover.json_position)
|
|
408
431
|
except Exception as e:
|
|
409
432
|
_LOGGER.debug("Error broadcasting cover state %s: %s", cover.id, e)
|
|
410
433
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
+
import subprocess
|
|
5
6
|
from itertools import cycle
|
|
6
7
|
from typing import TYPE_CHECKING
|
|
7
8
|
|
|
@@ -13,7 +14,7 @@ from luma.oled.device import sh1106
|
|
|
13
14
|
from PIL import Image, ImageDraw
|
|
14
15
|
from PIL.ImageDraw import ImageDraw as ImageDrawType
|
|
15
16
|
|
|
16
|
-
from boneio.const import OLED_PIN, UPTIME, WHITE
|
|
17
|
+
from boneio.const import LONG, OLED_PIN, SINGLE, UPTIME, WHITE
|
|
17
18
|
from boneio.core.events import EventBus, async_track_point_in_time, utcnow
|
|
18
19
|
from boneio.core.system import HostData
|
|
19
20
|
from boneio.core.utils.font_util import make_font
|
|
@@ -102,6 +103,24 @@ class Oled:
|
|
|
102
103
|
self._cancel_sleep_handle = None
|
|
103
104
|
self._sleep_timeout = sleep_timeout
|
|
104
105
|
|
|
106
|
+
# Shutdown confirmation state machine
|
|
107
|
+
# States: None -> "wait_release" -> "confirm" -> "progress" -> shutdown
|
|
108
|
+
# - First long press → show confirm screen, enter "wait_release"
|
|
109
|
+
# - Release after first long → enter "confirm" (waiting for second long)
|
|
110
|
+
# - Second long press → enter "progress" with filling progress bar
|
|
111
|
+
# - Hold 5s → execute shutdown
|
|
112
|
+
# - Single click or 10s timeout → cancel
|
|
113
|
+
self._shutdown_state: str | None = None
|
|
114
|
+
self._shutdown_cancel_handle = None
|
|
115
|
+
# Timer to detect button release (no LONG event for 300ms = released)
|
|
116
|
+
self._shutdown_release_timer: asyncio.TimerHandle | None = None
|
|
117
|
+
# Last seen long press duration — used to detect new press cycle (duration resets)
|
|
118
|
+
self._shutdown_last_long_duration: float = 0.0
|
|
119
|
+
# Duration (seconds) the user must hold the button to confirm shutdown
|
|
120
|
+
self._shutdown_hold_duration: float = 5.0
|
|
121
|
+
# Timeout (seconds) to cancel shutdown confirmation if no action
|
|
122
|
+
self._shutdown_confirm_timeout: float = 10.0
|
|
123
|
+
|
|
105
124
|
# Initialize I2C display
|
|
106
125
|
try:
|
|
107
126
|
# Use luma.oled for now, but could be refactored to use SMBus2I2C
|
|
@@ -219,14 +238,98 @@ class Oled:
|
|
|
219
238
|
# Display the centered QR code
|
|
220
239
|
self._device.display(display_image)
|
|
221
240
|
|
|
222
|
-
async def _handle_button_press(self, event
|
|
223
|
-
"""Handle button press event from input.
|
|
224
|
-
|
|
241
|
+
async def _handle_button_press(self, event) -> None:
|
|
242
|
+
"""Handle button press event from input.
|
|
243
|
+
|
|
244
|
+
Supports shutdown flow via long press:
|
|
245
|
+
1. First long press → show confirmation screen
|
|
246
|
+
2. User releases button → state moves to "confirm"
|
|
247
|
+
3. Second long press (held 5s) → progress bar fills, then shutdown
|
|
248
|
+
4. Any single click or 10s timeout → cancel shutdown
|
|
249
|
+
|
|
250
|
+
The detector emits periodic LONG events (every 200ms) with growing
|
|
251
|
+
duration while the button is held. A new press cycle is detected
|
|
252
|
+
when duration resets (new duration < last tracked duration).
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
event: InputEvent from EventBus with click_type and duration
|
|
256
|
+
"""
|
|
257
|
+
click_type = getattr(event, "click_type", None)
|
|
258
|
+
duration = getattr(event, "duration", None) or 0.0
|
|
259
|
+
|
|
260
|
+
_LOGGER.debug("OLED button event: click_type=%s, duration=%.2f, shutdown_state=%s",
|
|
261
|
+
click_type, duration, self._shutdown_state)
|
|
262
|
+
|
|
263
|
+
# --- Shutdown state machine ---
|
|
264
|
+
|
|
265
|
+
if self._shutdown_state == "wait_release":
|
|
266
|
+
# Absorb periodic LONG events from the first long press.
|
|
267
|
+
# Detector does NOT emit SINGLE after long press release.
|
|
268
|
+
# Detect release via timer: each LONG resets a 300ms timer.
|
|
269
|
+
# When no more LONG events arrive, timer fires → "confirm".
|
|
270
|
+
if click_type == LONG:
|
|
271
|
+
self._shutdown_last_long_duration = duration
|
|
272
|
+
# Reset release-detection timer
|
|
273
|
+
self._reset_release_timer()
|
|
274
|
+
return
|
|
275
|
+
elif click_type == SINGLE:
|
|
276
|
+
# Shouldn't happen after long, but handle gracefully
|
|
277
|
+
self._cancel_release_timer()
|
|
278
|
+
self._shutdown_state = "confirm"
|
|
279
|
+
self._shutdown_last_long_duration = 0.0
|
|
280
|
+
return
|
|
281
|
+
# Ignore other events
|
|
282
|
+
return
|
|
283
|
+
|
|
284
|
+
if self._shutdown_state == "confirm":
|
|
285
|
+
if click_type == LONG:
|
|
286
|
+
# Second long press — enter progress mode
|
|
287
|
+
self._shutdown_state = "progress"
|
|
288
|
+
self._cancel_shutdown_timeout()
|
|
289
|
+
self._shutdown_last_long_duration = duration
|
|
290
|
+
self._draw_shutdown_progress(duration)
|
|
291
|
+
if duration >= self._shutdown_hold_duration:
|
|
292
|
+
await self._execute_shutdown()
|
|
293
|
+
return
|
|
294
|
+
elif click_type == SINGLE:
|
|
295
|
+
# Single click cancels shutdown confirmation
|
|
296
|
+
self._cancel_shutdown()
|
|
297
|
+
return
|
|
298
|
+
# Ignore other events during confirm
|
|
299
|
+
return
|
|
300
|
+
|
|
301
|
+
if self._shutdown_state == "progress":
|
|
302
|
+
if click_type == LONG:
|
|
303
|
+
if duration < self._shutdown_last_long_duration:
|
|
304
|
+
# Duration reset — user released and pressed again, cancel
|
|
305
|
+
self._cancel_shutdown()
|
|
306
|
+
return
|
|
307
|
+
# Still holding — update progress bar
|
|
308
|
+
self._shutdown_last_long_duration = duration
|
|
309
|
+
self._draw_shutdown_progress(duration)
|
|
310
|
+
if duration >= self._shutdown_hold_duration:
|
|
311
|
+
await self._execute_shutdown()
|
|
312
|
+
return
|
|
313
|
+
else:
|
|
314
|
+
# Released (single) or other — cancel
|
|
315
|
+
self._cancel_shutdown()
|
|
316
|
+
return
|
|
317
|
+
|
|
318
|
+
# --- Normal mode ---
|
|
225
319
|
if self._sleep:
|
|
226
|
-
# Display is sleeping - wake it up
|
|
227
320
|
self.wake_up()
|
|
228
|
-
|
|
229
|
-
|
|
321
|
+
return
|
|
322
|
+
|
|
323
|
+
if click_type == LONG and duration < 1.0:
|
|
324
|
+
# First long press event — show confirmation, enter wait_release
|
|
325
|
+
self._shutdown_state = "wait_release"
|
|
326
|
+
self._shutdown_last_long_duration = duration
|
|
327
|
+
self._draw_shutdown_confirm()
|
|
328
|
+
self._start_shutdown_timeout()
|
|
329
|
+
self._reset_release_timer()
|
|
330
|
+
return
|
|
331
|
+
|
|
332
|
+
if click_type == SINGLE:
|
|
230
333
|
self._next_screen()
|
|
231
334
|
|
|
232
335
|
def _next_screen(self) -> None:
|
|
@@ -240,6 +343,150 @@ class Oled:
|
|
|
240
343
|
self._current_screen = next(self._screen_cycle)
|
|
241
344
|
self.render_display()
|
|
242
345
|
|
|
346
|
+
# --- Shutdown helper methods ---
|
|
347
|
+
|
|
348
|
+
def _draw_shutdown_confirm(self) -> None:
|
|
349
|
+
"""Draw shutdown confirmation screen on OLED.
|
|
350
|
+
|
|
351
|
+
Shows a warning message asking the user to hold the button
|
|
352
|
+
for 5 seconds to confirm system shutdown.
|
|
353
|
+
"""
|
|
354
|
+
with canvas(self._device) as draw:
|
|
355
|
+
# Warning triangle
|
|
356
|
+
draw.polygon([(64, 2), (54, 18), (74, 18)], outline=WHITE)
|
|
357
|
+
draw.text((61, 5), "!", font=fonts["small"], fill=WHITE)
|
|
358
|
+
# Message
|
|
359
|
+
draw.text((10, 24), "Shutdown system?", font=fonts["small"], fill=WHITE)
|
|
360
|
+
draw.text((4, 38), "Hold button 5s to confirm", font=fonts["extraSmall"], fill=WHITE)
|
|
361
|
+
draw.text((8, 52), "Click to cancel (10s)", font=fonts["extraSmall"], fill=WHITE)
|
|
362
|
+
|
|
363
|
+
def _draw_shutdown_progress(self, duration: float) -> None:
|
|
364
|
+
"""Draw shutdown progress bar on OLED.
|
|
365
|
+
|
|
366
|
+
Shows a progress bar that fills proportionally to how long
|
|
367
|
+
the user has been holding the button vs the required duration.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
duration: How long the button has been held (seconds)
|
|
371
|
+
"""
|
|
372
|
+
progress = min(duration / self._shutdown_hold_duration, 1.0)
|
|
373
|
+
bar_x, bar_y = 10, 34
|
|
374
|
+
bar_w, bar_h = 108, 14
|
|
375
|
+
fill_w = int(bar_w * progress)
|
|
376
|
+
|
|
377
|
+
with canvas(self._device) as draw:
|
|
378
|
+
draw.text((20, 4), "Shutting down...", font=fonts["small"], fill=WHITE)
|
|
379
|
+
draw.text((28, 18), f"{int(progress * 100)}%", font=fonts["small"], fill=WHITE)
|
|
380
|
+
# Progress bar outline
|
|
381
|
+
draw.rectangle([bar_x, bar_y, bar_x + bar_w, bar_y + bar_h], outline=WHITE)
|
|
382
|
+
# Progress bar fill
|
|
383
|
+
if fill_w > 0:
|
|
384
|
+
draw.rectangle([bar_x + 1, bar_y + 1, bar_x + fill_w - 1, bar_y + bar_h - 1], fill=WHITE)
|
|
385
|
+
draw.text((22, 54), "Release to cancel", font=fonts["extraSmall"], fill=WHITE)
|
|
386
|
+
|
|
387
|
+
def _start_shutdown_timeout(self) -> None:
|
|
388
|
+
"""Start a 10-second timeout that cancels the shutdown confirmation.
|
|
389
|
+
|
|
390
|
+
If the user doesn't interact within the timeout period,
|
|
391
|
+
the shutdown flow is cancelled and the normal screen is restored.
|
|
392
|
+
"""
|
|
393
|
+
self._cancel_shutdown_timeout()
|
|
394
|
+
loop = self._event_bus._loop
|
|
395
|
+
|
|
396
|
+
def _timeout_callback() -> None:
|
|
397
|
+
"""Cancel shutdown after timeout expires."""
|
|
398
|
+
_LOGGER.info("Shutdown confirmation timed out, cancelling")
|
|
399
|
+
self._shutdown_state = None
|
|
400
|
+
self._shutdown_cancel_handle = None
|
|
401
|
+
self.render_display()
|
|
402
|
+
|
|
403
|
+
self._shutdown_cancel_handle = loop.call_later(
|
|
404
|
+
self._shutdown_confirm_timeout, _timeout_callback
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
def _cancel_shutdown_timeout(self) -> None:
|
|
408
|
+
"""Cancel the pending shutdown timeout timer."""
|
|
409
|
+
if self._shutdown_cancel_handle is not None:
|
|
410
|
+
self._shutdown_cancel_handle.cancel()
|
|
411
|
+
self._shutdown_cancel_handle = None
|
|
412
|
+
|
|
413
|
+
def _reset_release_timer(self) -> None:
|
|
414
|
+
"""Reset the 300ms release-detection timer.
|
|
415
|
+
|
|
416
|
+
Called on each periodic LONG event during wait_release state.
|
|
417
|
+
If no more LONG events arrive within 300ms, the timer fires
|
|
418
|
+
and transitions to 'confirm' state (button was released).
|
|
419
|
+
"""
|
|
420
|
+
self._cancel_release_timer()
|
|
421
|
+
loop = self._event_bus._loop
|
|
422
|
+
|
|
423
|
+
def _on_release_detected() -> None:
|
|
424
|
+
"""No LONG event for 300ms — button was released."""
|
|
425
|
+
self._shutdown_release_timer = None
|
|
426
|
+
if self._shutdown_state == "wait_release":
|
|
427
|
+
_LOGGER.debug("OLED button release detected (no LONG for 300ms)")
|
|
428
|
+
self._shutdown_state = "confirm"
|
|
429
|
+
self._shutdown_last_long_duration = 0.0
|
|
430
|
+
# Timeout already running from first long press
|
|
431
|
+
|
|
432
|
+
self._shutdown_release_timer = loop.call_later(0.3, _on_release_detected)
|
|
433
|
+
|
|
434
|
+
def _cancel_release_timer(self) -> None:
|
|
435
|
+
"""Cancel the pending release-detection timer."""
|
|
436
|
+
if self._shutdown_release_timer is not None:
|
|
437
|
+
self._shutdown_release_timer.cancel()
|
|
438
|
+
self._shutdown_release_timer = None
|
|
439
|
+
|
|
440
|
+
def _cancel_shutdown(self) -> None:
|
|
441
|
+
"""Cancel the shutdown flow and return to normal display.
|
|
442
|
+
|
|
443
|
+
Resets the shutdown state machine and restores the current screen.
|
|
444
|
+
"""
|
|
445
|
+
_LOGGER.info("Shutdown cancelled by user")
|
|
446
|
+
self._cancel_shutdown_timeout()
|
|
447
|
+
self._cancel_release_timer()
|
|
448
|
+
self._shutdown_state = None
|
|
449
|
+
self._shutdown_last_long_duration = 0.0
|
|
450
|
+
self.render_display()
|
|
451
|
+
|
|
452
|
+
async def _execute_shutdown(self) -> None:
|
|
453
|
+
"""Execute system shutdown.
|
|
454
|
+
|
|
455
|
+
Draws a final 'Goodbye' message on the OLED, then runs
|
|
456
|
+
'sudo shutdown -h now' to power off the device.
|
|
457
|
+
"""
|
|
458
|
+
_LOGGER.warning("System shutdown initiated from OLED button")
|
|
459
|
+
self._shutdown_state = None
|
|
460
|
+
self._shutdown_last_long_duration = 0.0
|
|
461
|
+
self._cancel_shutdown_timeout()
|
|
462
|
+
|
|
463
|
+
# Draw goodbye screen
|
|
464
|
+
with canvas(self._device) as draw:
|
|
465
|
+
draw.text((20, 10), "Goodbye!", font=fonts["big"], fill=WHITE)
|
|
466
|
+
draw.text((15, 35), "System shutting down...", font=fonts["extraSmall"], fill=WHITE)
|
|
467
|
+
|
|
468
|
+
# Small delay so the user sees the message
|
|
469
|
+
await asyncio.sleep(1)
|
|
470
|
+
|
|
471
|
+
try:
|
|
472
|
+
subprocess.run(
|
|
473
|
+
["sudo", "shutdown", "-h", "now"],
|
|
474
|
+
check=True,
|
|
475
|
+
capture_output=True,
|
|
476
|
+
text=True,
|
|
477
|
+
)
|
|
478
|
+
except subprocess.CalledProcessError as e:
|
|
479
|
+
_LOGGER.error("Failed to shutdown device: %s", e.stderr)
|
|
480
|
+
# Show error on OLED and return to normal
|
|
481
|
+
with canvas(self._device) as draw:
|
|
482
|
+
draw.text((10, 20), "Shutdown failed!", font=fonts["small"], fill=WHITE)
|
|
483
|
+
draw.text((10, 40), str(e.stderr)[:20], font=fonts["extraSmall"], fill=WHITE)
|
|
484
|
+
await asyncio.sleep(3)
|
|
485
|
+
self.render_display()
|
|
486
|
+
except Exception as e:
|
|
487
|
+
_LOGGER.error("Error shutting down device: %s", e)
|
|
488
|
+
self.render_display()
|
|
489
|
+
|
|
243
490
|
def render_display(self) -> None:
|
|
244
491
|
"""Render display - main method that decides what to display."""
|
|
245
492
|
|
|
@@ -35,7 +35,7 @@ schema:
|
|
|
35
35
|
action: ['cover', 'cover_over_mqtt', 'remote_cover']
|
|
36
36
|
forbidden_if:
|
|
37
37
|
action: ['output', 'mqtt', 'mqtt_output', 'remote_output']
|
|
38
|
-
allowed: ['TOGGLE', 'OPEN', 'CLOSE', 'STOP', 'TOGGLE_OPEN', 'TOGGLE_CLOSE', 'TILT', 'TILT_OPEN', 'TILT_CLOSE']
|
|
38
|
+
allowed: ['TOGGLE', 'OPEN', 'CLOSE', 'STOP', 'TOGGLE_OPEN', 'TOGGLE_CLOSE', 'SMART_TOGGLE', 'TILT', 'TILT_OPEN', 'TILT_CLOSE']
|
|
39
39
|
coerce: action_field
|
|
40
40
|
default: TOGGLE
|
|
41
41
|
case_insensitive: true
|
|
@@ -58,6 +58,18 @@ schema:
|
|
|
58
58
|
required: False
|
|
59
59
|
meta:
|
|
60
60
|
label: Tilt position to set cover to. 0 means closed, 100 means opened.
|
|
61
|
+
always_open_till:
|
|
62
|
+
type: integer
|
|
63
|
+
required: False
|
|
64
|
+
min: 0
|
|
65
|
+
max: 100
|
|
66
|
+
default: 50
|
|
67
|
+
meta:
|
|
68
|
+
label: Smart toggle threshold (0-100%).
|
|
69
|
+
description: |
|
|
70
|
+
Position threshold for SMART_TOGGLE action.
|
|
71
|
+
If cover position is at or below this value, it will always open.
|
|
72
|
+
Above this value, normal toggle behavior applies.
|
|
61
73
|
action_output:
|
|
62
74
|
type: string
|
|
63
75
|
required_if:
|