boneIO 1.1.0.dev1__tar.gz → 1.1.0.dev3__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.dev3}/PKG-INFO +2 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/detectors.py +70 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/inputs.py +43 -2
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/manager.py +124 -22
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/remote.py +157 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/__init__.py +9 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/base.py +2 -0
- boneio-1.1.0.dev3/boneio/core/remote/wled.py +572 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/homeassistant.py +13 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/runner.py +2 -2
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions.yaml +18 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/remote_devices.yaml +106 -3
- boneio-1.1.0.dev3/boneio/version.py +2 -0
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/cssMode-jm8BgQUG.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/cssMode-D_Y1ZXCG.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/freemarker2-Dp0Xzx1I.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/freemarker2-CzSRjwLP.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/handlebars-DI4hd1VE.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/handlebars-CZgWREM_.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/html-CqpC7ec2.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/html-l_-Dx9v2.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/htmlMode-Cgw0dxSz.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/htmlMode-C94ufgZC.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-fvCxV9EK.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-BtWe9nS_.js +228 -228
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +1 -0
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/javascript-BW9tlink.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/javascript-CTWNFYCB.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/jsonMode-BEG4tw2F.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/jsonMode-6lY0okwf.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/liquid-xHiYCVBL.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/liquid-BpvwlD2T.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/mdx-DBRAmEVg.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/mdx-CLQNFljY.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/python-DdjAUqQp.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/python-Cq5ZYn3v.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/razor-CVHTFNOs.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/razor-kCTdL12M.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/tsMode-DR-WSiIu.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/tsMode-C1oHUIMn.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/typescript-ljc143Ju.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/typescript-Bg5eEWu8.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/xml-B6zOV41n.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/xml-CMwCv6rv.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/yaml-C4f2eVhb.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/yaml-CVxeQdw0.js +1 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +32 -0
- {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem}/config.schema.json +327 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/event.schema.json +112 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +4 -4
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +179 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/config.py +3 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/remote_devices.py +118 -0
- {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev3/boneio/webui/schema}/binary_sensor.schema.json +32 -0
- {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev3/boneio/webui/schema}/config.schema.json +327 -5
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/event.schema.json +112 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/modbus_devices.schema.json +4 -4
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/remote_devices.schema.json +179 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/web_server.py +34 -29
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3/boneio.egg-info}/PKG-INFO +2 -1
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/SOURCES.txt +18 -17
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/requires.txt +1 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/pyproject.toml +1 -0
- 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.dev3}/LICENSE +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/MANIFEST.in +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/README.md +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/bonecli.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/cover.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/previous.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/group/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/group/output_group.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/event.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/basic.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/mcp.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/pca.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/pcf.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/const.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/package.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/discovery.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/events/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/events/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/covers.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/display.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/local.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/system.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/state/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/state/manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/host_data.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/monitor.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/filter.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/logger.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/util.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/exceptions.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/interlock.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/cli.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/client.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/utils.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/actions.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/events.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/files.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/logs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/mqtt.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/state.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/filters.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/id.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/schema.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/app.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/web.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/system.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/update.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/services/logs.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/setup.cfg +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/setup.py +0 -0
- {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/tests/test_py313_compatibility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.1.0.
|
|
3
|
+
Version: 1.1.0.dev3
|
|
4
4
|
Summary: Python App for BoneIO
|
|
5
5
|
Author-email: Paweł Szafer <pszafer@gmail.com>
|
|
6
6
|
License: GNU General Public License v3.0
|
|
@@ -13,6 +13,7 @@ Description-Content-Type: text/markdown
|
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: smbus2==0.4.3
|
|
15
15
|
Requires-Dist: aiomqtt==2.4.0
|
|
16
|
+
Requires-Dist: aiohttp==3.13.3
|
|
16
17
|
Requires-Dist: Cerberus==1.3.7
|
|
17
18
|
Requires-Dist: colorlog==6.9.0
|
|
18
19
|
Requires-Dist: luma-core==2.5.1
|
|
@@ -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:
|
|
@@ -610,7 +698,7 @@ class Manager:
|
|
|
610
698
|
)
|
|
611
699
|
|
|
612
700
|
elif action == REMOTE_OUTPUT:
|
|
613
|
-
# Control output on remote device
|
|
701
|
+
# Control output on remote device (supports ESPHome lights with brightness/color and WLED effects)
|
|
614
702
|
remote_device_id = action_definition.get("remote_device")
|
|
615
703
|
output_id = action_definition.get("output_id")
|
|
616
704
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
@@ -618,6 +706,14 @@ class Manager:
|
|
|
618
706
|
device_id=remote_device_id,
|
|
619
707
|
output_id=output_id,
|
|
620
708
|
action=action_output,
|
|
709
|
+
brightness=action_definition.get("brightness"),
|
|
710
|
+
color_temp=action_definition.get("color_temp"),
|
|
711
|
+
rgb=action_definition.get("rgb"),
|
|
712
|
+
transition=action_definition.get("transition"),
|
|
713
|
+
effect=action_definition.get("effect"),
|
|
714
|
+
palette=action_definition.get("palette"),
|
|
715
|
+
effect_speed=action_definition.get("effect_speed"),
|
|
716
|
+
effect_intensity=action_definition.get("effect_intensity"),
|
|
621
717
|
)
|
|
622
718
|
|
|
623
719
|
elif action == REMOTE_COVER:
|
|
@@ -632,6 +728,11 @@ class Manager:
|
|
|
632
728
|
action=action_cover,
|
|
633
729
|
**extra_data,
|
|
634
730
|
)
|
|
731
|
+
|
|
732
|
+
# Mark action as executed
|
|
733
|
+
executed_actions.add(idx)
|
|
734
|
+
|
|
735
|
+
return executed_actions
|
|
635
736
|
|
|
636
737
|
def _reload_logger(self) -> None:
|
|
637
738
|
"""Reload logger configuration from config file.
|
|
@@ -647,16 +748,17 @@ class Manager:
|
|
|
647
748
|
configure_logger(log_config, debug=0)
|
|
648
749
|
_LOGGER.info("Logger configuration reloaded successfully")
|
|
649
750
|
|
|
650
|
-
def _reload_remote_devices(self) -> None:
|
|
751
|
+
async def _reload_remote_devices(self) -> None:
|
|
651
752
|
"""Reload remote devices configuration from config file.
|
|
652
753
|
|
|
653
754
|
This allows hot-reloading of remote devices without restarting the application.
|
|
755
|
+
Handles ESPHome connections properly (stops old, starts new).
|
|
654
756
|
"""
|
|
655
757
|
config = self._config_helper.get_config()
|
|
656
758
|
remote_devices_config = config.get("remote_devices", [])
|
|
657
759
|
|
|
658
760
|
_LOGGER.info("Reloading remote devices configuration")
|
|
659
|
-
self.remote_devices.reload(remote_devices_config)
|
|
761
|
+
await self.remote_devices.reload(remote_devices_config)
|
|
660
762
|
_LOGGER.info("Remote devices configuration reloaded successfully")
|
|
661
763
|
|
|
662
764
|
async def publish_discovery(self) -> None:
|