boneIO 1.1.0__tar.gz → 1.1.0.dev1__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/boneio.egg-info → boneio-1.1.0.dev1}/PKG-INFO +1 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/input/detectors.py +5 -70
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/config_helper.py +0 -8
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/inputs.py +2 -51
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/manager.py +22 -144
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/remote.py +5 -157
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/remote/__init__.py +0 -9
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/remote/base.py +0 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/integration/homeassistant.py +5 -57
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/runner.py +2 -3
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/actions.yaml +0 -18
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/remote_devices.yaml +3 -106
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/schema.yaml +0 -15
- boneio-1.1.0.dev1/boneio/version.py +2 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/app.py +0 -2
- boneio-1.1.0/boneio/webui/frontend-dist/assets/cssMode-SLqjH3qK.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/cssMode-jm8BgQUG.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/freemarker2-DXMvZO7c.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/freemarker2-Dp0Xzx1I.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/handlebars-DldmTvGn.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/handlebars-DI4hd1VE.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/html-BeFUXNc_.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/html-CqpC7ec2.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/htmlMode-D4OnYTmf.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/htmlMode-Cgw0dxSz.js +1 -1
- boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-Dxd5huyV.css +1 -0
- boneio-1.1.0/boneio/webui/frontend-dist/assets/index-AE1j15fF.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-fvCxV9EK.js +232 -232
- boneio-1.1.0/boneio/webui/frontend-dist/assets/javascript-tD5AV0w8.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/javascript-BW9tlink.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/jsonMode-D8KZNSNi.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/jsonMode-BEG4tw2F.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/liquid-B4w537sW.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/liquid-xHiYCVBL.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/mdx-DB1izvJl.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/mdx-DBRAmEVg.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/python-CG6dl7EF.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/python-DdjAUqQp.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/razor-BqVac-Wv.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/razor-CVHTFNOs.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/tsMode-CvBEEAxI.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/tsMode-DR-WSiIu.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/typescript-BIvQiQJr.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/typescript-ljc143Ju.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/xml-BtFDS-MH.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/xml-B6zOV41n.js +1 -1
- boneio-1.1.0/boneio/webui/frontend-dist/assets/yaml-D0Bwrhp9.js → boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/yaml-C4f2eVhb.js +1 -1
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/adc.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/areas.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +6 -38
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/config.schema.json +93 -437
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/cover.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/ds2482.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/event.schema.json +16 -128
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/ina219.schema.json +6 -6
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/lm75.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/modbus_devices.schema.json +10 -19
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/mqtt.schema.json +0 -13
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/oled.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/output.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/schema → boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/pca9685.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +13 -191
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/sensor.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/config.py +0 -3
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/remote_devices.py +0 -118
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/update.py +1 -42
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/adc.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/areas.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/binary_sensor.schema.json +6 -38
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/config.schema.json +93 -437
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/cover.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/ds2482.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/event.schema.json +16 -128
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/ina219.schema.json +6 -6
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/lm75.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/mcp23017.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/mcp9808.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/modbus_devices.schema.json +10 -19
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/mqtt.schema.json +0 -13
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/oled.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/output.schema.json +4 -4
- {boneio-1.1.0/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev1/boneio/webui/schema}/output_group.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/pca9685.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/pcf8575.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/remote_devices.schema.json +13 -191
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/sensor.schema.json +4 -4
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/web_server.py +29 -34
- {boneio-1.1.0 → boneio-1.1.0.dev1/boneio.egg-info}/PKG-INFO +1 -2
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio.egg-info/SOURCES.txt +17 -22
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio.egg-info/requires.txt +0 -1
- {boneio-1.1.0 → boneio-1.1.0.dev1}/pyproject.toml +0 -1
- boneio-1.1.0/boneio/core/manager/update.py +0 -341
- boneio-1.1.0/boneio/core/remote/wled.py +0 -572
- boneio-1.1.0/boneio/modbus/devices/energy_meters/le-03mw.json +0 -365
- boneio-1.1.0/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -365
- boneio-1.1.0/boneio/modbus/devices/other/n4dsc08.json +0 -132
- boneio-1.1.0/boneio/version.py +0 -2
- boneio-1.1.0/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +0 -1
- {boneio-1.1.0 → boneio-1.1.0.dev1}/LICENSE +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/MANIFEST.in +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/README.md +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/bonecli.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/cover/cover.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/cover/previous.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/group/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/group/output_group.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/input/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/input/event.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/output/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/output/basic.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/output/mcp.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/output/pca.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/output/pcf.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/const.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/package.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/discovery.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/events/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/events/bus.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/covers.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/display.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/local.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/sensor/base.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/sensor/system.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/state/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/state/manager.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/system/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/system/host_data.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/system/monitor.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/filter.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/logger.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/core/utils/util.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/exceptions.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/integration/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/integration/interlock.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/cli.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/client.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/modbus/utils.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/actions.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/events.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/files.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/logs.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/mqtt.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/models/state.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/filters.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/id.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/frontend-dist/schem/web.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/routes/system.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/services/logs.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/setup.cfg +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/setup.py +0 -0
- {boneio-1.1.0 → boneio-1.1.0.dev1}/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.dev1
|
|
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,7 +13,6 @@ 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
|
|
17
16
|
Requires-Dist: Cerberus==1.3.7
|
|
18
17
|
Requires-Dist: colorlog==6.9.0
|
|
19
18
|
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
|
|
9
9
|
from typing import cast
|
|
10
10
|
|
|
11
11
|
import gpiod
|
|
@@ -43,9 +43,6 @@ 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
|
|
49
46
|
|
|
50
47
|
|
|
51
48
|
@dataclass
|
|
@@ -355,14 +352,10 @@ class MultiClickDetector:
|
|
|
355
352
|
return None
|
|
356
353
|
|
|
357
354
|
def _detect_long_press(self) -> None:
|
|
358
|
-
"""Detect and report a long press
|
|
359
|
-
|
|
360
|
-
|
|
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
|
|
355
|
+
"""Detect and report a long press."""
|
|
356
|
+
duration = None
|
|
357
|
+
if self._state.last_press_ts and self._state.last_release_ts:
|
|
358
|
+
duration = self._state.last_release_ts - self._state.last_press_ts
|
|
366
359
|
|
|
367
360
|
_LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
|
|
368
361
|
|
|
@@ -372,36 +365,6 @@ class MultiClickDetector:
|
|
|
372
365
|
|
|
373
366
|
# Emit the long press (may also trigger sequence)
|
|
374
367
|
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
|
-
)
|
|
405
368
|
|
|
406
369
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
407
370
|
"""Process a GPIO edge event and update click state.
|
|
@@ -433,7 +396,6 @@ class MultiClickDetector:
|
|
|
433
396
|
|
|
434
397
|
_LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
|
|
435
398
|
self._state.last_press_ts = timestamp_s
|
|
436
|
-
self._state.last_release_ts = None # Reset release timestamp for new press
|
|
437
399
|
|
|
438
400
|
# Cancel any pending finalizer for a multi-click sequence
|
|
439
401
|
if self._state.finalizer:
|
|
@@ -487,33 +449,6 @@ class MultiClickDetector:
|
|
|
487
449
|
"EXISTS" if self._state.long_press_timer else "None",
|
|
488
450
|
)
|
|
489
451
|
|
|
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
|
-
|
|
517
452
|
# If a long press timer exists, it means it hasn't fired yet.
|
|
518
453
|
# This is a short click.
|
|
519
454
|
if self._state.long_press_timer:
|
|
@@ -45,7 +45,6 @@ class ConfigHelper:
|
|
|
45
45
|
config_file_path: str | None = None,
|
|
46
46
|
send_boneio_autodiscovery: bool = True,
|
|
47
47
|
receive_boneio_autodiscovery: bool = True,
|
|
48
|
-
update_channel: str = "stable",
|
|
49
48
|
):
|
|
50
49
|
self._name = name
|
|
51
50
|
|
|
@@ -64,7 +63,6 @@ class ConfigHelper:
|
|
|
64
63
|
self._ha_discovery_prefix = ha_discovery_prefix
|
|
65
64
|
self._send_boneio_autodiscovery = send_boneio_autodiscovery
|
|
66
65
|
self._receive_boneio_autodiscovery = receive_boneio_autodiscovery
|
|
67
|
-
self._update_channel = update_channel
|
|
68
66
|
self._device_type = device_type
|
|
69
67
|
self._web_port = web_port
|
|
70
68
|
self._proxy_port = proxy_port
|
|
@@ -81,7 +79,6 @@ class ConfigHelper:
|
|
|
81
79
|
TEXT_SENSOR: {},
|
|
82
80
|
SELECT: {},
|
|
83
81
|
NUMERIC: {},
|
|
84
|
-
"update": {}
|
|
85
82
|
}
|
|
86
83
|
self.manager_ready: bool = False
|
|
87
84
|
self._network_info = network_info
|
|
@@ -184,11 +181,6 @@ class ConfigHelper:
|
|
|
184
181
|
"""Check if BoneIO autodiscovery receiving is enabled."""
|
|
185
182
|
return self._receive_boneio_autodiscovery
|
|
186
183
|
|
|
187
|
-
@property
|
|
188
|
-
def update_channel(self) -> str:
|
|
189
|
-
"""Get update channel (stable or dev)."""
|
|
190
|
-
return self._update_channel
|
|
191
|
-
|
|
192
184
|
@property
|
|
193
185
|
def device_type(self) -> str:
|
|
194
186
|
return self._device_type
|
|
@@ -22,7 +22,6 @@ from boneio.const import (
|
|
|
22
22
|
ID,
|
|
23
23
|
INPUT,
|
|
24
24
|
INPUT_SENSOR,
|
|
25
|
-
LONG,
|
|
26
25
|
PIN,
|
|
27
26
|
PRESSED,
|
|
28
27
|
RELEASED,
|
|
@@ -687,56 +686,8 @@ class InputManager:
|
|
|
687
686
|
# Send event to MQTT for Home Assistant
|
|
688
687
|
self._publish_input_event_to_mqtt(input_instance, event)
|
|
689
688
|
|
|
690
|
-
#
|
|
691
|
-
if event.publish_only:
|
|
692
|
-
_LOGGER.debug(
|
|
693
|
-
"Skipping action execution for %s (publish_only=True)",
|
|
694
|
-
event.entity_id
|
|
695
|
-
)
|
|
696
|
-
return
|
|
697
|
-
|
|
698
|
-
# Execute actions with duration threshold support
|
|
699
|
-
if actions and event.click_type == LONG:
|
|
700
|
-
# Get executed_actions from detector state
|
|
701
|
-
detector = getattr(input_instance, '_detector', None)
|
|
702
|
-
executed_actions = getattr(detector._state, 'executed_long_actions', set()) if detector else set()
|
|
703
|
-
|
|
704
|
-
# Lazy evaluation: Check if there are any actions with duration thresholds
|
|
705
|
-
# or any actions without thresholds that haven't been executed yet
|
|
706
|
-
has_pending_actions = False
|
|
707
|
-
for idx, action in enumerate(actions):
|
|
708
|
-
if idx in executed_actions:
|
|
709
|
-
continue # Already executed
|
|
710
|
-
min_dur = action.get("min_duration")
|
|
711
|
-
max_dur = action.get("max_duration")
|
|
712
|
-
if min_dur is not None or max_dur is not None:
|
|
713
|
-
# Has duration thresholds - might need to execute
|
|
714
|
-
has_pending_actions = True
|
|
715
|
-
break
|
|
716
|
-
elif not executed_actions:
|
|
717
|
-
# No thresholds and nothing executed yet - first event
|
|
718
|
-
has_pending_actions = True
|
|
719
|
-
break
|
|
720
|
-
|
|
721
|
-
# Skip execute_actions if no pending actions (optimization for periodic events)
|
|
722
|
-
if not has_pending_actions:
|
|
723
|
-
_LOGGER.debug(
|
|
724
|
-
"Skipping execute_actions for %s - no pending actions (executed=%s)",
|
|
725
|
-
event.entity_id, executed_actions
|
|
726
|
-
)
|
|
727
|
-
else:
|
|
728
|
-
# Execute actions with duration checking
|
|
729
|
-
new_executed = await self._manager.execute_actions(
|
|
730
|
-
actions=actions,
|
|
731
|
-
duration=event.duration,
|
|
732
|
-
executed_actions=executed_actions,
|
|
733
|
-
)
|
|
734
|
-
|
|
735
|
-
# Update detector state
|
|
736
|
-
if detector:
|
|
737
|
-
detector._state.executed_long_actions = new_executed
|
|
738
|
-
elif actions:
|
|
739
|
-
# Non-long events - execute all actions normally
|
|
689
|
+
# Execute actions for this input event (skip if publish_only)
|
|
690
|
+
if actions and not event.publish_only:
|
|
740
691
|
await self._manager.execute_actions(actions=actions)
|
|
741
692
|
|
|
742
693
|
async def send_ha_autodiscovery(self) -> None:
|
|
@@ -26,7 +26,6 @@ from boneio.const import (
|
|
|
26
26
|
REMOTE_OUTPUT,
|
|
27
27
|
SET_BRIGHTNESS,
|
|
28
28
|
STATE,
|
|
29
|
-
TOGGLE,
|
|
30
29
|
cover_actions,
|
|
31
30
|
output_actions,
|
|
32
31
|
)
|
|
@@ -39,7 +38,6 @@ from boneio.core.manager.modbus import ModbusManager
|
|
|
39
38
|
from boneio.core.manager.outputs import OutputManager
|
|
40
39
|
from boneio.core.manager.sensors import SensorManager
|
|
41
40
|
from boneio.core.manager.remote import RemoteDeviceManager
|
|
42
|
-
from boneio.core.manager.update import UpdateManager
|
|
43
41
|
from boneio.core.discovery import BlackDiscoveryPublisher
|
|
44
42
|
from boneio.core.messaging import MessageBus
|
|
45
43
|
from boneio.core.state import StateManager
|
|
@@ -205,11 +203,6 @@ class Manager:
|
|
|
205
203
|
message_bus=message_bus,
|
|
206
204
|
)
|
|
207
205
|
|
|
208
|
-
# 9. UpdateManager (checks for software updates and publishes to HA)
|
|
209
|
-
self.update_manager = UpdateManager(
|
|
210
|
-
manager=self,
|
|
211
|
-
)
|
|
212
|
-
|
|
213
206
|
# Configure virtual energy sensors (must be after outputs are initialized)
|
|
214
207
|
self.sensors.configure_virtual_energy_sensors()
|
|
215
208
|
|
|
@@ -329,7 +322,6 @@ class Manager:
|
|
|
329
322
|
await self.sensors.send_ha_autodiscovery()
|
|
330
323
|
await self.modbus.send_ha_autodiscovery()
|
|
331
324
|
await self.display.send_ha_autodiscovery()
|
|
332
|
-
await self.update_manager.send_ha_autodiscovery()
|
|
333
325
|
|
|
334
326
|
def send_ha_autodiscovery(
|
|
335
327
|
self,
|
|
@@ -387,9 +379,6 @@ class Manager:
|
|
|
387
379
|
availability_msg_func = ha_cover_availabilty_message
|
|
388
380
|
elif ha_type == BUTTON:
|
|
389
381
|
availability_msg_func = ha_button_availabilty_message
|
|
390
|
-
elif ha_type == "update":
|
|
391
|
-
from boneio.integration.homeassistant import ha_update_availability_message
|
|
392
|
-
availability_msg_func = ha_update_availability_message
|
|
393
382
|
|
|
394
383
|
# Use availability_msg_func from kwargs if provided (for sensors)
|
|
395
384
|
if 'availability_msg_func' in kwargs:
|
|
@@ -410,16 +399,6 @@ class Manager:
|
|
|
410
399
|
)
|
|
411
400
|
self.send_message(topic=topic, payload=payload, retain=True)
|
|
412
401
|
|
|
413
|
-
async def _handle_update_install_command(self, topic: str, payload: str) -> None:
|
|
414
|
-
"""Handle update install command from Home Assistant.
|
|
415
|
-
|
|
416
|
-
Args:
|
|
417
|
-
topic: MQTT topic
|
|
418
|
-
payload: MQTT payload (should be "INSTALL")
|
|
419
|
-
"""
|
|
420
|
-
_LOGGER.info("Received update install command: %s", payload)
|
|
421
|
-
await self.update_manager.handle_install_command(payload)
|
|
422
|
-
|
|
423
402
|
def parse_actions(self, pin: str, actions: dict) -> dict:
|
|
424
403
|
"""Parse actions configuration.
|
|
425
404
|
|
|
@@ -444,28 +423,17 @@ class Manager:
|
|
|
444
423
|
# Support both new 'boneio_output' and legacy 'pin' for backward compatibility
|
|
445
424
|
entity_id = action_definition.get("boneio_output") or action_definition.get("pin")
|
|
446
425
|
stripped_entity_id = strip_accents(entity_id)
|
|
447
|
-
action_output = action_definition.get("action_output"
|
|
426
|
+
action_output = action_definition.get("action_output")
|
|
448
427
|
output = self.outputs.get_output(stripped_entity_id) or self.outputs.get_output_group(stripped_entity_id)
|
|
449
428
|
action_to_execute = output_actions.get(action_output)
|
|
450
429
|
if output and action_to_execute:
|
|
451
430
|
_f = getattr(output, action_to_execute, None)
|
|
452
431
|
if _f:
|
|
453
|
-
|
|
432
|
+
parsed_actions[click_type].append({
|
|
454
433
|
"action": action,
|
|
455
434
|
"pin": stripped_entity_id,
|
|
456
435
|
"action_to_execute": action_to_execute,
|
|
457
|
-
}
|
|
458
|
-
# Copy duration thresholds for long press actions
|
|
459
|
-
if action_definition.get("min_duration") is not None:
|
|
460
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
461
|
-
if action_definition.get("max_duration") is not None:
|
|
462
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
463
|
-
_LOGGER.debug(
|
|
464
|
-
"Parsed OUTPUT action for %s: output=%s, action=%s, min_dur=%s, max_dur=%s",
|
|
465
|
-
pin, stripped_entity_id, action_to_execute,
|
|
466
|
-
parsed_action.get("min_duration"), parsed_action.get("max_duration")
|
|
467
|
-
)
|
|
468
|
-
parsed_actions[click_type].append(parsed_action)
|
|
436
|
+
})
|
|
469
437
|
continue
|
|
470
438
|
_LOGGER.warning("Device %s for action in %s not found. Omitting.", entity_id, pin)
|
|
471
439
|
|
|
@@ -473,25 +441,19 @@ class Manager:
|
|
|
473
441
|
# Support both new 'boneio_cover' and legacy 'pin' for backward compatibility
|
|
474
442
|
entity_id = action_definition.get("boneio_cover") or action_definition.get("pin")
|
|
475
443
|
stripped_entity_id = strip_accents(entity_id)
|
|
476
|
-
action_cover = action_definition.get("action_cover"
|
|
444
|
+
action_cover = action_definition.get("action_cover")
|
|
477
445
|
extra_data = action_definition.get("data", {})
|
|
478
446
|
cover = self.covers.get_cover(stripped_entity_id)
|
|
479
447
|
action_to_execute = cover_actions.get(action_cover)
|
|
480
448
|
if cover and action_to_execute:
|
|
481
449
|
_f = getattr(cover, action_to_execute, None)
|
|
482
450
|
if _f:
|
|
483
|
-
|
|
451
|
+
parsed_actions[click_type].append({
|
|
484
452
|
"action": action,
|
|
485
453
|
"pin": stripped_entity_id,
|
|
486
454
|
"action_to_execute": action_to_execute,
|
|
487
455
|
"extra_data": extra_data,
|
|
488
|
-
}
|
|
489
|
-
# Copy duration thresholds for long press actions
|
|
490
|
-
if action_definition.get("min_duration") is not None:
|
|
491
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
492
|
-
if action_definition.get("max_duration") is not None:
|
|
493
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
494
|
-
parsed_actions[click_type].append(parsed_action)
|
|
456
|
+
})
|
|
495
457
|
continue
|
|
496
458
|
_LOGGER.warning("Device %s for action not found. Omitting.", entity_id)
|
|
497
459
|
|
|
@@ -499,17 +461,11 @@ class Manager:
|
|
|
499
461
|
action_mqtt_msg = action_definition.get("action_mqtt_msg")
|
|
500
462
|
action_topic = action_definition.get(TOPIC)
|
|
501
463
|
if action_topic and action_mqtt_msg:
|
|
502
|
-
|
|
464
|
+
parsed_actions[click_type].append({
|
|
503
465
|
"action": action,
|
|
504
466
|
"action_mqtt_msg": action_mqtt_msg,
|
|
505
467
|
"action_topic": action_topic,
|
|
506
|
-
}
|
|
507
|
-
# Copy duration thresholds for long press actions
|
|
508
|
-
if action_definition.get("min_duration") is not None:
|
|
509
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
510
|
-
if action_definition.get("max_duration") is not None:
|
|
511
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
512
|
-
parsed_actions[click_type].append(parsed_action)
|
|
468
|
+
})
|
|
513
469
|
continue
|
|
514
470
|
_LOGGER.warning("MQTT action missing topic or message for %s", pin)
|
|
515
471
|
|
|
@@ -518,17 +474,11 @@ class Manager:
|
|
|
518
474
|
action_output = action_definition.get("action_output")
|
|
519
475
|
action_to_execute = output_actions.get(action_output.upper())
|
|
520
476
|
if boneio_id and action_to_execute:
|
|
521
|
-
|
|
477
|
+
parsed_actions[click_type].append({
|
|
522
478
|
"action": action,
|
|
523
479
|
"boneio_id": boneio_id,
|
|
524
480
|
"action_output": action_output,
|
|
525
|
-
}
|
|
526
|
-
# Copy duration thresholds for long press actions
|
|
527
|
-
if action_definition.get("min_duration") is not None:
|
|
528
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
529
|
-
if action_definition.get("max_duration") is not None:
|
|
530
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
531
|
-
parsed_actions[click_type].append(parsed_action)
|
|
481
|
+
})
|
|
532
482
|
continue
|
|
533
483
|
_LOGGER.warning("OUTPUT_OVER_MQTT action missing data for %s", pin)
|
|
534
484
|
|
|
@@ -537,17 +487,11 @@ class Manager:
|
|
|
537
487
|
action_cover = action_definition.get("action_cover")
|
|
538
488
|
action_to_execute = cover_actions.get(action_cover.upper())
|
|
539
489
|
if boneio_id and action_to_execute:
|
|
540
|
-
|
|
490
|
+
parsed_actions[click_type].append({
|
|
541
491
|
"action": action,
|
|
542
492
|
"boneio_id": boneio_id,
|
|
543
493
|
"action_cover": action_cover,
|
|
544
|
-
}
|
|
545
|
-
# Copy duration thresholds for long press actions
|
|
546
|
-
if action_definition.get("min_duration") is not None:
|
|
547
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
548
|
-
if action_definition.get("max_duration") is not None:
|
|
549
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
550
|
-
parsed_actions[click_type].append(parsed_action)
|
|
494
|
+
})
|
|
551
495
|
continue
|
|
552
496
|
_LOGGER.warning("COVER_OVER_MQTT action missing data for %s", pin)
|
|
553
497
|
|
|
@@ -557,18 +501,12 @@ class Manager:
|
|
|
557
501
|
output_id = action_definition.get("output_id")
|
|
558
502
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
559
503
|
if remote_device and output_id:
|
|
560
|
-
|
|
504
|
+
parsed_actions[click_type].append({
|
|
561
505
|
"action": action,
|
|
562
506
|
"remote_device": remote_device,
|
|
563
507
|
"output_id": output_id,
|
|
564
508
|
"action_output": action_output,
|
|
565
|
-
}
|
|
566
|
-
# Copy duration thresholds for long press actions
|
|
567
|
-
if action_definition.get("min_duration") is not None:
|
|
568
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
569
|
-
if action_definition.get("max_duration") is not None:
|
|
570
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
571
|
-
parsed_actions[click_type].append(parsed_action)
|
|
509
|
+
})
|
|
572
510
|
continue
|
|
573
511
|
_LOGGER.warning("REMOTE_OUTPUT action missing remote_device or output_id for %s", pin)
|
|
574
512
|
|
|
@@ -579,19 +517,13 @@ class Manager:
|
|
|
579
517
|
action_cover = action_definition.get("action_cover", "TOGGLE")
|
|
580
518
|
extra_data = action_definition.get("data", {})
|
|
581
519
|
if remote_device and cover_id:
|
|
582
|
-
|
|
520
|
+
parsed_actions[click_type].append({
|
|
583
521
|
"action": action,
|
|
584
522
|
"remote_device": remote_device,
|
|
585
523
|
"cover_id": cover_id,
|
|
586
524
|
"action_cover": action_cover,
|
|
587
525
|
"extra_data": extra_data,
|
|
588
|
-
}
|
|
589
|
-
# Copy duration thresholds for long press actions
|
|
590
|
-
if action_definition.get("min_duration") is not None:
|
|
591
|
-
parsed_action["min_duration"] = action_definition["min_duration"]
|
|
592
|
-
if action_definition.get("max_duration") is not None:
|
|
593
|
-
parsed_action["max_duration"] = action_definition["max_duration"]
|
|
594
|
-
parsed_actions[click_type].append(parsed_action)
|
|
526
|
+
})
|
|
595
527
|
continue
|
|
596
528
|
_LOGGER.warning("REMOTE_COVER action missing remote_device or cover_id for %s", pin)
|
|
597
529
|
|
|
@@ -599,58 +531,18 @@ class Manager:
|
|
|
599
531
|
|
|
600
532
|
async def execute_actions(
|
|
601
533
|
self,
|
|
602
|
-
actions: list
|
|
603
|
-
|
|
604
|
-
executed_actions: set[int] | None = None,
|
|
605
|
-
) -> set[int]:
|
|
534
|
+
actions: list
|
|
535
|
+
) -> None:
|
|
606
536
|
"""Execute list of actions.
|
|
607
537
|
|
|
608
538
|
Args:
|
|
609
539
|
actions: List of actions to execute
|
|
610
|
-
duration: Current duration in seconds (for long press threshold checking)
|
|
611
|
-
executed_actions: Set of action indices already executed (for long press)
|
|
612
|
-
|
|
613
|
-
Returns:
|
|
614
|
-
Set of action indices that were executed
|
|
615
540
|
"""
|
|
616
|
-
if executed_actions is None:
|
|
617
|
-
executed_actions = set()
|
|
618
541
|
|
|
619
|
-
duration_ms = (duration or 0) * 1000 # Convert to ms
|
|
620
542
|
|
|
621
543
|
start_time = time.time()
|
|
622
544
|
|
|
623
|
-
for
|
|
624
|
-
# Skip if already executed
|
|
625
|
-
if idx in executed_actions:
|
|
626
|
-
_LOGGER.debug("Action %d already executed, skipping", idx)
|
|
627
|
-
continue
|
|
628
|
-
|
|
629
|
-
# Check duration thresholds
|
|
630
|
-
min_dur = action_definition.get("min_duration") # ms
|
|
631
|
-
max_dur = action_definition.get("max_duration") # ms
|
|
632
|
-
|
|
633
|
-
_LOGGER.debug(
|
|
634
|
-
"Checking action %d: min_dur=%s, max_dur=%s, duration_ms=%.1f, executed=%s",
|
|
635
|
-
idx, min_dur, max_dur, duration_ms, executed_actions
|
|
636
|
-
)
|
|
637
|
-
|
|
638
|
-
if min_dur is not None or max_dur is not None:
|
|
639
|
-
# Action has duration thresholds
|
|
640
|
-
if min_dur is not None and duration_ms < min_dur:
|
|
641
|
-
_LOGGER.debug("Action %d: duration %.1fms < min_dur %dms, skipping", idx, duration_ms, min_dur)
|
|
642
|
-
continue # Duration too short
|
|
643
|
-
if max_dur is not None and duration_ms >= max_dur:
|
|
644
|
-
_LOGGER.debug("Action %d: duration %.1fms >= max_dur %dms, skipping", idx, duration_ms, max_dur)
|
|
645
|
-
continue # Duration too long
|
|
646
|
-
_LOGGER.debug("Action %d: duration %.1fms in range [%s, %s), executing", idx, duration_ms, min_dur, max_dur)
|
|
647
|
-
else:
|
|
648
|
-
# Action without thresholds - execute only once (on first long event)
|
|
649
|
-
# Check if THIS specific action was already executed, not just any action
|
|
650
|
-
if idx in executed_actions:
|
|
651
|
-
_LOGGER.debug("Action %d: no thresholds, already executed, skipping", idx)
|
|
652
|
-
continue
|
|
653
|
-
_LOGGER.debug("Action %d: no thresholds, not yet executed, executing", idx)
|
|
545
|
+
for action_definition in actions:
|
|
654
546
|
action = action_definition.get("action")
|
|
655
547
|
|
|
656
548
|
if action == MQTT:
|
|
@@ -718,7 +610,7 @@ class Manager:
|
|
|
718
610
|
)
|
|
719
611
|
|
|
720
612
|
elif action == REMOTE_OUTPUT:
|
|
721
|
-
# Control output on remote device
|
|
613
|
+
# Control output on remote device
|
|
722
614
|
remote_device_id = action_definition.get("remote_device")
|
|
723
615
|
output_id = action_definition.get("output_id")
|
|
724
616
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
@@ -726,14 +618,6 @@ class Manager:
|
|
|
726
618
|
device_id=remote_device_id,
|
|
727
619
|
output_id=output_id,
|
|
728
620
|
action=action_output,
|
|
729
|
-
brightness=action_definition.get("brightness"),
|
|
730
|
-
color_temp=action_definition.get("color_temp"),
|
|
731
|
-
rgb=action_definition.get("rgb"),
|
|
732
|
-
transition=action_definition.get("transition"),
|
|
733
|
-
effect=action_definition.get("effect"),
|
|
734
|
-
palette=action_definition.get("palette"),
|
|
735
|
-
effect_speed=action_definition.get("effect_speed"),
|
|
736
|
-
effect_intensity=action_definition.get("effect_intensity"),
|
|
737
621
|
)
|
|
738
622
|
|
|
739
623
|
elif action == REMOTE_COVER:
|
|
@@ -748,11 +632,6 @@ class Manager:
|
|
|
748
632
|
action=action_cover,
|
|
749
633
|
**extra_data,
|
|
750
634
|
)
|
|
751
|
-
|
|
752
|
-
# Mark action as executed
|
|
753
|
-
executed_actions.add(idx)
|
|
754
|
-
|
|
755
|
-
return executed_actions
|
|
756
635
|
|
|
757
636
|
def _reload_logger(self) -> None:
|
|
758
637
|
"""Reload logger configuration from config file.
|
|
@@ -768,17 +647,16 @@ class Manager:
|
|
|
768
647
|
configure_logger(log_config, debug=0)
|
|
769
648
|
_LOGGER.info("Logger configuration reloaded successfully")
|
|
770
649
|
|
|
771
|
-
|
|
650
|
+
def _reload_remote_devices(self) -> None:
|
|
772
651
|
"""Reload remote devices configuration from config file.
|
|
773
652
|
|
|
774
653
|
This allows hot-reloading of remote devices without restarting the application.
|
|
775
|
-
Handles ESPHome connections properly (stops old, starts new).
|
|
776
654
|
"""
|
|
777
655
|
config = self._config_helper.get_config()
|
|
778
656
|
remote_devices_config = config.get("remote_devices", [])
|
|
779
657
|
|
|
780
658
|
_LOGGER.info("Reloading remote devices configuration")
|
|
781
|
-
|
|
659
|
+
self.remote_devices.reload(remote_devices_config)
|
|
782
660
|
_LOGGER.info("Remote devices configuration reloaded successfully")
|
|
783
661
|
|
|
784
662
|
async def publish_discovery(self) -> None:
|