boneIO 1.1.0.dev1__tar.gz → 1.1.0.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.1.0.dev1/boneio.egg-info → boneio-1.1.0.dev2}/PKG-INFO +1 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/detectors.py +70 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/inputs.py +43 -2
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/manager.py +112 -19
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/remote.py +44 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/homeassistant.py +12 -3
- boneio-1.1.0.dev2/boneio/version.py +2 -0
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/cssMode-jm8BgQUG.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/cssMode-Ca1DAf9-.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/freemarker2-Dp0Xzx1I.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/freemarker2-C5IgNKwL.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/handlebars-DI4hd1VE.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/handlebars-coN2SbcA.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/html-CqpC7ec2.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/html-DauOMz0u.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/htmlMode-Cgw0dxSz.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/htmlMode-CmodurAE.js +1 -1
- boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/index-BGHXdp7U.css +1 -0
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-fvCxV9EK.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/index-CeFOvpPM.js +191 -191
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/javascript-BW9tlink.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/javascript-N6k9oxRy.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/jsonMode-BEG4tw2F.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/jsonMode-DCkYHItT.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/liquid-xHiYCVBL.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/liquid-CuYEfgul.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/mdx-DBRAmEVg.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/mdx-DEiUIP8w.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/python-DdjAUqQp.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/python-DBpf3_HZ.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/razor-CVHTFNOs.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/razor-S1P72cEP.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/tsMode-DR-WSiIu.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/tsMode-A2L2Jxa9.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/typescript-ljc143Ju.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/typescript-CupJHRfY.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/xml-B6zOV41n.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/xml-DDPTy55c.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/yaml-C4f2eVhb.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/yaml-CuImUjrc.js +1 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/config.schema.json +8 -8
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +4 -4
- {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev2/boneio/webui/frontend-dist/schem}/web.schema.json +4 -4
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/remote_devices.py +34 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/config.schema.json +8 -8
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/modbus_devices.schema.json +4 -4
- {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev2/boneio/webui/schema}/web.schema.json +4 -4
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/SOURCES.txt +17 -17
- boneio-1.1.0.dev1/boneio/version.py +0 -2
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-Dxd5huyV.css +0 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/LICENSE +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/MANIFEST.in +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/README.md +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/bonecli.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/cover.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/previous.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/group/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/group/output_group.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/event.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/basic.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/mcp.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/pca.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/pcf.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/const.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/package.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/discovery.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/events/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/events/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/covers.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/display.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/local.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/system.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/state/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/state/manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/host_data.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/monitor.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/filter.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/logger.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/exceptions.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/interlock.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/cli.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/client.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/utils.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/actions.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/events.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/files.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/logs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/state.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/runner.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/filters.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/id.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/schema.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/app.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/event.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/config.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/system.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/update.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/services/logs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/web_server.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/pyproject.toml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/setup.cfg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/setup.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/tests/test_py313_compatibility.py +0 -0
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import logging
|
|
7
7
|
from collections.abc import Callable
|
|
8
|
-
from dataclasses import dataclass
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
9
|
from typing import cast
|
|
10
10
|
|
|
11
11
|
import gpiod
|
|
@@ -43,6 +43,9 @@ class ClickState:
|
|
|
43
43
|
pending_click_type: str | None = None
|
|
44
44
|
pending_click_duration: float | None = None
|
|
45
45
|
pending_click_timer: asyncio.TimerHandle | None = None
|
|
46
|
+
# Long hold periodic events
|
|
47
|
+
long_hold_periodic_timer: asyncio.TimerHandle | None = None
|
|
48
|
+
executed_long_actions: set[int] = field(default_factory=set) # Track which long actions already executed
|
|
46
49
|
|
|
47
50
|
|
|
48
51
|
@dataclass
|
|
@@ -352,10 +355,14 @@ class MultiClickDetector:
|
|
|
352
355
|
return None
|
|
353
356
|
|
|
354
357
|
def _detect_long_press(self) -> None:
|
|
355
|
-
"""Detect and report a long press."""
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
358
|
+
"""Detect and report a long press and start periodic updates."""
|
|
359
|
+
if not self._state.last_press_ts:
|
|
360
|
+
return
|
|
361
|
+
|
|
362
|
+
# Reset executed actions for new long press
|
|
363
|
+
self._state.executed_long_actions = set()
|
|
364
|
+
|
|
365
|
+
duration = self._loop.time() - self._state.last_press_ts
|
|
359
366
|
|
|
360
367
|
_LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
|
|
361
368
|
|
|
@@ -365,6 +372,36 @@ class MultiClickDetector:
|
|
|
365
372
|
|
|
366
373
|
# Emit the long press (may also trigger sequence)
|
|
367
374
|
self._emit_click(LONG, duration)
|
|
375
|
+
|
|
376
|
+
# Start periodic timer for subsequent long events
|
|
377
|
+
self._state.long_hold_periodic_timer = self._loop.call_later(
|
|
378
|
+
0.2, # 200ms
|
|
379
|
+
self._send_periodic_long_event
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
def _send_periodic_long_event(self) -> None:
|
|
383
|
+
"""Send periodic 'long' event with updated duration."""
|
|
384
|
+
if not self._state.last_press_ts or self._state.last_release_ts:
|
|
385
|
+
# Button released or invalid state
|
|
386
|
+
return
|
|
387
|
+
|
|
388
|
+
duration = self._loop.time() - self._state.last_press_ts
|
|
389
|
+
|
|
390
|
+
_LOGGER.debug(
|
|
391
|
+
"Periodic long event on %s (%s), duration=%.3fs",
|
|
392
|
+
self._name,
|
|
393
|
+
self._pin,
|
|
394
|
+
duration
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# Emit 'long' event with updated duration
|
|
398
|
+
self._emit_click(LONG, duration)
|
|
399
|
+
|
|
400
|
+
# Schedule next update
|
|
401
|
+
self._state.long_hold_periodic_timer = self._loop.call_later(
|
|
402
|
+
0.2,
|
|
403
|
+
self._send_periodic_long_event
|
|
404
|
+
)
|
|
368
405
|
|
|
369
406
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
370
407
|
"""Process a GPIO edge event and update click state.
|
|
@@ -396,6 +433,7 @@ class MultiClickDetector:
|
|
|
396
433
|
|
|
397
434
|
_LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
|
|
398
435
|
self._state.last_press_ts = timestamp_s
|
|
436
|
+
self._state.last_release_ts = None # Reset release timestamp for new press
|
|
399
437
|
|
|
400
438
|
# Cancel any pending finalizer for a multi-click sequence
|
|
401
439
|
if self._state.finalizer:
|
|
@@ -449,6 +487,33 @@ class MultiClickDetector:
|
|
|
449
487
|
"EXISTS" if self._state.long_press_timer else "None",
|
|
450
488
|
)
|
|
451
489
|
|
|
490
|
+
# Cancel periodic timer if running
|
|
491
|
+
if self._state.long_hold_periodic_timer:
|
|
492
|
+
self._state.long_hold_periodic_timer.cancel()
|
|
493
|
+
self._state.long_hold_periodic_timer = None
|
|
494
|
+
|
|
495
|
+
# Send final 'long' event with final duration
|
|
496
|
+
# Note: The callback creates an async task, so we need to delay
|
|
497
|
+
# the reset of executed_actions to allow the async handler to
|
|
498
|
+
# read the current state before it's cleared
|
|
499
|
+
if self._state.last_press_ts:
|
|
500
|
+
duration = timestamp_s - self._state.last_press_ts
|
|
501
|
+
_LOGGER.debug(
|
|
502
|
+
"Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
|
|
503
|
+
self._name,
|
|
504
|
+
duration,
|
|
505
|
+
self._state.executed_long_actions
|
|
506
|
+
)
|
|
507
|
+
self._emit_click(LONG, duration)
|
|
508
|
+
|
|
509
|
+
# Reset executed actions with a small delay to allow async handler
|
|
510
|
+
# to read the current state. The handler uses create_task() so we
|
|
511
|
+
# need to give it time to start and read executed_long_actions.
|
|
512
|
+
def reset_executed_actions():
|
|
513
|
+
self._state.executed_long_actions = set()
|
|
514
|
+
_LOGGER.debug("Reset executed_long_actions for %s", self._name)
|
|
515
|
+
self._loop.call_later(0.05, reset_executed_actions)
|
|
516
|
+
|
|
452
517
|
# If a long press timer exists, it means it hasn't fired yet.
|
|
453
518
|
# This is a short click.
|
|
454
519
|
if self._state.long_press_timer:
|
|
@@ -22,6 +22,7 @@ from boneio.const import (
|
|
|
22
22
|
ID,
|
|
23
23
|
INPUT,
|
|
24
24
|
INPUT_SENSOR,
|
|
25
|
+
LONG,
|
|
25
26
|
PIN,
|
|
26
27
|
PRESSED,
|
|
27
28
|
RELEASED,
|
|
@@ -686,8 +687,48 @@ class InputManager:
|
|
|
686
687
|
# Send event to MQTT for Home Assistant
|
|
687
688
|
self._publish_input_event_to_mqtt(input_instance, event)
|
|
688
689
|
|
|
689
|
-
# Execute actions
|
|
690
|
-
if actions and
|
|
690
|
+
# Execute actions with duration threshold support
|
|
691
|
+
if actions and event.click_type == LONG:
|
|
692
|
+
# Get executed_actions from detector state
|
|
693
|
+
detector = getattr(input_instance, '_detector', None)
|
|
694
|
+
executed_actions = getattr(detector._state, 'executed_long_actions', set()) if detector else set()
|
|
695
|
+
|
|
696
|
+
# Lazy evaluation: Check if there are any actions with duration thresholds
|
|
697
|
+
# or any actions without thresholds that haven't been executed yet
|
|
698
|
+
has_pending_actions = False
|
|
699
|
+
for idx, action in enumerate(actions):
|
|
700
|
+
if idx in executed_actions:
|
|
701
|
+
continue # Already executed
|
|
702
|
+
min_dur = action.get("min_duration")
|
|
703
|
+
max_dur = action.get("max_duration")
|
|
704
|
+
if min_dur is not None or max_dur is not None:
|
|
705
|
+
# Has duration thresholds - might need to execute
|
|
706
|
+
has_pending_actions = True
|
|
707
|
+
break
|
|
708
|
+
elif not executed_actions:
|
|
709
|
+
# No thresholds and nothing executed yet - first event
|
|
710
|
+
has_pending_actions = True
|
|
711
|
+
break
|
|
712
|
+
|
|
713
|
+
# Skip execute_actions if no pending actions (optimization for periodic events)
|
|
714
|
+
if not has_pending_actions:
|
|
715
|
+
_LOGGER.debug(
|
|
716
|
+
"Skipping execute_actions for %s - no pending actions (executed=%s)",
|
|
717
|
+
event.entity_id, executed_actions
|
|
718
|
+
)
|
|
719
|
+
else:
|
|
720
|
+
# Execute actions with duration checking
|
|
721
|
+
new_executed = await self._manager.execute_actions(
|
|
722
|
+
actions=actions,
|
|
723
|
+
duration=event.duration,
|
|
724
|
+
executed_actions=executed_actions,
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
# Update detector state
|
|
728
|
+
if detector:
|
|
729
|
+
detector._state.executed_long_actions = new_executed
|
|
730
|
+
elif actions:
|
|
731
|
+
# Non-long events - execute all actions normally
|
|
691
732
|
await self._manager.execute_actions(actions=actions)
|
|
692
733
|
|
|
693
734
|
async def send_ha_autodiscovery(self) -> None:
|
|
@@ -26,6 +26,7 @@ from boneio.const import (
|
|
|
26
26
|
REMOTE_OUTPUT,
|
|
27
27
|
SET_BRIGHTNESS,
|
|
28
28
|
STATE,
|
|
29
|
+
TOGGLE,
|
|
29
30
|
cover_actions,
|
|
30
31
|
output_actions,
|
|
31
32
|
)
|
|
@@ -423,17 +424,28 @@ class Manager:
|
|
|
423
424
|
# Support both new 'boneio_output' and legacy 'pin' for backward compatibility
|
|
424
425
|
entity_id = action_definition.get("boneio_output") or action_definition.get("pin")
|
|
425
426
|
stripped_entity_id = strip_accents(entity_id)
|
|
426
|
-
action_output = action_definition.get("action_output")
|
|
427
|
+
action_output = action_definition.get("action_output", TOGGLE)
|
|
427
428
|
output = self.outputs.get_output(stripped_entity_id) or self.outputs.get_output_group(stripped_entity_id)
|
|
428
429
|
action_to_execute = output_actions.get(action_output)
|
|
429
430
|
if output and action_to_execute:
|
|
430
431
|
_f = getattr(output, action_to_execute, None)
|
|
431
432
|
if _f:
|
|
432
|
-
|
|
433
|
+
parsed_action = {
|
|
433
434
|
"action": action,
|
|
434
435
|
"pin": stripped_entity_id,
|
|
435
436
|
"action_to_execute": action_to_execute,
|
|
436
|
-
}
|
|
437
|
+
}
|
|
438
|
+
# Copy duration thresholds for long press actions
|
|
439
|
+
if action_definition.get("min_duration") is not None:
|
|
440
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
441
|
+
if action_definition.get("max_duration") is not None:
|
|
442
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
443
|
+
_LOGGER.debug(
|
|
444
|
+
"Parsed OUTPUT action for %s: output=%s, action=%s, min_dur=%s, max_dur=%s",
|
|
445
|
+
pin, stripped_entity_id, action_to_execute,
|
|
446
|
+
parsed_action.get("min_duration"), parsed_action.get("max_duration")
|
|
447
|
+
)
|
|
448
|
+
parsed_actions[click_type].append(parsed_action)
|
|
437
449
|
continue
|
|
438
450
|
_LOGGER.warning("Device %s for action in %s not found. Omitting.", entity_id, pin)
|
|
439
451
|
|
|
@@ -441,19 +453,25 @@ class Manager:
|
|
|
441
453
|
# Support both new 'boneio_cover' and legacy 'pin' for backward compatibility
|
|
442
454
|
entity_id = action_definition.get("boneio_cover") or action_definition.get("pin")
|
|
443
455
|
stripped_entity_id = strip_accents(entity_id)
|
|
444
|
-
action_cover = action_definition.get("action_cover")
|
|
456
|
+
action_cover = action_definition.get("action_cover", TOGGLE)
|
|
445
457
|
extra_data = action_definition.get("data", {})
|
|
446
458
|
cover = self.covers.get_cover(stripped_entity_id)
|
|
447
459
|
action_to_execute = cover_actions.get(action_cover)
|
|
448
460
|
if cover and action_to_execute:
|
|
449
461
|
_f = getattr(cover, action_to_execute, None)
|
|
450
462
|
if _f:
|
|
451
|
-
|
|
463
|
+
parsed_action = {
|
|
452
464
|
"action": action,
|
|
453
465
|
"pin": stripped_entity_id,
|
|
454
466
|
"action_to_execute": action_to_execute,
|
|
455
467
|
"extra_data": extra_data,
|
|
456
|
-
}
|
|
468
|
+
}
|
|
469
|
+
# Copy duration thresholds for long press actions
|
|
470
|
+
if action_definition.get("min_duration") is not None:
|
|
471
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
472
|
+
if action_definition.get("max_duration") is not None:
|
|
473
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
474
|
+
parsed_actions[click_type].append(parsed_action)
|
|
457
475
|
continue
|
|
458
476
|
_LOGGER.warning("Device %s for action not found. Omitting.", entity_id)
|
|
459
477
|
|
|
@@ -461,11 +479,17 @@ class Manager:
|
|
|
461
479
|
action_mqtt_msg = action_definition.get("action_mqtt_msg")
|
|
462
480
|
action_topic = action_definition.get(TOPIC)
|
|
463
481
|
if action_topic and action_mqtt_msg:
|
|
464
|
-
|
|
482
|
+
parsed_action = {
|
|
465
483
|
"action": action,
|
|
466
484
|
"action_mqtt_msg": action_mqtt_msg,
|
|
467
485
|
"action_topic": action_topic,
|
|
468
|
-
}
|
|
486
|
+
}
|
|
487
|
+
# Copy duration thresholds for long press actions
|
|
488
|
+
if action_definition.get("min_duration") is not None:
|
|
489
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
490
|
+
if action_definition.get("max_duration") is not None:
|
|
491
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
492
|
+
parsed_actions[click_type].append(parsed_action)
|
|
469
493
|
continue
|
|
470
494
|
_LOGGER.warning("MQTT action missing topic or message for %s", pin)
|
|
471
495
|
|
|
@@ -474,11 +498,17 @@ class Manager:
|
|
|
474
498
|
action_output = action_definition.get("action_output")
|
|
475
499
|
action_to_execute = output_actions.get(action_output.upper())
|
|
476
500
|
if boneio_id and action_to_execute:
|
|
477
|
-
|
|
501
|
+
parsed_action = {
|
|
478
502
|
"action": action,
|
|
479
503
|
"boneio_id": boneio_id,
|
|
480
504
|
"action_output": action_output,
|
|
481
|
-
}
|
|
505
|
+
}
|
|
506
|
+
# Copy duration thresholds for long press actions
|
|
507
|
+
if action_definition.get("min_duration") is not None:
|
|
508
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
509
|
+
if action_definition.get("max_duration") is not None:
|
|
510
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
511
|
+
parsed_actions[click_type].append(parsed_action)
|
|
482
512
|
continue
|
|
483
513
|
_LOGGER.warning("OUTPUT_OVER_MQTT action missing data for %s", pin)
|
|
484
514
|
|
|
@@ -487,11 +517,17 @@ class Manager:
|
|
|
487
517
|
action_cover = action_definition.get("action_cover")
|
|
488
518
|
action_to_execute = cover_actions.get(action_cover.upper())
|
|
489
519
|
if boneio_id and action_to_execute:
|
|
490
|
-
|
|
520
|
+
parsed_action = {
|
|
491
521
|
"action": action,
|
|
492
522
|
"boneio_id": boneio_id,
|
|
493
523
|
"action_cover": action_cover,
|
|
494
|
-
}
|
|
524
|
+
}
|
|
525
|
+
# Copy duration thresholds for long press actions
|
|
526
|
+
if action_definition.get("min_duration") is not None:
|
|
527
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
528
|
+
if action_definition.get("max_duration") is not None:
|
|
529
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
530
|
+
parsed_actions[click_type].append(parsed_action)
|
|
495
531
|
continue
|
|
496
532
|
_LOGGER.warning("COVER_OVER_MQTT action missing data for %s", pin)
|
|
497
533
|
|
|
@@ -501,12 +537,18 @@ class Manager:
|
|
|
501
537
|
output_id = action_definition.get("output_id")
|
|
502
538
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
503
539
|
if remote_device and output_id:
|
|
504
|
-
|
|
540
|
+
parsed_action = {
|
|
505
541
|
"action": action,
|
|
506
542
|
"remote_device": remote_device,
|
|
507
543
|
"output_id": output_id,
|
|
508
544
|
"action_output": action_output,
|
|
509
|
-
}
|
|
545
|
+
}
|
|
546
|
+
# Copy duration thresholds for long press actions
|
|
547
|
+
if action_definition.get("min_duration") is not None:
|
|
548
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
549
|
+
if action_definition.get("max_duration") is not None:
|
|
550
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
551
|
+
parsed_actions[click_type].append(parsed_action)
|
|
510
552
|
continue
|
|
511
553
|
_LOGGER.warning("REMOTE_OUTPUT action missing remote_device or output_id for %s", pin)
|
|
512
554
|
|
|
@@ -517,13 +559,19 @@ class Manager:
|
|
|
517
559
|
action_cover = action_definition.get("action_cover", "TOGGLE")
|
|
518
560
|
extra_data = action_definition.get("data", {})
|
|
519
561
|
if remote_device and cover_id:
|
|
520
|
-
|
|
562
|
+
parsed_action = {
|
|
521
563
|
"action": action,
|
|
522
564
|
"remote_device": remote_device,
|
|
523
565
|
"cover_id": cover_id,
|
|
524
566
|
"action_cover": action_cover,
|
|
525
567
|
"extra_data": extra_data,
|
|
526
|
-
}
|
|
568
|
+
}
|
|
569
|
+
# Copy duration thresholds for long press actions
|
|
570
|
+
if action_definition.get("min_duration") is not None:
|
|
571
|
+
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
572
|
+
if action_definition.get("max_duration") is not None:
|
|
573
|
+
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
574
|
+
parsed_actions[click_type].append(parsed_action)
|
|
527
575
|
continue
|
|
528
576
|
_LOGGER.warning("REMOTE_COVER action missing remote_device or cover_id for %s", pin)
|
|
529
577
|
|
|
@@ -531,18 +579,58 @@ class Manager:
|
|
|
531
579
|
|
|
532
580
|
async def execute_actions(
|
|
533
581
|
self,
|
|
534
|
-
actions: list
|
|
535
|
-
|
|
582
|
+
actions: list,
|
|
583
|
+
duration: float | None = None,
|
|
584
|
+
executed_actions: set[int] | None = None,
|
|
585
|
+
) -> set[int]:
|
|
536
586
|
"""Execute list of actions.
|
|
537
587
|
|
|
538
588
|
Args:
|
|
539
589
|
actions: List of actions to execute
|
|
590
|
+
duration: Current duration in seconds (for long press threshold checking)
|
|
591
|
+
executed_actions: Set of action indices already executed (for long press)
|
|
592
|
+
|
|
593
|
+
Returns:
|
|
594
|
+
Set of action indices that were executed
|
|
540
595
|
"""
|
|
596
|
+
if executed_actions is None:
|
|
597
|
+
executed_actions = set()
|
|
541
598
|
|
|
599
|
+
duration_ms = (duration or 0) * 1000 # Convert to ms
|
|
542
600
|
|
|
543
601
|
start_time = time.time()
|
|
544
602
|
|
|
545
|
-
for action_definition in actions:
|
|
603
|
+
for idx, action_definition in enumerate(actions):
|
|
604
|
+
# Skip if already executed
|
|
605
|
+
if idx in executed_actions:
|
|
606
|
+
_LOGGER.debug("Action %d already executed, skipping", idx)
|
|
607
|
+
continue
|
|
608
|
+
|
|
609
|
+
# Check duration thresholds
|
|
610
|
+
min_dur = action_definition.get("min_duration") # ms
|
|
611
|
+
max_dur = action_definition.get("max_duration") # ms
|
|
612
|
+
|
|
613
|
+
_LOGGER.debug(
|
|
614
|
+
"Checking action %d: min_dur=%s, max_dur=%s, duration_ms=%.1f, executed=%s",
|
|
615
|
+
idx, min_dur, max_dur, duration_ms, executed_actions
|
|
616
|
+
)
|
|
617
|
+
|
|
618
|
+
if min_dur is not None or max_dur is not None:
|
|
619
|
+
# Action has duration thresholds
|
|
620
|
+
if min_dur is not None and duration_ms < min_dur:
|
|
621
|
+
_LOGGER.debug("Action %d: duration %.1fms < min_dur %dms, skipping", idx, duration_ms, min_dur)
|
|
622
|
+
continue # Duration too short
|
|
623
|
+
if max_dur is not None and duration_ms >= max_dur:
|
|
624
|
+
_LOGGER.debug("Action %d: duration %.1fms >= max_dur %dms, skipping", idx, duration_ms, max_dur)
|
|
625
|
+
continue # Duration too long
|
|
626
|
+
_LOGGER.debug("Action %d: duration %.1fms in range [%s, %s), executing", idx, duration_ms, min_dur, max_dur)
|
|
627
|
+
else:
|
|
628
|
+
# Action without thresholds - execute only once (on first long event)
|
|
629
|
+
# Check if THIS specific action was already executed, not just any action
|
|
630
|
+
if idx in executed_actions:
|
|
631
|
+
_LOGGER.debug("Action %d: no thresholds, already executed, skipping", idx)
|
|
632
|
+
continue
|
|
633
|
+
_LOGGER.debug("Action %d: no thresholds, not yet executed, executing", idx)
|
|
546
634
|
action = action_definition.get("action")
|
|
547
635
|
|
|
548
636
|
if action == MQTT:
|
|
@@ -632,6 +720,11 @@ class Manager:
|
|
|
632
720
|
action=action_cover,
|
|
633
721
|
**extra_data,
|
|
634
722
|
)
|
|
723
|
+
|
|
724
|
+
# Mark action as executed
|
|
725
|
+
executed_actions.add(idx)
|
|
726
|
+
|
|
727
|
+
return executed_actions
|
|
635
728
|
|
|
636
729
|
def _reload_logger(self) -> None:
|
|
637
730
|
"""Reload logger configuration from config file.
|
|
@@ -670,7 +670,10 @@ class RemoteDeviceManager:
|
|
|
670
670
|
)
|
|
671
671
|
|
|
672
672
|
def _remove_autodiscovered_device(self, device_id: str) -> None:
|
|
673
|
-
"""Remove autodiscovered device.
|
|
673
|
+
"""Remove autodiscovered device from memory only.
|
|
674
|
+
|
|
675
|
+
This is called when receiving empty discovery payload.
|
|
676
|
+
Does NOT clear MQTT retained messages.
|
|
674
677
|
|
|
675
678
|
Args:
|
|
676
679
|
device_id: Device ID to remove
|
|
@@ -679,6 +682,46 @@ class RemoteDeviceManager:
|
|
|
679
682
|
del self._autodiscovered_devices[device_id]
|
|
680
683
|
_LOGGER.info("Removed autodiscovered device: %s", device_id)
|
|
681
684
|
|
|
685
|
+
def remove_autodiscovered_device_from_mqtt(self, device_id: str) -> None:
|
|
686
|
+
"""Remove autodiscovered device and clear MQTT retained messages.
|
|
687
|
+
|
|
688
|
+
This sends empty payloads to all discovery topics for the device,
|
|
689
|
+
which clears retained messages from MQTT broker.
|
|
690
|
+
|
|
691
|
+
Args:
|
|
692
|
+
device_id: Device ID to remove
|
|
693
|
+
"""
|
|
694
|
+
if not self._message_bus:
|
|
695
|
+
_LOGGER.error("Cannot remove device from MQTT - message_bus not set")
|
|
696
|
+
return
|
|
697
|
+
|
|
698
|
+
# List of all discovery subtopics
|
|
699
|
+
discovery_subtopics = [
|
|
700
|
+
"device",
|
|
701
|
+
"outputs",
|
|
702
|
+
"covers",
|
|
703
|
+
"inputs",
|
|
704
|
+
"sensors",
|
|
705
|
+
"modbus",
|
|
706
|
+
]
|
|
707
|
+
|
|
708
|
+
# Send empty payload to each discovery topic to clear retained messages
|
|
709
|
+
for subtopic in discovery_subtopics:
|
|
710
|
+
topic = f"{DISCOVERY_TOPIC_PREFIX}/{device_id}/{DISCOVERY_SUBTOPIC}/{subtopic}"
|
|
711
|
+
self._message_bus.send_message(
|
|
712
|
+
topic=topic,
|
|
713
|
+
payload=None, # Empty payload clears retained message
|
|
714
|
+
retain=True,
|
|
715
|
+
)
|
|
716
|
+
_LOGGER.debug("Cleared MQTT retained message for %s", topic)
|
|
717
|
+
|
|
718
|
+
# Remove from memory
|
|
719
|
+
if device_id in self._autodiscovered_devices:
|
|
720
|
+
del self._autodiscovered_devices[device_id]
|
|
721
|
+
_LOGGER.info("Removed autodiscovered device from MQTT and memory: %s", device_id)
|
|
722
|
+
else:
|
|
723
|
+
_LOGGER.warning("Device %s not in autodiscovered list, but cleared MQTT messages", device_id)
|
|
724
|
+
|
|
682
725
|
def get_autodiscovered_device(self, device_id: str) -> MQTTRemoteDevice | None:
|
|
683
726
|
"""Get autodiscovered device by ID.
|
|
684
727
|
|
|
@@ -452,6 +452,9 @@ def modbus_sensor_availabilty_message(
|
|
|
452
452
|
"""
|
|
453
453
|
topic = config_helper.topic_prefix
|
|
454
454
|
|
|
455
|
+
# Remove entity_id from kwargs to avoid conflict
|
|
456
|
+
kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
|
|
457
|
+
|
|
455
458
|
# Use base ha_availabilty_message and override modbus-specific fields
|
|
456
459
|
msg = ha_availabilty_message(
|
|
457
460
|
id=entity_id,
|
|
@@ -464,7 +467,7 @@ def modbus_sensor_availabilty_message(
|
|
|
464
467
|
manufacturer=manufacturer,
|
|
465
468
|
model=model,
|
|
466
469
|
area=area,
|
|
467
|
-
**
|
|
470
|
+
**kwargs_filtered,
|
|
468
471
|
)
|
|
469
472
|
|
|
470
473
|
# Override with modbus-specific values
|
|
@@ -511,6 +514,9 @@ def modbus_select_availabilty_message(
|
|
|
511
514
|
"""
|
|
512
515
|
topic = config_helper.topic_prefix
|
|
513
516
|
|
|
517
|
+
# Remove entity_id from kwargs to avoid conflict
|
|
518
|
+
kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
|
|
519
|
+
|
|
514
520
|
# Use base ha_availabilty_message and override modbus-specific fields
|
|
515
521
|
msg = ha_availabilty_message(
|
|
516
522
|
id=entity_id,
|
|
@@ -523,7 +529,7 @@ def modbus_select_availabilty_message(
|
|
|
523
529
|
manufacturer=manufacturer,
|
|
524
530
|
model=model,
|
|
525
531
|
area=area,
|
|
526
|
-
**
|
|
532
|
+
**kwargs_filtered,
|
|
527
533
|
)
|
|
528
534
|
|
|
529
535
|
# Override with modbus-specific values
|
|
@@ -570,6 +576,9 @@ def modbus_numeric_availabilty_message(
|
|
|
570
576
|
"""
|
|
571
577
|
topic = config_helper.topic_prefix
|
|
572
578
|
|
|
579
|
+
# Remove entity_id from kwargs to avoid conflict
|
|
580
|
+
kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
|
|
581
|
+
|
|
573
582
|
# Use base ha_availabilty_message and override modbus-specific fields
|
|
574
583
|
msg = ha_availabilty_message(
|
|
575
584
|
id=entity_id,
|
|
@@ -582,7 +591,7 @@ def modbus_numeric_availabilty_message(
|
|
|
582
591
|
manufacturer=manufacturer,
|
|
583
592
|
model=model,
|
|
584
593
|
area=area,
|
|
585
|
-
**
|
|
594
|
+
**kwargs_filtered,
|
|
586
595
|
)
|
|
587
596
|
|
|
588
597
|
# Override with modbus-specific values
|