boneIO 1.0.0.dev20__tar.gz → 1.0.0.dev22__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.dev20/boneio.egg-info → boneio-1.0.0.dev22}/PKG-INFO +3 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/time_based.py +14 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/venetian.py +8 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/binary_sensor.py +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/config_helper.py +10 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/display.py +18 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/manager.py +19 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/modbus.py +15 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/remote.py +147 -7
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/sensors.py +20 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/basic.py +3 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/local.py +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/mqtt.py +4 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/__init__.py +13 -1
- boneio-1.0.0.dev22/boneio/core/remote/esphome.py +1022 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/oled.py +1 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/manager.py +39 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/ina219.py +12 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/base.py +1 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/__init__.py +0 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/homeassistant.py +174 -101
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/coordinator.py +75 -11
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/base.py +17 -7
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/select.py +7 -3
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/text.py +8 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/binary.py +8 -3
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/text.py +8 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/binary.py +9 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/numeric.py +18 -8
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/runner.py +16 -3
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions.yaml +30 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/remote_devices.yaml +157 -34
- boneio-1.0.0.dev22/boneio/version.py +2 -0
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/cssMode-e0s0S-AL.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/cssMode-CTEJXHUr.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/freemarker2-CWkMJ7Dx.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/freemarker2-DSCsQPcZ.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/handlebars-zUpC2ck8.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/handlebars-BxUcZhlf.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/html-2WKFlvIv.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/html-CeIuVMbE.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/htmlMode-DMvlWHlg.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/htmlMode-CPIPzTN0.js +1 -1
- boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/index-BODT6D6E.css +1 -0
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/index-CZVHDDiR.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/index-BehXyBY8.js +252 -252
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/javascript-1u9ejw2d.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/javascript-CpYki0-I.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/jsonMode-vTnsI9a9.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/jsonMode-D9XhtrDP.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/liquid-BnEFi6su.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/liquid-B00joeAd.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/mdx-CiaE4Hfr.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/mdx-DvdDUhMH.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/python-2FhK2A3H.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/python-CSHyK2oP.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/razor-mmdOzr3O.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/razor-CGXQVQhg.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/tsMode-aWDaZew7.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/tsMode-CaUDBDMJ.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/typescript-CP3BHqV0.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/typescript-DMGXfEu0.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/xml-afQscpJf.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/xml-D2UC847g.js +1 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/yaml-8Z7cC_Pk.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/yaml-DfvHGUeZ.js +1 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/adc.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/areas.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +50 -10
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/config.schema.json +622 -140
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/cover.schema.json +10 -10
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/ds2482.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/event.schema.json +171 -31
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/ina219.schema.json +8 -8
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/lm75.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +10 -10
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/oled.schema.json +6 -6
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/output.schema.json +8 -8
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/pca9685.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +4 -4
- boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem/remote_devices.schema.json +437 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/sensor.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/web.schema.json +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/config.py +173 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/remote_devices.py +102 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/update.py +253 -10
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/adc.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/areas.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/binary_sensor.schema.json +50 -10
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/boneio.schema.json +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/config.schema.json +622 -140
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/cover.schema.json +10 -10
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/ds2482.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/event.schema.json +171 -31
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/ina219.schema.json +8 -8
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/lm75.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mcp23017.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mcp9808.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/modbus_devices.schema.json +10 -10
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/oled.schema.json +6 -6
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/output.schema.json +8 -8
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/output_group.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/pca9685.schema.json +4 -4
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/pcf8575.schema.json +4 -4
- boneio-1.0.0.dev22/boneio/webui/schema/remote_devices.schema.json +437 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/sensor.schema.json +6 -6
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/web.schema.json +2 -2
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22/boneio.egg-info}/PKG-INFO +3 -1
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/SOURCES.txt +18 -17
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/requires.txt +2 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/pyproject.toml +3 -1
- boneio-1.0.0.dev20/boneio/version.py +0 -2
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/index-B5sThJWr.css +0 -1
- boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -135
- boneio-1.0.0.dev20/boneio/webui/schema/remote_devices.schema.json +0 -135
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/LICENSE +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/MANIFEST.in +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/README.md +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/bonecli.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/cover.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/previous.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/group/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/group/output_group.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/detectors.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/event.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/basic.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/mcp.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/pca.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/pcf.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/const.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/package.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/discovery.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/events/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/events/bus.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/covers.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/base.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/base.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/system.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/state/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/state/manager.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/host_data.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/monitor.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/filter.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/logger.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/util.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/exceptions.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/interlock.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/cli.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/client.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/utils.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/actions.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/events.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/files.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/logs.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/mqtt.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/state.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/filters.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/id.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/schema.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/app.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/system.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/services/logs.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/web_server.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/setup.cfg +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/setup.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/tests/test_i2c_smbus2.py +0 -0
- {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/tests/test_py313_compatibility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev22
|
|
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
|
|
@@ -32,6 +32,8 @@ Requires-Dist: qrcode==8.2
|
|
|
32
32
|
Requires-Dist: gpiod==2.3.0
|
|
33
33
|
Requires-Dist: requests==2.32.5
|
|
34
34
|
Requires-Dist: packaging==25.0
|
|
35
|
+
Requires-Dist: aioesphomeapi>=29.0.0
|
|
36
|
+
Requires-Dist: zeroconf>=0.148.0
|
|
35
37
|
Dynamic: license-file
|
|
36
38
|
|
|
37
39
|
Example usage:
|
|
@@ -41,7 +41,13 @@ class TimeBasedCover(BaseCover):
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def _move_cover(self, direction: str, duration: float, target_position: int | None = None):
|
|
44
|
-
"""
|
|
44
|
+
"""Run in sepearate thread.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
direction: Direction of movement (OPEN or CLOSE)
|
|
48
|
+
duration: Full time for 0-100% movement in milliseconds
|
|
49
|
+
target_position: Optional target position (0-100)
|
|
50
|
+
"""
|
|
45
51
|
if direction == OPEN:
|
|
46
52
|
relay = self._open_relay
|
|
47
53
|
total_steps = 100 - self._position
|
|
@@ -56,18 +62,22 @@ class TimeBasedCover(BaseCover):
|
|
|
56
62
|
self._loop.call_soon_threadsafe(lambda: self.send_state(self.state, self.json_position))
|
|
57
63
|
return
|
|
58
64
|
|
|
65
|
+
# Calculate actual duration based on remaining distance
|
|
66
|
+
# duration is full time for 100% movement, scale it by actual distance to travel
|
|
67
|
+
actual_duration = duration * (total_steps / 100.0)
|
|
68
|
+
|
|
59
69
|
relay.turn_on()
|
|
60
70
|
start_time = time.monotonic()
|
|
61
71
|
|
|
62
72
|
while not self._stop_event.is_set():
|
|
63
73
|
current_time = time.monotonic() # Pobierz aktualny czas tylko raz na iterację
|
|
64
74
|
elapsed_time = (current_time - start_time) * 1000 # Konwersja na milisekundy
|
|
65
|
-
progress = elapsed_time /
|
|
75
|
+
progress = elapsed_time / actual_duration if actual_duration > 0 else 1.0
|
|
66
76
|
|
|
67
77
|
if direction == OPEN:
|
|
68
|
-
self._position = min(100.0, self._initial_position + progress *
|
|
78
|
+
self._position = min(100.0, self._initial_position + progress * total_steps)
|
|
69
79
|
elif direction == CLOSE:
|
|
70
|
-
self._position = max(0.0, self._initial_position - progress *
|
|
80
|
+
self._position = max(0.0, self._initial_position - progress * total_steps)
|
|
71
81
|
|
|
72
82
|
self._last_timestamp = current_time # Użyj pobranego czasu
|
|
73
83
|
if current_time - self._last_update_time >= 1:
|
|
@@ -97,6 +97,10 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
97
97
|
)
|
|
98
98
|
return
|
|
99
99
|
|
|
100
|
+
# Calculate actual duration based on remaining distance
|
|
101
|
+
# duration is full time for 100% movement, scale it by actual distance to travel
|
|
102
|
+
actual_duration = duration * (total_steps / 100.0)
|
|
103
|
+
|
|
100
104
|
relay.turn_on()
|
|
101
105
|
start_time = time.monotonic()
|
|
102
106
|
progress = 0.0
|
|
@@ -116,15 +120,15 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
116
120
|
|
|
117
121
|
|
|
118
122
|
if elapsed_time < needed_tilt_duration:
|
|
119
|
-
tilt_progress = elapsed_time / needed_tilt_duration
|
|
123
|
+
tilt_progress = elapsed_time / needed_tilt_duration if needed_tilt_duration > 0 else 1.0
|
|
120
124
|
progress = 0.0
|
|
121
125
|
else:
|
|
122
126
|
tilt_progress = 1.0
|
|
123
|
-
progress = (elapsed_time - needed_tilt_duration) /
|
|
127
|
+
progress = (elapsed_time - needed_tilt_duration) / actual_duration if actual_duration > 0 else 1.0
|
|
124
128
|
|
|
125
129
|
if direction == OPEN:
|
|
126
130
|
# Obliczanie _position dla kierunku OPEN
|
|
127
|
-
self._position = min(100.0, self._initial_position + progress *
|
|
131
|
+
self._position = min(100.0, self._initial_position + progress * total_steps)
|
|
128
132
|
|
|
129
133
|
# Obliczanie _tilt_position dla kierunku OPEN
|
|
130
134
|
if target_tilt_position is not None:
|
|
@@ -135,7 +139,7 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
135
139
|
)
|
|
136
140
|
elif direction == CLOSE:
|
|
137
141
|
# Obliczanie _position dla kierunku CLOSE
|
|
138
|
-
self._position = max(0.0, self._initial_position - progress *
|
|
142
|
+
self._position = max(0.0, self._initial_position - progress * total_steps)
|
|
139
143
|
|
|
140
144
|
# Obliczanie _tilt_position dla kierunku CLOSE
|
|
141
145
|
if target_tilt_position is not None:
|
|
@@ -54,9 +54,9 @@ class GpioInputBinarySensor(GpioBaseClass):
|
|
|
54
54
|
_LOGGER.debug("Configured binary sensor %s on pin %s (inverted=%s)",
|
|
55
55
|
self._name, self._pin, inverted)
|
|
56
56
|
|
|
57
|
-
# Send initial state if requested
|
|
57
|
+
# Send initial state if requested - register callback to run after GPIO manager starts
|
|
58
58
|
if kwargs.get("initial_send", False):
|
|
59
|
-
|
|
59
|
+
gpio_manager.register_on_start_callback(self._send_initial_state)
|
|
60
60
|
|
|
61
61
|
def _send_initial_state(self) -> None:
|
|
62
62
|
"""Send initial state after setup."""
|
|
@@ -5,7 +5,10 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
7
|
from _collections_abc import dict_values
|
|
8
|
-
from typing import Any
|
|
8
|
+
from typing import Any, TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
|
|
9
12
|
|
|
10
13
|
from boneio.const import (
|
|
11
14
|
BINARY_SENSOR,
|
|
@@ -222,7 +225,12 @@ class ConfigHelper:
|
|
|
222
225
|
def subscribe_topic(self) -> str:
|
|
223
226
|
return f"{self.cmd_topic_prefix}+/+/#"
|
|
224
227
|
|
|
225
|
-
def add_autodiscovery_msg(
|
|
228
|
+
def add_autodiscovery_msg(
|
|
229
|
+
self,
|
|
230
|
+
ha_type: str,
|
|
231
|
+
topic: str,
|
|
232
|
+
payload: str | dict[str, Any] | "HomeAssistantDiscoveryMessage" | None
|
|
233
|
+
):
|
|
226
234
|
"""Add autodiscovery message."""
|
|
227
235
|
self._autodiscovery_messages[ha_type][topic] = {"topic": topic, "payload": payload}
|
|
228
236
|
|
|
@@ -190,10 +190,28 @@ class DisplayManager:
|
|
|
190
190
|
|
|
191
191
|
except (GPIOInputException, I2CError) as err:
|
|
192
192
|
_LOGGER.error("Can't configure OLED display: %s", err)
|
|
193
|
+
# Store error in manager for WebUI display
|
|
194
|
+
self._manager._hardware_errors.append({
|
|
195
|
+
'type': 'display',
|
|
196
|
+
'id': 'oled',
|
|
197
|
+
'name': 'OLED Display',
|
|
198
|
+
'address': 0x3C,
|
|
199
|
+
'error': str(err),
|
|
200
|
+
'message': f"OLED display at address 0x3C: {err}",
|
|
201
|
+
})
|
|
193
202
|
except ImportError as err:
|
|
194
203
|
_LOGGER.error("Failed to import OLED modules: %s", err)
|
|
195
204
|
except Exception as err:
|
|
196
205
|
_LOGGER.error("Unexpected error configuring OLED: %s", err)
|
|
206
|
+
# Store error in manager for WebUI display
|
|
207
|
+
self._manager._hardware_errors.append({
|
|
208
|
+
'type': 'display',
|
|
209
|
+
'id': 'oled',
|
|
210
|
+
'name': 'OLED Display',
|
|
211
|
+
'address': 0x3C,
|
|
212
|
+
'error': str(err),
|
|
213
|
+
'message': f"OLED display: {err}",
|
|
214
|
+
})
|
|
197
215
|
|
|
198
216
|
def get_oled(self) -> Any | None:
|
|
199
217
|
"""Get OLED display instance.
|
|
@@ -22,6 +22,8 @@ from boneio.const import (
|
|
|
22
22
|
ONLINE,
|
|
23
23
|
OUTPUT,
|
|
24
24
|
OUTPUT_OVER_MQTT,
|
|
25
|
+
REMOTE_COVER,
|
|
26
|
+
REMOTE_OUTPUT,
|
|
25
27
|
SET_BRIGHTNESS,
|
|
26
28
|
STATE,
|
|
27
29
|
cover_actions,
|
|
@@ -192,6 +194,7 @@ class Manager:
|
|
|
192
194
|
message_bus=message_bus,
|
|
193
195
|
remote_devices_config=remote_devices,
|
|
194
196
|
own_serial=config_helper.serial_no,
|
|
197
|
+
name=self.config_helper.name
|
|
195
198
|
)
|
|
196
199
|
|
|
197
200
|
# 8. BlackDiscoveryPublisher (publishes device info for autodiscovery of neighboring BoneIO devices)
|
|
@@ -207,6 +210,20 @@ class Manager:
|
|
|
207
210
|
# (removing duplicate registration here that caused double event handling)
|
|
208
211
|
|
|
209
212
|
_LOGGER.info("Manager initialization complete")
|
|
213
|
+
|
|
214
|
+
async def stop(self) -> None:
|
|
215
|
+
"""Stop manager async tasks.
|
|
216
|
+
|
|
217
|
+
This should be called during shutdown to cleanly stop:
|
|
218
|
+
- ESPHome connections
|
|
219
|
+
- Other async tasks
|
|
220
|
+
"""
|
|
221
|
+
_LOGGER.info("Stopping manager async tasks")
|
|
222
|
+
|
|
223
|
+
# Stop ESPHome connections
|
|
224
|
+
await self.remote_devices.stop_all_connections()
|
|
225
|
+
|
|
226
|
+
_LOGGER.info("Manager async tasks stopped")
|
|
210
227
|
|
|
211
228
|
@property
|
|
212
229
|
def loop(self) -> asyncio.AbstractEventLoop:
|
|
@@ -521,7 +538,7 @@ class Manager:
|
|
|
521
538
|
Args:
|
|
522
539
|
actions: List of actions to execute
|
|
523
540
|
"""
|
|
524
|
-
|
|
541
|
+
|
|
525
542
|
|
|
526
543
|
start_time = time.time()
|
|
527
544
|
|
|
@@ -604,7 +621,7 @@ class Manager:
|
|
|
604
621
|
)
|
|
605
622
|
|
|
606
623
|
elif action == REMOTE_COVER:
|
|
607
|
-
# Control cover on remote device
|
|
624
|
+
# Control cover on remote device (BoneIO MQTT or ESPHome API)
|
|
608
625
|
remote_device_id = action_definition.get("remote_device")
|
|
609
626
|
cover_id = action_definition.get("cover_id")
|
|
610
627
|
action_cover = action_definition.get("action_cover", "TOGGLE")
|
|
@@ -131,7 +131,8 @@ class ModbusManager:
|
|
|
131
131
|
model = device_config.get(MODEL, "")
|
|
132
132
|
|
|
133
133
|
# Generate ID from address and model if not provided
|
|
134
|
-
|
|
134
|
+
has_custom_id = bool(device_config.get(ID))
|
|
135
|
+
if has_custom_id:
|
|
135
136
|
device_id = str(device_config[ID]).replace(" ", "").lower()
|
|
136
137
|
else:
|
|
137
138
|
device_id = f"{address}_{model}".lower().replace(" ", "_")
|
|
@@ -160,6 +161,7 @@ class ModbusManager:
|
|
|
160
161
|
sensors_filters=device_config.get("sensors_filters", {}),
|
|
161
162
|
additional_data=additional_data,
|
|
162
163
|
area=area,
|
|
164
|
+
has_custom_id=has_custom_id,
|
|
163
165
|
)
|
|
164
166
|
coordinators[device_id] = coordinator
|
|
165
167
|
_LOGGER.info("Configured Modbus coordinator: %s", device_id)
|
|
@@ -358,6 +360,18 @@ class ModbusManager:
|
|
|
358
360
|
new_coordinators = self._configure_modbus_coordinators(devices=configs_to_add)
|
|
359
361
|
self._modbus_coordinators.update(new_coordinators)
|
|
360
362
|
_LOGGER.info("Added/recreated %d Modbus devices", len(new_coordinators))
|
|
363
|
+
|
|
364
|
+
# Send online status for newly created/recreated coordinators
|
|
365
|
+
# This ensures the new availability topic gets the online status immediately
|
|
366
|
+
for coordinator in new_coordinators.values():
|
|
367
|
+
try:
|
|
368
|
+
await coordinator.send_online_status()
|
|
369
|
+
except Exception as err:
|
|
370
|
+
_LOGGER.error(
|
|
371
|
+
"Failed to send online status for coordinator %s: %s",
|
|
372
|
+
coordinator.id,
|
|
373
|
+
err
|
|
374
|
+
)
|
|
361
375
|
|
|
362
376
|
_LOGGER.info(
|
|
363
377
|
"Modbus devices reload complete: %d coordinators (removed=%d, added=%d, recreated=%d)",
|
|
@@ -6,6 +6,7 @@ Supports autodiscovery of neighboring BoneIO Black devices via MQTT.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
+
import asyncio
|
|
9
10
|
import json
|
|
10
11
|
import logging
|
|
11
12
|
from typing import TYPE_CHECKING, Any
|
|
@@ -16,6 +17,7 @@ from boneio.core.remote.base import (
|
|
|
16
17
|
RemoteDeviceType,
|
|
17
18
|
)
|
|
18
19
|
from boneio.core.remote.mqtt import MQTTRemoteDevice
|
|
20
|
+
from boneio.core.remote.esphome import ESPHomeRemoteDevice, ESPHOME_API_AVAILABLE
|
|
19
21
|
|
|
20
22
|
if TYPE_CHECKING:
|
|
21
23
|
from boneio.core.messaging import MessageBus
|
|
@@ -173,8 +175,7 @@ class RemoteDeviceManager:
|
|
|
173
175
|
_LOGGER.warning("ESPHome UDP protocol not yet implemented for device '%s'", device_id)
|
|
174
176
|
return None
|
|
175
177
|
elif protocol == RemoteDeviceProtocol.ESPHOME_API:
|
|
176
|
-
|
|
177
|
-
return None
|
|
178
|
+
return self._create_esphome_device(device_id, name, config)
|
|
178
179
|
else:
|
|
179
180
|
_LOGGER.error("Unsupported protocol '%s' for device '%s'", protocol, device_id)
|
|
180
181
|
return None
|
|
@@ -209,6 +210,103 @@ class RemoteDeviceManager:
|
|
|
209
210
|
covers=covers,
|
|
210
211
|
)
|
|
211
212
|
|
|
213
|
+
def _create_esphome_device(
|
|
214
|
+
self,
|
|
215
|
+
device_id: str,
|
|
216
|
+
name: str,
|
|
217
|
+
config: dict[str, Any],
|
|
218
|
+
) -> ESPHomeRemoteDevice | None:
|
|
219
|
+
"""Create ESPHome API remote device.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
device_id: Device ID
|
|
223
|
+
name: Device name
|
|
224
|
+
config: Full device configuration
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
ESPHomeRemoteDevice instance or None if creation failed
|
|
228
|
+
"""
|
|
229
|
+
if not ESPHOME_API_AVAILABLE:
|
|
230
|
+
_LOGGER.error(
|
|
231
|
+
"aioesphomeapi not installed - cannot create ESPHome device '%s'",
|
|
232
|
+
device_id
|
|
233
|
+
)
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
esphome_config = config.get("esphome_api", {})
|
|
237
|
+
host = esphome_config.get("host")
|
|
238
|
+
|
|
239
|
+
if not host:
|
|
240
|
+
_LOGGER.error("ESPHome device '%s' missing 'host' in esphome_api config", device_id)
|
|
241
|
+
return None
|
|
242
|
+
|
|
243
|
+
port = esphome_config.get("port", 6053)
|
|
244
|
+
password = esphome_config.get("password", "")
|
|
245
|
+
encryption_key = esphome_config.get("encryption_key", "")
|
|
246
|
+
switches = esphome_config.get("switches", [])
|
|
247
|
+
lights = esphome_config.get("lights", [])
|
|
248
|
+
covers = esphome_config.get("covers", [])
|
|
249
|
+
|
|
250
|
+
return ESPHomeRemoteDevice(
|
|
251
|
+
id=device_id,
|
|
252
|
+
name=name,
|
|
253
|
+
host=host,
|
|
254
|
+
port=port,
|
|
255
|
+
password=password,
|
|
256
|
+
encryption_key=encryption_key,
|
|
257
|
+
switches=switches,
|
|
258
|
+
lights=lights,
|
|
259
|
+
covers=covers,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
async def start_all_connections(self, delay_seconds: float = 10.0) -> None:
|
|
263
|
+
"""Start persistent connections for all ESPHome devices.
|
|
264
|
+
|
|
265
|
+
This should be called during application startup to establish
|
|
266
|
+
connections to all ESPHome devices with ReconnectLogic.
|
|
267
|
+
|
|
268
|
+
ESPHome connections are delayed to prioritize local device functionality
|
|
269
|
+
(GPIO, MQTT) over remote device connections.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
delay_seconds: Seconds to wait before starting ESPHome connections
|
|
273
|
+
"""
|
|
274
|
+
esphome_devices = [
|
|
275
|
+
(device_id, device)
|
|
276
|
+
for device_id, device in self._devices.items()
|
|
277
|
+
if isinstance(device, ESPHomeRemoteDevice)
|
|
278
|
+
]
|
|
279
|
+
|
|
280
|
+
if not esphome_devices:
|
|
281
|
+
return
|
|
282
|
+
|
|
283
|
+
_LOGGER.info(
|
|
284
|
+
"Delaying ESPHome connections by %.1f seconds (found %d devices)",
|
|
285
|
+
delay_seconds, len(esphome_devices)
|
|
286
|
+
)
|
|
287
|
+
await asyncio.sleep(delay_seconds)
|
|
288
|
+
|
|
289
|
+
_LOGGER.info("Starting ESPHome connections...")
|
|
290
|
+
for device_id, device in esphome_devices:
|
|
291
|
+
try:
|
|
292
|
+
await device.start_connection()
|
|
293
|
+
_LOGGER.info("Started connection for ESPHome device '%s'", device_id)
|
|
294
|
+
except Exception as e:
|
|
295
|
+
_LOGGER.error("Failed to start connection for ESPHome device '%s': %s", device_id, e)
|
|
296
|
+
|
|
297
|
+
async def stop_all_connections(self) -> None:
|
|
298
|
+
"""Stop all persistent connections.
|
|
299
|
+
|
|
300
|
+
This should be called during application shutdown.
|
|
301
|
+
"""
|
|
302
|
+
for device_id, device in self._devices.items():
|
|
303
|
+
if isinstance(device, ESPHomeRemoteDevice):
|
|
304
|
+
try:
|
|
305
|
+
await device.disconnect()
|
|
306
|
+
_LOGGER.info("Stopped connection for ESPHome device '%s'", device_id)
|
|
307
|
+
except Exception as e:
|
|
308
|
+
_LOGGER.error("Failed to stop connection for ESPHome device '%s': %s", device_id, e)
|
|
309
|
+
|
|
212
310
|
def get_device(self, device_id: str) -> RemoteDevice | None:
|
|
213
311
|
"""Get remote device by ID.
|
|
214
312
|
|
|
@@ -233,13 +331,20 @@ class RemoteDeviceManager:
|
|
|
233
331
|
device_id: str,
|
|
234
332
|
output_id: str,
|
|
235
333
|
action: str,
|
|
334
|
+
brightness: int | None = None,
|
|
335
|
+
transition: float | None = None,
|
|
236
336
|
) -> bool:
|
|
237
|
-
"""Control output on remote device.
|
|
337
|
+
"""Control output on remote device (BoneIO MQTT or ESPHome API).
|
|
338
|
+
|
|
339
|
+
Automatically detects device protocol and routes to appropriate method.
|
|
340
|
+
For ESPHome devices, output_id can be a switch or light entity.
|
|
238
341
|
|
|
239
342
|
Args:
|
|
240
343
|
device_id: ID of the remote device
|
|
241
|
-
output_id: ID of the output to control
|
|
242
|
-
action: Action to perform (ON, OFF, TOGGLE)
|
|
344
|
+
output_id: ID of the output/switch/light to control
|
|
345
|
+
action: Action to perform (ON, OFF, TOGGLE, BRIGHTNESS_UP, BRIGHTNESS_DOWN, SET_BRIGHTNESS)
|
|
346
|
+
brightness: Brightness level (0-255) - only for ESPHome lights
|
|
347
|
+
transition: Transition time in seconds - only for ESPHome lights
|
|
243
348
|
|
|
244
349
|
Returns:
|
|
245
350
|
True if command was sent successfully
|
|
@@ -249,6 +354,25 @@ class RemoteDeviceManager:
|
|
|
249
354
|
_LOGGER.error("Remote device '%s' not found", device_id)
|
|
250
355
|
return False
|
|
251
356
|
|
|
357
|
+
# For ESPHome devices, try to determine if it's a switch or light
|
|
358
|
+
if isinstance(device, ESPHomeRemoteDevice):
|
|
359
|
+
# Check if output_id is a light
|
|
360
|
+
if device.has_light(output_id):
|
|
361
|
+
_LOGGER.debug("Controlling ESPHome light '%s' on device '%s'", output_id, device_id)
|
|
362
|
+
return await device.control_light(
|
|
363
|
+
light_id=output_id,
|
|
364
|
+
action=action,
|
|
365
|
+
brightness=brightness,
|
|
366
|
+
transition=transition if transition is not None else 0.0,
|
|
367
|
+
)
|
|
368
|
+
# Otherwise treat as switch
|
|
369
|
+
_LOGGER.debug("Controlling ESPHome switch '%s' on device '%s'", output_id, device_id)
|
|
370
|
+
return await device.control_switch(
|
|
371
|
+
switch_id=output_id,
|
|
372
|
+
action=action,
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
# For MQTT devices, use standard control_output
|
|
252
376
|
return await device.control_output(
|
|
253
377
|
output_id=output_id,
|
|
254
378
|
action=action,
|
|
@@ -262,12 +386,14 @@ class RemoteDeviceManager:
|
|
|
262
386
|
action: str,
|
|
263
387
|
**kwargs,
|
|
264
388
|
) -> bool:
|
|
265
|
-
"""Control cover on remote device.
|
|
389
|
+
"""Control cover on remote device (BoneIO MQTT or ESPHome API).
|
|
390
|
+
|
|
391
|
+
Automatically detects device protocol and routes to appropriate method.
|
|
266
392
|
|
|
267
393
|
Args:
|
|
268
394
|
device_id: ID of the remote device
|
|
269
395
|
cover_id: ID of the cover to control
|
|
270
|
-
action: Action to perform (OPEN, CLOSE, STOP, etc.)
|
|
396
|
+
action: Action to perform (OPEN, CLOSE, STOP, TOGGLE, etc.)
|
|
271
397
|
**kwargs: Additional parameters (position, tilt_position)
|
|
272
398
|
|
|
273
399
|
Returns:
|
|
@@ -278,6 +404,15 @@ class RemoteDeviceManager:
|
|
|
278
404
|
_LOGGER.error("Remote device '%s' not found", device_id)
|
|
279
405
|
return False
|
|
280
406
|
|
|
407
|
+
# For ESPHome devices, use native API
|
|
408
|
+
if isinstance(device, ESPHomeRemoteDevice):
|
|
409
|
+
_LOGGER.debug("Controlling ESPHome cover '%s' on device '%s'", cover_id, device_id)
|
|
410
|
+
return await device.control_cover(
|
|
411
|
+
cover_id=cover_id,
|
|
412
|
+
action=action,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
# For MQTT devices, use standard control_cover
|
|
281
416
|
return await device.control_cover(
|
|
282
417
|
cover_id=cover_id,
|
|
283
418
|
action=action,
|
|
@@ -585,6 +720,11 @@ class RemoteDeviceManager:
|
|
|
585
720
|
Returns:
|
|
586
721
|
Dictionary with autodiscovered devices information
|
|
587
722
|
"""
|
|
723
|
+
_LOGGER.debug(
|
|
724
|
+
"autodiscovered_to_dict called, _autodiscovered_devices has %d items: %s",
|
|
725
|
+
len(self._autodiscovered_devices),
|
|
726
|
+
list(self._autodiscovered_devices.keys())
|
|
727
|
+
)
|
|
588
728
|
return {
|
|
589
729
|
device_id: device.to_dict()
|
|
590
730
|
for device_id, device in self._autodiscovered_devices.items()
|
|
@@ -183,6 +183,16 @@ class SensorManager:
|
|
|
183
183
|
return temp_sensor
|
|
184
184
|
except I2CError as err:
|
|
185
185
|
_LOGGER.error("Can't configure temp sensor %s: %s", name, err)
|
|
186
|
+
# Store error in manager for WebUI display
|
|
187
|
+
self._manager._hardware_errors.append({
|
|
188
|
+
'type': 'sensor',
|
|
189
|
+
'sensor_type': 'temperature',
|
|
190
|
+
'id': id,
|
|
191
|
+
'name': name,
|
|
192
|
+
'address': config.get(ADDRESS),
|
|
193
|
+
'error': str(err),
|
|
194
|
+
'message': f"Temperature sensor {name} at address 0x{config.get(ADDRESS, 0):02X}: {err}",
|
|
195
|
+
})
|
|
186
196
|
return None
|
|
187
197
|
|
|
188
198
|
# -------------------------------------------------------------------------
|
|
@@ -240,6 +250,16 @@ class SensorManager:
|
|
|
240
250
|
return ina219
|
|
241
251
|
except I2CError as err:
|
|
242
252
|
_LOGGER.error("Can't configure INA219 sensor: %s", err)
|
|
253
|
+
# Store error in manager for WebUI display
|
|
254
|
+
self._manager._hardware_errors.append({
|
|
255
|
+
'type': 'sensor',
|
|
256
|
+
'sensor_type': 'ina219',
|
|
257
|
+
'id': id,
|
|
258
|
+
'name': id,
|
|
259
|
+
'address': address,
|
|
260
|
+
'error': str(err),
|
|
261
|
+
'message': f"INA219 sensor at address 0x{address:02X}: {err}",
|
|
262
|
+
})
|
|
243
263
|
return None
|
|
244
264
|
|
|
245
265
|
# -------------------------------------------------------------------------
|
|
@@ -3,11 +3,12 @@ from __future__ import annotations
|
|
|
3
3
|
|
|
4
4
|
import logging
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
|
-
from typing import TYPE_CHECKING
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
7
|
from collections.abc import Awaitable, Callable
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from boneio.core.manager import Manager
|
|
11
|
+
from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
|
|
11
12
|
|
|
12
13
|
_LOGGER = logging.getLogger(__name__)
|
|
13
14
|
|
|
@@ -18,7 +19,7 @@ class MessageBus(ABC):
|
|
|
18
19
|
def send_message(
|
|
19
20
|
self,
|
|
20
21
|
topic: str,
|
|
21
|
-
payload: str | int | dict[str,
|
|
22
|
+
payload: str | int | dict[str, Any] | "HomeAssistantDiscoveryMessage" | None,
|
|
22
23
|
retain: bool = False,
|
|
23
24
|
qos: int = 0,
|
|
24
25
|
) -> None:
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
5
|
from collections.abc import Callable
|
|
6
|
-
from typing import TYPE_CHECKING, Optional
|
|
6
|
+
from typing import TYPE_CHECKING, Optional, Any
|
|
7
7
|
|
|
8
8
|
if TYPE_CHECKING:
|
|
9
9
|
from boneio.core.manager import Manager
|
|
@@ -26,7 +26,7 @@ class LocalMessageBus(MessageBus):
|
|
|
26
26
|
def send_message(
|
|
27
27
|
self,
|
|
28
28
|
topic: str,
|
|
29
|
-
payload: str | int | dict[str,
|
|
29
|
+
payload: str | int | dict[str, Any] | None,
|
|
30
30
|
retain: bool = False,
|
|
31
31
|
qos: int = 0,
|
|
32
32
|
) -> None:
|
|
@@ -13,6 +13,9 @@ from collections.abc import Awaitable, Callable
|
|
|
13
13
|
from contextlib import AsyncExitStack
|
|
14
14
|
from typing import TYPE_CHECKING, Any, override
|
|
15
15
|
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
|
|
18
|
+
|
|
16
19
|
from aiomqtt import Client as AsyncioClient
|
|
17
20
|
from aiomqtt import MqttError, Will
|
|
18
21
|
from paho.mqtt.properties import Properties
|
|
@@ -164,7 +167,7 @@ class MQTTClient(MessageBus):
|
|
|
164
167
|
def send_message(
|
|
165
168
|
self,
|
|
166
169
|
topic: str,
|
|
167
|
-
payload: str | int | bytes | dict[str,
|
|
170
|
+
payload: str | int | bytes | dict[str, Any] | None,
|
|
168
171
|
retain: bool = False,
|
|
169
172
|
qos: int = 0,
|
|
170
173
|
) -> None:
|
|
@@ -2,16 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Supports multiple protocols:
|
|
4
4
|
- MQTT: Standard MQTT communication (boneIO Black, ESPHome, etc.)
|
|
5
|
+
- ESPHome API: Native ESPHome API via TCP/IP
|
|
5
6
|
- CAN: CAN bus communication (future)
|
|
6
7
|
- Loxone: Loxone Miniserver integration (future)
|
|
7
|
-
- ESPHome API: Native ESPHome API (future)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
from boneio.core.remote.base import RemoteDevice, RemoteDeviceProtocol
|
|
11
11
|
from boneio.core.remote.mqtt import MQTTRemoteDevice
|
|
12
|
+
from boneio.core.remote.esphome import (
|
|
13
|
+
ESPHomeRemoteDevice,
|
|
14
|
+
discover_esphome_entities,
|
|
15
|
+
scan_esphome_devices,
|
|
16
|
+
ESPHOME_API_AVAILABLE,
|
|
17
|
+
ZEROCONF_AVAILABLE,
|
|
18
|
+
)
|
|
12
19
|
|
|
13
20
|
__all__ = [
|
|
14
21
|
"RemoteDevice",
|
|
15
22
|
"RemoteDeviceProtocol",
|
|
16
23
|
"MQTTRemoteDevice",
|
|
24
|
+
"ESPHomeRemoteDevice",
|
|
25
|
+
"discover_esphome_entities",
|
|
26
|
+
"scan_esphome_devices",
|
|
27
|
+
"ESPHOME_API_AVAILABLE",
|
|
28
|
+
"ZEROCONF_AVAILABLE",
|
|
17
29
|
]
|