boneIO 1.0.0.dev16__tar.gz → 1.0.0.dev17__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.0.0.dev16/boneio.egg-info → boneio-1.0.0.dev17}/PKG-INFO +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/binary_sensor.py +51 -9
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/detectors.py +88 -11
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/event.py +39 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/sensor/__init__.py +0 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/const.py +21 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/__init__.py +0 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/config_helper.py +40 -3
- boneio-1.0.0.dev17/boneio/core/discovery.py +215 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/inputs.py +15 -7
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/manager.py +163 -21
- boneio-1.0.0.dev17/boneio/core/manager/remote.py +526 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/mqtt.py +4 -1
- boneio-1.0.0.dev17/boneio/core/remote/__init__.py +17 -0
- boneio-1.0.0.dev17/boneio/core/remote/base.py +190 -0
- boneio-1.0.0.dev17/boneio/core/remote/mqtt.py +228 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/__init__.py +2 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/host_data.py +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/monitor.py +27 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/oled.py +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/mcp23017.py +15 -5
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/base.py +0 -17
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/manager.py +2 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/homeassistant.py +13 -9
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/coordinator.py +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/base.py +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/events.py +2 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/runner.py +13 -3
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions.yaml +43 -8
- boneio-1.0.0.dev17/boneio/schema/remote_devices.yaml +238 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/schema.yaml +38 -5
- boneio-1.0.0.dev17/boneio/version.py +2 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/app.py +4 -0
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/cssMode-QxydMKp3.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/cssMode-QoOqCovH.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/freemarker2-CqZTNGBJ.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/freemarker2-B-dpyTDW.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/handlebars-D3pxJE9P.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/handlebars-B5mgUJF9.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/html-BLDqv33U.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/html-D9OGQIEe.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/htmlMode-DsQz2ysT.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/htmlMode-D4Ix6mpf.js +1 -1
- boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/index-B4aCO-vf.css +1 -0
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/index-COdHWIXk.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/index-BDaGsK_8.js +243 -231
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/javascript-d4IlOeDI.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/javascript-DI0FFRvY.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/jsonMode-C-OVwgai.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/jsonMode-O-uA0ySa.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/liquid-BT-XduC3.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/liquid-DiK6mCoW.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/mdx-DUyJy2Gq.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/mdx-sdao5Kao.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/python-HIqJekKB.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/python-DOkyOwvp.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/razor-BXb9QAir.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/razor-BP6jWEuB.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/tsMode-BJ3LU2EO.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/tsMode-CIxSemvA.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/typescript-CR2wc4Px.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/typescript-CrL1nAsH.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/xml-BmZ15-A-.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/xml-BE8YmEl_.js +1 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/yaml-D12QiiRL.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/yaml-CAzZpYpL.js +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/adc.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/areas.schema.json +4 -4
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +70 -28
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/config.schema.json +1165 -306
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/cover.schema.json +4 -4
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/ds2482.schema.json +4 -4
- boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem/event.schema.json +1350 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/ina219.schema.json +14 -14
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/lm75.schema.json +10 -10
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/logger.schema.json +2 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +10 -10
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/modbus.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +22 -22
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/mqtt.schema.json +50 -11
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/oled.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/output.schema.json +10 -10
- {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/output_group.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/pca9685.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +6 -6
- boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem/remote_devices.schema.json +135 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/sensor.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +4 -4
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/web.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/__init__.py +2 -0
- boneio-1.0.0.dev17/boneio/webui/routes/remote_devices.py +248 -0
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/adc.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/areas.schema.json +4 -4
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/binary_sensor.schema.json +70 -28
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/boneio.schema.json +2 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/config.schema.json +1165 -306
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/cover.schema.json +4 -4
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/ds2482.schema.json +4 -4
- boneio-1.0.0.dev17/boneio/webui/schema/event.schema.json +1350 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/ina219.schema.json +14 -14
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/lm75.schema.json +10 -10
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/logger.schema.json +2 -2
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/mcp23017.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/mcp9808.schema.json +10 -10
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/modbus.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/modbus_devices.schema.json +22 -22
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/mqtt.schema.json +50 -11
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/oled.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/output.schema.json +10 -10
- {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/output_group.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/pca9685.schema.json +6 -6
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/pcf8575.schema.json +6 -6
- boneio-1.0.0.dev17/boneio/webui/schema/remote_devices.schema.json +135 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/sensor.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/virtual_energy_sensor.schema.json +4 -4
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/web.schema.json +8 -8
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/SOURCES.txt +26 -19
- boneio-1.0.0.dev16/boneio/components/sensor/system.py +0 -100
- boneio-1.0.0.dev16/boneio/core/config/loader.py +0 -38
- boneio-1.0.0.dev16/boneio/version.py +0 -2
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/index-DVtWGohA.css +0 -1
- boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem/event.schema.json +0 -701
- boneio-1.0.0.dev16/boneio/webui/schema/event.schema.json +0 -701
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/LICENSE +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/MANIFEST.in +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/README.md +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/bonecli.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/cover.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/previous.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/group/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/group/output_group.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/basic.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/mcp.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/pca.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/pcf.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/package.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/events/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/events/bus.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/covers.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/display.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/local.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/base.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/system.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/state/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/state/manager.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/filter.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/logger.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/util.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/exceptions.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/interlock.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/cli.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/client.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/utils.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/actions.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/files.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/logs.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/mqtt.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/state.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/filters.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/id.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/config.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/system.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/update.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/services/logs.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/web_server.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/pyproject.toml +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/setup.cfg +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/setup.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/tests/test_i2c_smbus2.py +0 -0
- {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/tests/test_py313_compatibility.py +0 -0
|
@@ -4,9 +4,14 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
|
|
7
|
+
import time
|
|
8
|
+
from typing import cast
|
|
9
|
+
|
|
7
10
|
from boneio.components.input.detectors import BinarySensorDetector
|
|
8
|
-
from boneio.const import BinaryStateTypes, PRESSED, RELEASED
|
|
11
|
+
from boneio.const import BinaryStateTypes, ClickTypes, PRESSED, RELEASED
|
|
9
12
|
from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
|
|
13
|
+
from boneio.models import InputState
|
|
14
|
+
from boneio.models.events import InputEvent
|
|
10
15
|
|
|
11
16
|
_LOGGER = logging.getLogger(__name__)
|
|
12
17
|
|
|
@@ -51,24 +56,61 @@ class GpioInputBinarySensor(GpioBaseClass):
|
|
|
51
56
|
|
|
52
57
|
# Send initial state if requested
|
|
53
58
|
if kwargs.get("initial_send", False):
|
|
54
|
-
self._loop.call_soon(self._send_initial_state)
|
|
59
|
+
self._loop.call_soon(callback=self._send_initial_state)
|
|
55
60
|
|
|
56
61
|
def _send_initial_state(self) -> None:
|
|
57
62
|
"""Send initial state after setup."""
|
|
63
|
+
self.send_current_state()
|
|
64
|
+
|
|
65
|
+
def send_current_state(self) -> None:
|
|
66
|
+
"""Send current state to MQTT without triggering actions.
|
|
67
|
+
|
|
68
|
+
This can be called on startup (if initial_send=True) or after config reload.
|
|
69
|
+
Only publishes state to MQTT broker, does not execute any configured actions.
|
|
70
|
+
"""
|
|
58
71
|
# Read current state from GPIO manager
|
|
59
|
-
|
|
60
|
-
current_value =
|
|
72
|
+
gpio_manager = get_gpio_manager(loop=self._loop)
|
|
73
|
+
current_value = gpio_manager.read_value(self._pin)
|
|
61
74
|
|
|
62
75
|
# Determine state based on inversion
|
|
63
76
|
is_pressed = not current_value if not self._inverted else current_value
|
|
64
77
|
state_str = PRESSED if is_pressed else RELEASED
|
|
65
78
|
|
|
66
|
-
_LOGGER.debug("
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
_LOGGER.debug("Publishing current state for %s: %s (publish_only)", self._name, state_str)
|
|
80
|
+
|
|
81
|
+
# Use publish_only=True to send to MQTT without executing actions
|
|
82
|
+
self._publish_state_only(state_str)
|
|
83
|
+
|
|
84
|
+
def _publish_state_only(self, state_str: str) -> None:
|
|
85
|
+
"""Publish state to MQTT without triggering actions.
|
|
86
|
+
|
|
87
|
+
Creates an InputEvent with publish_only=True flag, which tells
|
|
88
|
+
the InputManager to only publish to MQTT without executing actions.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
state_str: State string (PRESSED or RELEASED)
|
|
92
|
+
"""
|
|
93
|
+
timestamp = time.time()
|
|
94
|
+
|
|
95
|
+
# Create event state
|
|
96
|
+
event_state = InputState(
|
|
97
|
+
name=self.name,
|
|
98
|
+
pin=self._pin,
|
|
99
|
+
state=state_str,
|
|
100
|
+
type=self.input_type,
|
|
101
|
+
timestamp=timestamp,
|
|
102
|
+
boneio_input=self.boneio_input,
|
|
103
|
+
area=self.area,
|
|
71
104
|
)
|
|
105
|
+
|
|
106
|
+
# Trigger event with publish_only=True
|
|
107
|
+
self._event_bus.trigger_event(InputEvent(
|
|
108
|
+
entity_id=self.id,
|
|
109
|
+
click_type=cast(ClickTypes, state_str),
|
|
110
|
+
duration=None,
|
|
111
|
+
state=event_state,
|
|
112
|
+
publish_only=True,
|
|
113
|
+
))
|
|
72
114
|
|
|
73
115
|
def _on_state_changed(self, state: BinaryStateTypes, timestamp: float) -> None:
|
|
74
116
|
"""Called by BinarySensorDetector when state changes.
|
|
@@ -6,10 +6,22 @@ import asyncio
|
|
|
6
6
|
import logging
|
|
7
7
|
from collections.abc import Callable
|
|
8
8
|
from dataclasses import dataclass
|
|
9
|
+
from typing import cast
|
|
9
10
|
|
|
10
11
|
import gpiod
|
|
11
12
|
|
|
12
|
-
from boneio.const import
|
|
13
|
+
from boneio.const import (
|
|
14
|
+
BinaryStateTypes,
|
|
15
|
+
ClickTypes,
|
|
16
|
+
CLICK_SEQUENCES,
|
|
17
|
+
DEFAULT_SEQUENCE_WINDOW_MS,
|
|
18
|
+
DOUBLE,
|
|
19
|
+
LONG,
|
|
20
|
+
PRESSED,
|
|
21
|
+
RELEASED,
|
|
22
|
+
SINGLE,
|
|
23
|
+
TRIPLE,
|
|
24
|
+
)
|
|
13
25
|
|
|
14
26
|
_LOGGER = logging.getLogger(__name__)
|
|
15
27
|
|
|
@@ -24,6 +36,9 @@ class ClickState:
|
|
|
24
36
|
finalizer_scheduled_loop_ts: float | None = None
|
|
25
37
|
long_press_timer: asyncio.TimerHandle | None = None
|
|
26
38
|
long_press_scheduled_loop_ts: float | None = None
|
|
39
|
+
# Sequence tracking
|
|
40
|
+
last_click_type: str | None = None
|
|
41
|
+
last_click_time: float | None = None
|
|
27
42
|
|
|
28
43
|
|
|
29
44
|
@dataclass
|
|
@@ -35,8 +50,9 @@ class BinarySensorState:
|
|
|
35
50
|
|
|
36
51
|
|
|
37
52
|
class MultiClickDetector:
|
|
38
|
-
"""Detects single, double,
|
|
53
|
+
"""Detects single, double, triple, long-press events and sequences with software debounce.
|
|
39
54
|
|
|
55
|
+
Supports sequence detection like double_then_long, single_then_long, etc.
|
|
40
56
|
Based on multiclick_detector.py from tests.
|
|
41
57
|
"""
|
|
42
58
|
|
|
@@ -47,6 +63,7 @@ class MultiClickDetector:
|
|
|
47
63
|
debounce_ms: float = 50.0,
|
|
48
64
|
multiclick_window_ms: float = 220.0,
|
|
49
65
|
hold_threshold_ms: float = 400.0,
|
|
66
|
+
sequence_window_ms: float = DEFAULT_SEQUENCE_WINDOW_MS,
|
|
50
67
|
name: str = "unknown",
|
|
51
68
|
pin: str = "unknown",
|
|
52
69
|
):
|
|
@@ -58,6 +75,7 @@ class MultiClickDetector:
|
|
|
58
75
|
debounce_ms: Debounce time in milliseconds
|
|
59
76
|
multiclick_window_ms: Window for double-click detection
|
|
60
77
|
hold_threshold_ms: Time threshold for long press
|
|
78
|
+
sequence_window_ms: Window for sequence detection (e.g., double_then_long)
|
|
61
79
|
name: Name of the input
|
|
62
80
|
pin: Pin name for logging
|
|
63
81
|
"""
|
|
@@ -66,6 +84,7 @@ class MultiClickDetector:
|
|
|
66
84
|
self._debounce_seconds = debounce_ms / 1000.0
|
|
67
85
|
self._multiclick_window = multiclick_window_ms / 1000.0
|
|
68
86
|
self._hold_threshold = hold_threshold_ms / 1000.0
|
|
87
|
+
self._sequence_window = sequence_window_ms / 1000.0
|
|
69
88
|
self._name = name
|
|
70
89
|
self._pin = pin
|
|
71
90
|
self._state = ClickState()
|
|
@@ -80,19 +99,80 @@ class MultiClickDetector:
|
|
|
80
99
|
elif count == 2:
|
|
81
100
|
click_type = DOUBLE
|
|
82
101
|
_LOGGER.info("Detected DOUBLE click on %s (%s)", self._name, self._pin)
|
|
102
|
+
elif count == 3:
|
|
103
|
+
click_type = TRIPLE
|
|
104
|
+
_LOGGER.info("Detected TRIPLE click on %s (%s)", self._name, self._pin)
|
|
83
105
|
else:
|
|
84
|
-
click_type = SINGLE # Fallback for
|
|
106
|
+
click_type = SINGLE # Fallback for 4+ clicks
|
|
85
107
|
_LOGGER.info("Detected %d clicks on %s (%s), treating as SINGLE", count, self._name, self._pin)
|
|
86
108
|
|
|
87
109
|
self._state.click_count = 0
|
|
88
110
|
self._state.finalizer = None
|
|
89
111
|
self._state.finalizer_scheduled_loop_ts = None
|
|
90
112
|
|
|
91
|
-
#
|
|
113
|
+
# Emit the click
|
|
114
|
+
self._emit_click(click_type, None)
|
|
115
|
+
|
|
116
|
+
def _emit_click(self, click_type: ClickTypes, duration: float | None) -> None:
|
|
117
|
+
"""Emit a click event, checking for sequences first.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
click_type: The detected click type (single, double, triple, long)
|
|
121
|
+
duration: Duration of the click (for long press)
|
|
122
|
+
"""
|
|
123
|
+
current_time = self._loop.time()
|
|
124
|
+
|
|
125
|
+
# Check if this click forms a sequence with the previous one
|
|
126
|
+
sequence_type = self._check_sequence(click_type, current_time)
|
|
127
|
+
if sequence_type:
|
|
128
|
+
_LOGGER.info(
|
|
129
|
+
"Detected sequence %s on %s (%s)",
|
|
130
|
+
sequence_type.upper(), self._name, self._pin
|
|
131
|
+
)
|
|
132
|
+
try:
|
|
133
|
+
self._callback(sequence_type, duration)
|
|
134
|
+
except Exception as exc:
|
|
135
|
+
_LOGGER.error("Error in sequence callback for %s: %s", self._name, exc, exc_info=True)
|
|
136
|
+
|
|
137
|
+
# Always emit the basic click type
|
|
92
138
|
try:
|
|
93
|
-
self._callback(click_type,
|
|
139
|
+
self._callback(click_type, duration)
|
|
94
140
|
except Exception as exc:
|
|
95
|
-
_LOGGER.error("Error in
|
|
141
|
+
_LOGGER.error("Error in click callback for %s: %s", self._name, exc, exc_info=True)
|
|
142
|
+
|
|
143
|
+
# Remember this click for potential sequence detection
|
|
144
|
+
self._state.last_click_type = click_type
|
|
145
|
+
self._state.last_click_time = current_time
|
|
146
|
+
|
|
147
|
+
def _check_sequence(self, current_click: ClickTypes, current_time: float) -> ClickTypes | None:
|
|
148
|
+
"""Check if current click forms a sequence with previous click.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
current_click: Current click type
|
|
152
|
+
current_time: Current timestamp
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Sequence type if detected, None otherwise
|
|
156
|
+
"""
|
|
157
|
+
if not self._state.last_click_type or not self._state.last_click_time:
|
|
158
|
+
return None
|
|
159
|
+
|
|
160
|
+
elapsed = current_time - self._state.last_click_time
|
|
161
|
+
if elapsed > self._sequence_window:
|
|
162
|
+
# Too much time passed, no sequence - this is normal behavior
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
# Look up sequence in mapping
|
|
166
|
+
sequence_key = (self._state.last_click_type, current_click)
|
|
167
|
+
sequence_type = CLICK_SEQUENCES.get(sequence_key)
|
|
168
|
+
|
|
169
|
+
if sequence_type:
|
|
170
|
+
# Clear sequence state to prevent chaining
|
|
171
|
+
self._state.last_click_type = None
|
|
172
|
+
self._state.last_click_time = None
|
|
173
|
+
return cast(ClickTypes, sequence_type)
|
|
174
|
+
|
|
175
|
+
return None
|
|
96
176
|
|
|
97
177
|
def _detect_long_press(self) -> None:
|
|
98
178
|
"""Detect and report a long press."""
|
|
@@ -106,11 +186,8 @@ class MultiClickDetector:
|
|
|
106
186
|
self._state.long_press_timer = None
|
|
107
187
|
self._state.long_press_scheduled_loop_ts = None
|
|
108
188
|
|
|
109
|
-
#
|
|
110
|
-
|
|
111
|
-
self._callback(LONG, duration)
|
|
112
|
-
except Exception as exc:
|
|
113
|
-
_LOGGER.error("Error in long press callback for %s: %s", self._name, exc, exc_info=True)
|
|
189
|
+
# Emit the long press (may also trigger sequence)
|
|
190
|
+
self._emit_click(LONG, duration)
|
|
114
191
|
|
|
115
192
|
def handle_event(self, event: gpiod.EdgeEvent) -> None:
|
|
116
193
|
"""Process a GPIO edge event and update click state.
|
|
@@ -15,6 +15,7 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
15
15
|
# DEFAULT TIMINGS FOR BUTTONS (can be overridden in config)
|
|
16
16
|
DEFAULT_DOUBLE_CLICK_DURATION_MS = 220
|
|
17
17
|
DEFAULT_LONG_PRESS_DURATION_MS = 400
|
|
18
|
+
DEFAULT_SEQUENCE_WINDOW_MS = 500
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def _to_milliseconds(value, default_ms: int) -> int:
|
|
@@ -45,6 +46,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
45
46
|
Args:
|
|
46
47
|
double_click_duration: Time window in ms to detect double click (default: 220ms)
|
|
47
48
|
long_press_duration: Time in ms to detect long press (default: 400ms)
|
|
49
|
+
sequence_window_duration: Time window in ms to detect sequences (default: 500ms)
|
|
48
50
|
**kwargs: Additional arguments passed to GpioBaseClass
|
|
49
51
|
"""
|
|
50
52
|
super().__init__(**kwargs)
|
|
@@ -58,6 +60,10 @@ class GpioEventButton(GpioBaseClass):
|
|
|
58
60
|
kwargs.get('long_press_duration'),
|
|
59
61
|
DEFAULT_LONG_PRESS_DURATION_MS
|
|
60
62
|
)
|
|
63
|
+
sequence_window_duration = _to_milliseconds(
|
|
64
|
+
kwargs.get('sequence_window_duration'),
|
|
65
|
+
DEFAULT_SEQUENCE_WINDOW_MS
|
|
66
|
+
)
|
|
61
67
|
|
|
62
68
|
# Create multiclick detector
|
|
63
69
|
self._detector = MultiClickDetector(
|
|
@@ -66,6 +72,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
66
72
|
debounce_ms=self._bounce_time * 1000, # Convert to ms
|
|
67
73
|
multiclick_window_ms=double_click_duration,
|
|
68
74
|
hold_threshold_ms=long_press_duration,
|
|
75
|
+
sequence_window_ms=sequence_window_duration,
|
|
69
76
|
name=self._name,
|
|
70
77
|
pin=self._pin,
|
|
71
78
|
)
|
|
@@ -102,4 +109,35 @@ class GpioEventButton(GpioBaseClass):
|
|
|
102
109
|
click_type=click_type,
|
|
103
110
|
duration=duration,
|
|
104
111
|
start_time=start_time,
|
|
105
|
-
)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def update_timings(
|
|
115
|
+
self,
|
|
116
|
+
double_click_duration: int | float | None = None,
|
|
117
|
+
long_press_duration: int | float | None = None,
|
|
118
|
+
sequence_window_duration: int | float | None = None,
|
|
119
|
+
) -> None:
|
|
120
|
+
"""Update timing parameters for click detection.
|
|
121
|
+
|
|
122
|
+
This method allows updating timing parameters at runtime without
|
|
123
|
+
recreating the detector. Useful for config reload.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
double_click_duration: Time window in ms to detect double click
|
|
127
|
+
long_press_duration: Time in ms to detect long press
|
|
128
|
+
sequence_window_duration: Time window in ms to detect sequences
|
|
129
|
+
"""
|
|
130
|
+
if double_click_duration is not None:
|
|
131
|
+
value_ms = _to_milliseconds(double_click_duration, DEFAULT_DOUBLE_CLICK_DURATION_MS)
|
|
132
|
+
self._detector._multiclick_window = value_ms / 1000.0
|
|
133
|
+
_LOGGER.debug("Updated double_click_duration to %dms for %s", value_ms, self._name)
|
|
134
|
+
|
|
135
|
+
if long_press_duration is not None:
|
|
136
|
+
value_ms = _to_milliseconds(long_press_duration, DEFAULT_LONG_PRESS_DURATION_MS)
|
|
137
|
+
self._detector._hold_threshold = value_ms / 1000.0
|
|
138
|
+
_LOGGER.debug("Updated long_press_duration to %dms for %s", value_ms, self._name)
|
|
139
|
+
|
|
140
|
+
if sequence_window_duration is not None:
|
|
141
|
+
value_ms = _to_milliseconds(sequence_window_duration, DEFAULT_SEQUENCE_WINDOW_MS)
|
|
142
|
+
self._detector._sequence_window = value_ms / 1000.0
|
|
143
|
+
_LOGGER.debug("Updated sequence_window_duration to %dms for %s", value_ms, self._name)
|
|
@@ -4,10 +4,8 @@ This module provides high-level sensor components that combine
|
|
|
4
4
|
hardware drivers with business logic.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from boneio.components.sensor.system import SerialNumberSensor
|
|
8
7
|
from boneio.components.sensor.virtual_energy import VirtualEnergySensor
|
|
9
8
|
|
|
10
9
|
__all__ = [
|
|
11
|
-
"SerialNumberSensor",
|
|
12
10
|
"VirtualEnergySensor",
|
|
13
11
|
]
|
|
@@ -24,6 +24,8 @@ ACTIONS = "actions"
|
|
|
24
24
|
ACTION = "action"
|
|
25
25
|
OUTPUT_OVER_MQTT = "output_over_mqtt"
|
|
26
26
|
COVER_OVER_MQTT = "cover_over_mqtt"
|
|
27
|
+
REMOTE_OUTPUT = "remote_output"
|
|
28
|
+
REMOTE_COVER = "remote_cover"
|
|
27
29
|
SWITCH = "switch"
|
|
28
30
|
LIGHT = "light"
|
|
29
31
|
BUTTON = "button"
|
|
@@ -81,6 +83,7 @@ WHITE = "white"
|
|
|
81
83
|
INPUT = "input"
|
|
82
84
|
SINGLE = "single"
|
|
83
85
|
DOUBLE = "double"
|
|
86
|
+
TRIPLE = "triple"
|
|
84
87
|
LONG = "long"
|
|
85
88
|
PRESSED = "pressed"
|
|
86
89
|
RELEASED = "released"
|
|
@@ -143,7 +146,24 @@ CLOSE = "close"
|
|
|
143
146
|
STOP = "stop"
|
|
144
147
|
|
|
145
148
|
# TYPING
|
|
146
|
-
|
|
149
|
+
# Basic click types + sequence aliases
|
|
150
|
+
ClickTypes = Literal[
|
|
151
|
+
"single", "double", "triple", "long", "pressed", "released",
|
|
152
|
+
# Sequence aliases
|
|
153
|
+
"double_then_long", # double click followed by long press
|
|
154
|
+
"single_then_long", # single click followed by long press
|
|
155
|
+
"double_then_single", # double click followed by single click
|
|
156
|
+
]
|
|
157
|
+
|
|
158
|
+
# Sequence definitions for MultiClickDetector
|
|
159
|
+
CLICK_SEQUENCES: dict[tuple[str, str], str] = {
|
|
160
|
+
("double", "long"): "double_then_long",
|
|
161
|
+
("single", "long"): "single_then_long",
|
|
162
|
+
("double", "single"): "double_then_single",
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# Default window for sequence detection (ms)
|
|
166
|
+
DEFAULT_SEQUENCE_WINDOW_MS = 500
|
|
147
167
|
BinaryStateTypes = Literal["pressed", "released"]
|
|
148
168
|
OledDataTypes = Literal[UPTIME, NETWORK, CPU, DISK, MEMORY, SWAP, OUTPUT]
|
|
149
169
|
InputTypes = Literal[INPUT, INPUT_SENSOR]
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
"""Configuration management modules."""
|
|
2
2
|
|
|
3
3
|
from boneio.core.config.config_helper import ConfigHelper
|
|
4
|
-
from boneio.core.config.loader import create_serial_number_sensor
|
|
5
4
|
from boneio.core.config.yaml_util import clear_config_cache, load_config_from_file
|
|
6
5
|
|
|
7
6
|
__all__ = [
|
|
8
7
|
"ConfigHelper",
|
|
9
8
|
"clear_config_cache",
|
|
10
|
-
"create_serial_number_sensor",
|
|
11
9
|
"load_config_from_file",
|
|
12
10
|
]
|
|
@@ -23,6 +23,7 @@ from boneio.const import (
|
|
|
23
23
|
VALVE,
|
|
24
24
|
)
|
|
25
25
|
from boneio.core.utils.util import sanitize_mqtt_topic
|
|
26
|
+
from boneio.core.system import get_serial_from_mac
|
|
26
27
|
|
|
27
28
|
_LOGGER = logging.getLogger(__name__)
|
|
28
29
|
|
|
@@ -30,7 +31,6 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
30
31
|
class ConfigHelper:
|
|
31
32
|
def __init__(
|
|
32
33
|
self,
|
|
33
|
-
topic_prefix: str,
|
|
34
34
|
name: str = BONEIO,
|
|
35
35
|
device_type: str = "boneIO Black",
|
|
36
36
|
ha_discovery: bool = True,
|
|
@@ -40,12 +40,26 @@ class ConfigHelper:
|
|
|
40
40
|
web_port: int = 8090,
|
|
41
41
|
proxy_port: int | None = None,
|
|
42
42
|
config_file_path: str | None = None,
|
|
43
|
+
send_boneio_autodiscovery: bool = True,
|
|
44
|
+
receive_boneio_autodiscovery: bool = True,
|
|
43
45
|
):
|
|
44
46
|
self._name = name
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
|
|
48
|
+
# Generate serial number from MAC - always required for topic prefix
|
|
49
|
+
self._serial_no = get_serial_from_mac(network_info)
|
|
50
|
+
|
|
51
|
+
# Build fixed topic prefix: boneio/blk_{serial}
|
|
52
|
+
# This is no longer configurable - always uses this format
|
|
53
|
+
if self._serial_no:
|
|
54
|
+
self._topic_prefix = f"boneio/{self._serial_no}"
|
|
55
|
+
else:
|
|
56
|
+
# Fallback if MAC not available (should rarely happen)
|
|
57
|
+
self._topic_prefix = "boneio/blk_unknown"
|
|
58
|
+
_LOGGER.warning("Could not determine serial number from MAC, using fallback topic prefix")
|
|
47
59
|
self._ha_discovery = ha_discovery
|
|
48
60
|
self._ha_discovery_prefix = ha_discovery_prefix
|
|
61
|
+
self._send_boneio_autodiscovery = send_boneio_autodiscovery
|
|
62
|
+
self._receive_boneio_autodiscovery = receive_boneio_autodiscovery
|
|
49
63
|
self._device_type = device_type
|
|
50
64
|
self._web_port = web_port
|
|
51
65
|
self._proxy_port = proxy_port
|
|
@@ -115,11 +129,19 @@ class ConfigHelper:
|
|
|
115
129
|
def web_port(self) -> int:
|
|
116
130
|
return self._web_port
|
|
117
131
|
|
|
132
|
+
@property
|
|
133
|
+
def serial_number(self) -> str:
|
|
134
|
+
return self._serial_no
|
|
135
|
+
|
|
118
136
|
@property
|
|
119
137
|
def proxy_port(self) -> int | None:
|
|
120
138
|
"""Get nginx proxy port if configured."""
|
|
121
139
|
return self._proxy_port
|
|
122
140
|
|
|
141
|
+
@property
|
|
142
|
+
def http_proto(self) -> str:
|
|
143
|
+
return "https" if self._proxy_port else "http"
|
|
144
|
+
|
|
123
145
|
@property
|
|
124
146
|
def ha_configuration_port(self) -> int:
|
|
125
147
|
"""Get port for HA discovery URL. Uses proxy_port if set, otherwise web_port."""
|
|
@@ -129,6 +151,11 @@ class ConfigHelper:
|
|
|
129
151
|
def topic_prefix(self) -> str:
|
|
130
152
|
return self._topic_prefix
|
|
131
153
|
|
|
154
|
+
@property
|
|
155
|
+
def serial_no(self) -> str:
|
|
156
|
+
"""Get device serial number (e.g., 'blk_abc123')."""
|
|
157
|
+
return self._serial_no or "blk_unknown"
|
|
158
|
+
|
|
132
159
|
@property
|
|
133
160
|
def name(self) -> str:
|
|
134
161
|
return self._name
|
|
@@ -141,6 +168,16 @@ class ConfigHelper:
|
|
|
141
168
|
def ha_discovery_prefix(self) -> str:
|
|
142
169
|
return self._ha_discovery_prefix
|
|
143
170
|
|
|
171
|
+
@property
|
|
172
|
+
def send_boneio_autodiscovery(self) -> bool:
|
|
173
|
+
"""Check if BoneIO autodiscovery publishing is enabled."""
|
|
174
|
+
return self._send_boneio_autodiscovery
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def receive_boneio_autodiscovery(self) -> bool:
|
|
178
|
+
"""Check if BoneIO autodiscovery receiving is enabled."""
|
|
179
|
+
return self._receive_boneio_autodiscovery
|
|
180
|
+
|
|
144
181
|
@property
|
|
145
182
|
def device_type(self) -> str:
|
|
146
183
|
return self._device_type
|