boneIO 1.0.0.dev19__tar.gz → 1.0.0.dev21__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.dev19/boneio.egg-info → boneio-1.0.0.dev21}/PKG-INFO +3 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/config_helper.py +10 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/manager.py +19 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/modbus.py +15 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/remote.py +171 -16
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/basic.py +3 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/local.py +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/mqtt.py +4 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/__init__.py +13 -1
- boneio-1.0.0.dev21/boneio/core/remote/esphome.py +1022 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/__init__.py +0 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/homeassistant.py +174 -101
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/coordinator.py +75 -11
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/base.py +17 -7
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/select.py +7 -3
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/text.py +8 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/binary.py +8 -3
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/text.py +8 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/binary.py +9 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/numeric.py +18 -8
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/runner.py +15 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions.yaml +30 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/remote_devices.yaml +157 -34
- boneio-1.0.0.dev21/boneio/version.py +2 -0
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/cssMode-CTusuhtw.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/cssMode-Cf6c8Rak.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/freemarker2-Dz7M_8pc.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/freemarker2-Dx0BWjru.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/handlebars-DJ83W6ke.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/handlebars-BTuLZVfx.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/html-C31TNwrw.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/html-BB3T_3_K.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/htmlMode-N9a7dHJ-.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/htmlMode-yP62Fr3K.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/index-DjwH-58l.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/index-GG4_twIa.js +216 -216
- boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/index-cAyuaVJ4.css +1 -0
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/javascript-iwXLowO6.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/javascript-fCd4TqkY.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/jsonMode-CVxVF5Xf.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/jsonMode-CChUrnET.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/liquid-CbbScCDs.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/liquid-DdLOtKyT.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/mdx-uKMATDKf.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/mdx-wnkV-3mF.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/python-BKXaD8Q4.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/python-BU1BlHpX.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/razor-BUeWte8D.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/razor-DNgLOtn7.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/tsMode-L9m-RlpT.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/tsMode-CINGfPlt.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/typescript-gH6eiNnh.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/typescript-CkWSk1mf.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/xml-Bg4W8niF.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/xml-DlZcKj6v.js +1 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/yaml-B39PGswj.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/yaml-CDmetGCQ.js +1 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/adc.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/areas.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +48 -8
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/config.schema.json +579 -97
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/cover.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/ds2482.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/event.schema.json +163 -23
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/ina219.schema.json +6 -6
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/lm75.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +6 -6
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/oled.schema.json +4 -4
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/output.schema.json +4 -4
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/pca9685.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +2 -2
- boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem/remote_devices.schema.json +437 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/sensor.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/web.schema.json +5 -5
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/config.py +38 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/remote_devices.py +102 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/system.py +7 -4
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/adc.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/areas.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/binary_sensor.schema.json +48 -8
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/config.schema.json +579 -97
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/cover.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/ds2482.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/event.schema.json +163 -23
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/ina219.schema.json +6 -6
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/lm75.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mcp23017.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mcp9808.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/modbus_devices.schema.json +6 -6
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/oled.schema.json +4 -4
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/output.schema.json +4 -4
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/output_group.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/pca9685.schema.json +2 -2
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/pcf8575.schema.json +2 -2
- boneio-1.0.0.dev21/boneio/webui/schema/remote_devices.schema.json +437 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/sensor.schema.json +4 -4
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
- {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/web.schema.json +5 -5
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21/boneio.egg-info}/PKG-INFO +3 -1
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/SOURCES.txt +18 -17
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/requires.txt +2 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/pyproject.toml +3 -1
- boneio-1.0.0.dev19/boneio/version.py +0 -2
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/index-BnfQOkAm.css +0 -1
- boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -135
- boneio-1.0.0.dev19/boneio/webui/schema/remote_devices.schema.json +0 -135
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/LICENSE +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/MANIFEST.in +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/README.md +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/bonecli.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/cover.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/previous.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/group/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/group/output_group.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/detectors.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/event.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/basic.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/mcp.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/pca.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/pcf.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/const.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/package.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/discovery.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/events/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/events/bus.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/covers.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/display.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/base.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/base.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/system.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/state/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/state/manager.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/host_data.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/monitor.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/filter.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/logger.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/util.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/exceptions.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/interlock.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/cli.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/client.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/utils.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/actions.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/events.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/files.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/logs.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/mqtt.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/state.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/filters.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/id.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/schema.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/app.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/update.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/services/logs.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/web_server.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/setup.cfg +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/setup.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/tests/test_i2c_smbus2.py +0 -0
- {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/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.dev21
|
|
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:
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -44,6 +46,7 @@ class RemoteDeviceManager:
|
|
|
44
46
|
message_bus: MessageBus | None = None,
|
|
45
47
|
remote_devices_config: list[dict[str, Any]] | None = None,
|
|
46
48
|
own_serial: str | None = None,
|
|
49
|
+
name: str | None = None,
|
|
47
50
|
) -> None:
|
|
48
51
|
"""Initialize remote device manager.
|
|
49
52
|
|
|
@@ -55,6 +58,7 @@ class RemoteDeviceManager:
|
|
|
55
58
|
self._message_bus = message_bus
|
|
56
59
|
self._devices: dict[str, RemoteDevice] = {}
|
|
57
60
|
self._own_serial = own_serial
|
|
61
|
+
self._name = name
|
|
58
62
|
# Track autodiscovered devices separately from configured ones
|
|
59
63
|
self._autodiscovered_devices: dict[str, MQTTRemoteDevice] = {}
|
|
60
64
|
# Track devices that manage this boneIO (received via discovery/managed_by topic)
|
|
@@ -111,8 +115,7 @@ class RemoteDeviceManager:
|
|
|
111
115
|
|
|
112
116
|
# Build payload with our device info
|
|
113
117
|
payload = json.dumps({
|
|
114
|
-
"
|
|
115
|
-
"name": self._own_serial, # Will be updated with actual name if available
|
|
118
|
+
"name": self._name or self._own_serial,
|
|
116
119
|
"serial": self._own_serial,
|
|
117
120
|
})
|
|
118
121
|
|
|
@@ -172,8 +175,7 @@ class RemoteDeviceManager:
|
|
|
172
175
|
_LOGGER.warning("ESPHome UDP protocol not yet implemented for device '%s'", device_id)
|
|
173
176
|
return None
|
|
174
177
|
elif protocol == RemoteDeviceProtocol.ESPHOME_API:
|
|
175
|
-
|
|
176
|
-
return None
|
|
178
|
+
return self._create_esphome_device(device_id, name, config)
|
|
177
179
|
else:
|
|
178
180
|
_LOGGER.error("Unsupported protocol '%s' for device '%s'", protocol, device_id)
|
|
179
181
|
return None
|
|
@@ -208,6 +210,103 @@ class RemoteDeviceManager:
|
|
|
208
210
|
covers=covers,
|
|
209
211
|
)
|
|
210
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
|
+
|
|
211
310
|
def get_device(self, device_id: str) -> RemoteDevice | None:
|
|
212
311
|
"""Get remote device by ID.
|
|
213
312
|
|
|
@@ -232,13 +331,20 @@ class RemoteDeviceManager:
|
|
|
232
331
|
device_id: str,
|
|
233
332
|
output_id: str,
|
|
234
333
|
action: str,
|
|
334
|
+
brightness: int | None = None,
|
|
335
|
+
transition: float | None = None,
|
|
235
336
|
) -> bool:
|
|
236
|
-
"""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.
|
|
237
341
|
|
|
238
342
|
Args:
|
|
239
343
|
device_id: ID of the remote device
|
|
240
|
-
output_id: ID of the output to control
|
|
241
|
-
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
|
|
242
348
|
|
|
243
349
|
Returns:
|
|
244
350
|
True if command was sent successfully
|
|
@@ -248,6 +354,25 @@ class RemoteDeviceManager:
|
|
|
248
354
|
_LOGGER.error("Remote device '%s' not found", device_id)
|
|
249
355
|
return False
|
|
250
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
|
|
251
376
|
return await device.control_output(
|
|
252
377
|
output_id=output_id,
|
|
253
378
|
action=action,
|
|
@@ -261,12 +386,14 @@ class RemoteDeviceManager:
|
|
|
261
386
|
action: str,
|
|
262
387
|
**kwargs,
|
|
263
388
|
) -> bool:
|
|
264
|
-
"""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.
|
|
265
392
|
|
|
266
393
|
Args:
|
|
267
394
|
device_id: ID of the remote device
|
|
268
395
|
cover_id: ID of the cover to control
|
|
269
|
-
action: Action to perform (OPEN, CLOSE, STOP, etc.)
|
|
396
|
+
action: Action to perform (OPEN, CLOSE, STOP, TOGGLE, etc.)
|
|
270
397
|
**kwargs: Additional parameters (position, tilt_position)
|
|
271
398
|
|
|
272
399
|
Returns:
|
|
@@ -277,6 +404,15 @@ class RemoteDeviceManager:
|
|
|
277
404
|
_LOGGER.error("Remote device '%s' not found", device_id)
|
|
278
405
|
return False
|
|
279
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
|
|
280
416
|
return await device.control_cover(
|
|
281
417
|
cover_id=cover_id,
|
|
282
418
|
action=action,
|
|
@@ -352,7 +488,27 @@ class RemoteDeviceManager:
|
|
|
352
488
|
device_id = parts[1] # e.g., "blk_abc123"
|
|
353
489
|
discovery_type = parts[3] if len(parts) > 3 else None # e.g., "outputs", "covers", "device"
|
|
354
490
|
|
|
355
|
-
#
|
|
491
|
+
# Handle managed_by BEFORE skipping own device check
|
|
492
|
+
# Topic: boneio/{our_device}/discovery/managed_by/{manager_serial}
|
|
493
|
+
# This is for messages TO our device, so device_id will be our serial
|
|
494
|
+
if discovery_type == "managed_by":
|
|
495
|
+
manager_serial = parts[4] if len(parts) > 4 else None
|
|
496
|
+
if manager_serial and self._own_serial != manager_serial:
|
|
497
|
+
try:
|
|
498
|
+
data = json.loads(payload) if payload else None
|
|
499
|
+
except json.JSONDecodeError as e:
|
|
500
|
+
_LOGGER.warning("Invalid JSON in managed_by payload: %s", e)
|
|
501
|
+
return
|
|
502
|
+
if data:
|
|
503
|
+
self.handle_managed_by_discovery(manager_serial, data)
|
|
504
|
+
else:
|
|
505
|
+
# Empty payload - remove managed_by entry
|
|
506
|
+
if manager_serial in self._managed_by_devices:
|
|
507
|
+
del self._managed_by_devices[manager_serial]
|
|
508
|
+
_LOGGER.info("Removed managed_by device: %s", manager_serial)
|
|
509
|
+
return
|
|
510
|
+
|
|
511
|
+
# Skip our own device (for other discovery types)
|
|
356
512
|
if self._own_serial and device_id == self._own_serial:
|
|
357
513
|
_LOGGER.debug("Ignoring discovery from own device: %s", device_id)
|
|
358
514
|
return
|
|
@@ -385,12 +541,6 @@ class RemoteDeviceManager:
|
|
|
385
541
|
self._handle_outputs_discovery(device_id, data)
|
|
386
542
|
elif discovery_type == "covers":
|
|
387
543
|
self._handle_covers_discovery(device_id, data)
|
|
388
|
-
elif discovery_type == "managed_by":
|
|
389
|
-
# Handle managed_by - this is for OUR device, not the sender
|
|
390
|
-
# Topic: boneio/{our_device}/discovery/managed_by/{manager_serial}
|
|
391
|
-
manager_serial = parts[4] if len(parts) > 4 else None
|
|
392
|
-
if manager_serial:
|
|
393
|
-
self.handle_managed_by_discovery(manager_serial, data)
|
|
394
544
|
else:
|
|
395
545
|
_LOGGER.debug("Ignoring discovery type '%s' for device %s", discovery_type, device_id)
|
|
396
546
|
|
|
@@ -570,6 +720,11 @@ class RemoteDeviceManager:
|
|
|
570
720
|
Returns:
|
|
571
721
|
Dictionary with autodiscovered devices information
|
|
572
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
|
+
)
|
|
573
728
|
return {
|
|
574
729
|
device_id: device.to_dict()
|
|
575
730
|
for device_id, device in self._autodiscovered_devices.items()
|
|
@@ -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
|
]
|