boneIO 1.1.0.dev3__tar.gz → 1.1.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.1.0.dev3/boneio.egg-info → boneio-1.1.0.dev4}/PKG-INFO +1 -1
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/config_helper.py +8 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/inputs.py +8 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/manager.py +20 -0
- boneio-1.1.0.dev4/boneio/core/manager/update.py +341 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/homeassistant.py +44 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/runner.py +1 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/schema.yaml +12 -0
- boneio-1.1.0.dev4/boneio/version.py +2 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/app.py +2 -0
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/cssMode-D_Y1ZXCG.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/cssMode-CfBnHhQI.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/freemarker2-CzSRjwLP.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/freemarker2-Bh2BQpSG.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/handlebars-CZgWREM_.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/handlebars-D68RL95z.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/html-l_-Dx9v2.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/html-XKVYovyY.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/htmlMode-C94ufgZC.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/htmlMode-QT0rbnhL.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-BtWe9nS_.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/index-NKuu8fvk.js +5 -5
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/javascript-CTWNFYCB.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/javascript-CxT2_Xcl.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/jsonMode-6lY0okwf.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/jsonMode-mhlSbJro.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/liquid-BpvwlD2T.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/liquid-D62PitRX.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/mdx-CLQNFljY.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/mdx-C5xjvE7q.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/python-Cq5ZYn3v.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/python-B5fpI3od.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/razor-kCTdL12M.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/razor-DaPtFLXE.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/tsMode-C1oHUIMn.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/tsMode-ltYtI_us.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/typescript-Bg5eEWu8.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/typescript-DwdFtOSo.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/xml-CMwCv6rv.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/xml-CiaIsyq7.js +1 -1
- boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/yaml-CVxeQdw0.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/yaml-DWYHE4pc.js +1 -1
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/index.html +1 -1
- {boneio-1.1.0.dev3/boneio/webui/schema → boneio-1.1.0.dev4/boneio/webui/frontend-dist/schem}/config.schema.json +19 -6
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mqtt.schema.json +13 -0
- {boneio-1.1.0.dev3/boneio/webui/schema → boneio-1.1.0.dev4/boneio/webui/frontend-dist/schem}/web.schema.json +6 -6
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/update.py +42 -1
- {boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev4/boneio/webui/schema}/config.schema.json +19 -6
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mqtt.schema.json +13 -0
- {boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev4/boneio/webui/schema}/web.schema.json +6 -6
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/SOURCES.txt +17 -16
- boneio-1.1.0.dev3/boneio/version.py +0 -2
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/LICENSE +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/MANIFEST.in +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/README.md +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/bonecli.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/cover.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/previous.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/group/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/group/output_group.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/detectors.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/event.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/basic.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/mcp.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/pca.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/pcf.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/const.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/package.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/discovery.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/events/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/events/bus.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/covers.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/display.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/remote.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/local.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/base.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/wled.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/base.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/system.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/state/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/state/manager.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/host_data.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/monitor.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/filter.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/logger.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/util.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/exceptions.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/interlock.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/cli.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/client.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/utils.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/actions.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/events.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/files.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/logs.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/mqtt.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/state.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/filters.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/id.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/event.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/config.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/system.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/services/logs.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/web_server.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/pyproject.toml +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/setup.cfg +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/setup.py +0 -0
- {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/tests/test_py313_compatibility.py +0 -0
|
@@ -45,6 +45,7 @@ class ConfigHelper:
|
|
|
45
45
|
config_file_path: str | None = None,
|
|
46
46
|
send_boneio_autodiscovery: bool = True,
|
|
47
47
|
receive_boneio_autodiscovery: bool = True,
|
|
48
|
+
update_channel: str = "stable",
|
|
48
49
|
):
|
|
49
50
|
self._name = name
|
|
50
51
|
|
|
@@ -63,6 +64,7 @@ class ConfigHelper:
|
|
|
63
64
|
self._ha_discovery_prefix = ha_discovery_prefix
|
|
64
65
|
self._send_boneio_autodiscovery = send_boneio_autodiscovery
|
|
65
66
|
self._receive_boneio_autodiscovery = receive_boneio_autodiscovery
|
|
67
|
+
self._update_channel = update_channel
|
|
66
68
|
self._device_type = device_type
|
|
67
69
|
self._web_port = web_port
|
|
68
70
|
self._proxy_port = proxy_port
|
|
@@ -79,6 +81,7 @@ class ConfigHelper:
|
|
|
79
81
|
TEXT_SENSOR: {},
|
|
80
82
|
SELECT: {},
|
|
81
83
|
NUMERIC: {},
|
|
84
|
+
"update": {}
|
|
82
85
|
}
|
|
83
86
|
self.manager_ready: bool = False
|
|
84
87
|
self._network_info = network_info
|
|
@@ -181,6 +184,11 @@ class ConfigHelper:
|
|
|
181
184
|
"""Check if BoneIO autodiscovery receiving is enabled."""
|
|
182
185
|
return self._receive_boneio_autodiscovery
|
|
183
186
|
|
|
187
|
+
@property
|
|
188
|
+
def update_channel(self) -> str:
|
|
189
|
+
"""Get update channel (stable or dev)."""
|
|
190
|
+
return self._update_channel
|
|
191
|
+
|
|
184
192
|
@property
|
|
185
193
|
def device_type(self) -> str:
|
|
186
194
|
return self._device_type
|
|
@@ -687,6 +687,14 @@ class InputManager:
|
|
|
687
687
|
# Send event to MQTT for Home Assistant
|
|
688
688
|
self._publish_input_event_to_mqtt(input_instance, event)
|
|
689
689
|
|
|
690
|
+
# If publish_only is set, skip action execution (used for initial state sync)
|
|
691
|
+
if event.publish_only:
|
|
692
|
+
_LOGGER.debug(
|
|
693
|
+
"Skipping action execution for %s (publish_only=True)",
|
|
694
|
+
event.entity_id
|
|
695
|
+
)
|
|
696
|
+
return
|
|
697
|
+
|
|
690
698
|
# Execute actions with duration threshold support
|
|
691
699
|
if actions and event.click_type == LONG:
|
|
692
700
|
# Get executed_actions from detector state
|
|
@@ -39,6 +39,7 @@ from boneio.core.manager.modbus import ModbusManager
|
|
|
39
39
|
from boneio.core.manager.outputs import OutputManager
|
|
40
40
|
from boneio.core.manager.sensors import SensorManager
|
|
41
41
|
from boneio.core.manager.remote import RemoteDeviceManager
|
|
42
|
+
from boneio.core.manager.update import UpdateManager
|
|
42
43
|
from boneio.core.discovery import BlackDiscoveryPublisher
|
|
43
44
|
from boneio.core.messaging import MessageBus
|
|
44
45
|
from boneio.core.state import StateManager
|
|
@@ -204,6 +205,11 @@ class Manager:
|
|
|
204
205
|
message_bus=message_bus,
|
|
205
206
|
)
|
|
206
207
|
|
|
208
|
+
# 9. UpdateManager (checks for software updates and publishes to HA)
|
|
209
|
+
self.update_manager = UpdateManager(
|
|
210
|
+
manager=self,
|
|
211
|
+
)
|
|
212
|
+
|
|
207
213
|
# Configure virtual energy sensors (must be after outputs are initialized)
|
|
208
214
|
self.sensors.configure_virtual_energy_sensors()
|
|
209
215
|
|
|
@@ -323,6 +329,7 @@ class Manager:
|
|
|
323
329
|
await self.sensors.send_ha_autodiscovery()
|
|
324
330
|
await self.modbus.send_ha_autodiscovery()
|
|
325
331
|
await self.display.send_ha_autodiscovery()
|
|
332
|
+
await self.update_manager.send_ha_autodiscovery()
|
|
326
333
|
|
|
327
334
|
def send_ha_autodiscovery(
|
|
328
335
|
self,
|
|
@@ -380,6 +387,9 @@ class Manager:
|
|
|
380
387
|
availability_msg_func = ha_cover_availabilty_message
|
|
381
388
|
elif ha_type == BUTTON:
|
|
382
389
|
availability_msg_func = ha_button_availabilty_message
|
|
390
|
+
elif ha_type == "update":
|
|
391
|
+
from boneio.integration.homeassistant import ha_update_availability_message
|
|
392
|
+
availability_msg_func = ha_update_availability_message
|
|
383
393
|
|
|
384
394
|
# Use availability_msg_func from kwargs if provided (for sensors)
|
|
385
395
|
if 'availability_msg_func' in kwargs:
|
|
@@ -400,6 +410,16 @@ class Manager:
|
|
|
400
410
|
)
|
|
401
411
|
self.send_message(topic=topic, payload=payload, retain=True)
|
|
402
412
|
|
|
413
|
+
async def _handle_update_install_command(self, topic: str, payload: str) -> None:
|
|
414
|
+
"""Handle update install command from Home Assistant.
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
topic: MQTT topic
|
|
418
|
+
payload: MQTT payload (should be "INSTALL")
|
|
419
|
+
"""
|
|
420
|
+
_LOGGER.info("Received update install command: %s", payload)
|
|
421
|
+
await self.update_manager.handle_install_command(payload)
|
|
422
|
+
|
|
403
423
|
def parse_actions(self, pin: str, actions: dict) -> dict:
|
|
404
424
|
"""Parse actions configuration.
|
|
405
425
|
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"""Update manager for checking and publishing software updates to Home Assistant.
|
|
2
|
+
|
|
3
|
+
This module manages periodic checking of software updates from GitHub
|
|
4
|
+
and publishes the update status to Home Assistant via MQTT.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from boneio.core.utils.async_updater import AsyncUpdater
|
|
14
|
+
from boneio.core.utils.timeperiod import TimePeriod
|
|
15
|
+
from boneio.version import __version__
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from boneio.core.manager import Manager
|
|
19
|
+
|
|
20
|
+
_LOGGER = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class UpdateManager(AsyncUpdater):
|
|
24
|
+
"""Manages software update checking and MQTT publishing.
|
|
25
|
+
|
|
26
|
+
This manager:
|
|
27
|
+
- Checks for updates from GitHub periodically (default: 4 hours)
|
|
28
|
+
- Caches results to avoid rate limiting
|
|
29
|
+
- Publishes update state to MQTT for Home Assistant
|
|
30
|
+
- Supports on-demand update checks from frontend
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
manager: Manager,
|
|
36
|
+
update_interval: TimePeriod | None = None,
|
|
37
|
+
):
|
|
38
|
+
"""Initialize UpdateManager.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
manager: Parent Manager instance
|
|
42
|
+
update_interval: Time between update checks (default: 4 hours)
|
|
43
|
+
"""
|
|
44
|
+
self.id = "update_manager"
|
|
45
|
+
self._manager = manager
|
|
46
|
+
|
|
47
|
+
# Update check interval (default: 4 hours)
|
|
48
|
+
if update_interval is None:
|
|
49
|
+
update_interval = TimePeriod(hours=4)
|
|
50
|
+
|
|
51
|
+
# Cache for update info to avoid excessive GitHub API calls
|
|
52
|
+
self._last_check_result: dict | None = None
|
|
53
|
+
self._last_published_state: str | None = None
|
|
54
|
+
self._ha_discovery_sent: bool = False
|
|
55
|
+
|
|
56
|
+
# Initialize AsyncUpdater (starts periodic task)
|
|
57
|
+
super().__init__(manager=manager, update_interval=update_interval)
|
|
58
|
+
|
|
59
|
+
_LOGGER.info(
|
|
60
|
+
"UpdateManager initialized (check interval: %s)",
|
|
61
|
+
update_interval
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
async def async_update(self, timestamp: float) -> float | None:
|
|
65
|
+
"""Perform periodic update check.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
timestamp: Current timestamp
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Optional custom update interval in seconds
|
|
72
|
+
"""
|
|
73
|
+
# Send HA discovery on first update (MQTT is connected by then)
|
|
74
|
+
if not self._ha_discovery_sent:
|
|
75
|
+
await self.send_ha_autodiscovery()
|
|
76
|
+
self._ha_discovery_sent = True
|
|
77
|
+
|
|
78
|
+
_LOGGER.debug("Checking for software updates...")
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
# Check for updates from GitHub
|
|
82
|
+
update_info = await self._check_update_from_github()
|
|
83
|
+
|
|
84
|
+
if update_info and update_info.get("status") == "success":
|
|
85
|
+
# Publish state to MQTT
|
|
86
|
+
await self._publish_state_to_mqtt(update_info)
|
|
87
|
+
else:
|
|
88
|
+
_LOGGER.warning(
|
|
89
|
+
"Update check failed: %s",
|
|
90
|
+
update_info.get("message", "Unknown error") if update_info else "No response"
|
|
91
|
+
)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
_LOGGER.error("Error during update check: %s", e, exc_info=True)
|
|
94
|
+
|
|
95
|
+
# Return None to use default interval
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
async def _check_update_from_github(self) -> dict | None:
|
|
99
|
+
"""Check for updates from GitHub releases.
|
|
100
|
+
|
|
101
|
+
This method reuses the logic from /api/check_update endpoint.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Update information dict or None on error
|
|
105
|
+
"""
|
|
106
|
+
current_version = __version__
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
import requests
|
|
110
|
+
except ImportError:
|
|
111
|
+
_LOGGER.error("Package 'requests' is not installed")
|
|
112
|
+
return {
|
|
113
|
+
"status": "error",
|
|
114
|
+
"message": "Package 'requests' is not installed",
|
|
115
|
+
"current_version": current_version
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
from packaging import version
|
|
120
|
+
except ImportError:
|
|
121
|
+
_LOGGER.error("Package 'packaging' is not installed")
|
|
122
|
+
return {
|
|
123
|
+
"status": "error",
|
|
124
|
+
"message": "Package 'packaging' is not installed",
|
|
125
|
+
"current_version": current_version
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
repo = "boneIO-eu/app_black"
|
|
130
|
+
api_url = f'https://api.github.com/repos/{repo}/releases'
|
|
131
|
+
response = requests.get(api_url, timeout=10)
|
|
132
|
+
|
|
133
|
+
if response.status_code != 200:
|
|
134
|
+
return {
|
|
135
|
+
"status": "error",
|
|
136
|
+
"message": f"GitHub API error: {response.status_code}",
|
|
137
|
+
"current_version": current_version
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
releases = response.json()
|
|
141
|
+
|
|
142
|
+
if not releases:
|
|
143
|
+
return {
|
|
144
|
+
"status": "error",
|
|
145
|
+
"message": "No releases found on GitHub",
|
|
146
|
+
"current_version": current_version
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
# Find latest stable and prerelease versions
|
|
150
|
+
latest_stable = None
|
|
151
|
+
latest_prerelease = None
|
|
152
|
+
|
|
153
|
+
for release in releases:
|
|
154
|
+
tag = release['tag_name']
|
|
155
|
+
ver_str = tag[1:] if tag.startswith('v') else tag
|
|
156
|
+
|
|
157
|
+
# Skip v0.x versions (Debian 10, incompatible)
|
|
158
|
+
if tag.startswith("v0."):
|
|
159
|
+
continue
|
|
160
|
+
|
|
161
|
+
is_prerelease = release.get('prerelease', False)
|
|
162
|
+
|
|
163
|
+
if not is_prerelease:
|
|
164
|
+
ver_lower = ver_str.lower()
|
|
165
|
+
is_prerelease = any(x in ver_lower for x in ['dev', 'alpha', 'beta', 'rc'])
|
|
166
|
+
|
|
167
|
+
ver_info = {
|
|
168
|
+
"version": ver_str,
|
|
169
|
+
"is_prerelease": is_prerelease,
|
|
170
|
+
"release_url": release['html_url'],
|
|
171
|
+
"published_at": release['published_at'],
|
|
172
|
+
"release_notes": release.get('body', '')[:255], # Max 255 chars for HA
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if not is_prerelease and latest_stable is None:
|
|
176
|
+
latest_stable = ver_info
|
|
177
|
+
if is_prerelease and latest_prerelease is None:
|
|
178
|
+
latest_prerelease = ver_info
|
|
179
|
+
|
|
180
|
+
# Stop after finding both
|
|
181
|
+
if latest_stable and latest_prerelease:
|
|
182
|
+
break
|
|
183
|
+
|
|
184
|
+
# Determine which version to recommend based on update_channel setting
|
|
185
|
+
update_channel = self._manager._config_helper.update_channel
|
|
186
|
+
|
|
187
|
+
if update_channel == "dev":
|
|
188
|
+
# Dev channel: prefer prerelease, fallback to stable
|
|
189
|
+
recommended = latest_prerelease or latest_stable
|
|
190
|
+
else:
|
|
191
|
+
# Stable channel (default): only stable releases
|
|
192
|
+
recommended = latest_stable
|
|
193
|
+
|
|
194
|
+
if not recommended:
|
|
195
|
+
return {
|
|
196
|
+
"status": "error",
|
|
197
|
+
"message": "No suitable release found",
|
|
198
|
+
"current_version": current_version
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
# Check if update is available
|
|
202
|
+
is_update_available = False
|
|
203
|
+
try:
|
|
204
|
+
current_parsed = version.parse(current_version)
|
|
205
|
+
recommended_parsed = version.parse(recommended["version"])
|
|
206
|
+
is_update_available = recommended_parsed > current_parsed
|
|
207
|
+
except Exception as e:
|
|
208
|
+
_LOGGER.warning("Error parsing versions: %s", e)
|
|
209
|
+
|
|
210
|
+
result = {
|
|
211
|
+
"status": "success",
|
|
212
|
+
"current_version": current_version,
|
|
213
|
+
"latest_version": recommended["version"],
|
|
214
|
+
"update_available": is_update_available,
|
|
215
|
+
"release_url": recommended["release_url"],
|
|
216
|
+
"release_notes": recommended.get("release_notes", ""),
|
|
217
|
+
"is_prerelease": recommended["is_prerelease"],
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
# Cache result
|
|
221
|
+
self._last_check_result = result
|
|
222
|
+
|
|
223
|
+
return result
|
|
224
|
+
|
|
225
|
+
except Exception as e:
|
|
226
|
+
_LOGGER.error("Error checking for updates: %s", e, exc_info=True)
|
|
227
|
+
return {
|
|
228
|
+
"status": "error",
|
|
229
|
+
"message": f"Error: {str(e)}",
|
|
230
|
+
"current_version": current_version
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async def _publish_state_to_mqtt(self, update_info: dict) -> None:
|
|
234
|
+
"""Publish update state to MQTT for Home Assistant.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
update_info: Update information from GitHub check
|
|
238
|
+
"""
|
|
239
|
+
if update_info.get("status") != "success":
|
|
240
|
+
return
|
|
241
|
+
|
|
242
|
+
current_version = update_info.get("current_version", __version__)
|
|
243
|
+
latest_version = update_info.get("latest_version", current_version)
|
|
244
|
+
|
|
245
|
+
# Build state payload (JSON format for HA Update entity)
|
|
246
|
+
state_payload = {
|
|
247
|
+
"installed_version": current_version,
|
|
248
|
+
"latest_version": latest_version,
|
|
249
|
+
"title": "boneIO Black Firmware",
|
|
250
|
+
"release_url": update_info.get("release_url", ""),
|
|
251
|
+
"release_summary": update_info.get("release_notes", "")[:255], # HA limit
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
# Add entity_picture (boneIO logo from HA brands)
|
|
255
|
+
state_payload["entity_picture"] = "http://boneio.eu/logo_fb_circle.png"
|
|
256
|
+
|
|
257
|
+
# Convert to JSON
|
|
258
|
+
payload_json = json.dumps(state_payload)
|
|
259
|
+
|
|
260
|
+
# Only publish if state changed (avoid unnecessary MQTT traffic)
|
|
261
|
+
if payload_json == self._last_published_state:
|
|
262
|
+
_LOGGER.debug("Update state unchanged, skipping MQTT publish")
|
|
263
|
+
return
|
|
264
|
+
|
|
265
|
+
# Publish to MQTT
|
|
266
|
+
topic_prefix = self._manager._config_helper.topic_prefix
|
|
267
|
+
state_topic = f"{topic_prefix}/update/state"
|
|
268
|
+
|
|
269
|
+
self._manager.send_message(
|
|
270
|
+
topic=state_topic,
|
|
271
|
+
payload=payload_json,
|
|
272
|
+
retain=True,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
self._last_published_state = payload_json
|
|
276
|
+
|
|
277
|
+
_LOGGER.info(
|
|
278
|
+
"Published update state to MQTT: %s -> %s (update available: %s)",
|
|
279
|
+
current_version,
|
|
280
|
+
latest_version,
|
|
281
|
+
update_info.get("update_available", False)
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
def get_last_check_result(self) -> dict | None:
|
|
285
|
+
"""Get the last update check result.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
Last check result dict or None if no check performed yet
|
|
289
|
+
"""
|
|
290
|
+
return self._last_check_result
|
|
291
|
+
|
|
292
|
+
async def handle_install_command(self, payload: str) -> None:
|
|
293
|
+
"""Handle install command from Home Assistant.
|
|
294
|
+
|
|
295
|
+
This is called when HA sends a message to the command topic.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
payload: MQTT payload (should be "INSTALL")
|
|
299
|
+
"""
|
|
300
|
+
if payload != "INSTALL":
|
|
301
|
+
_LOGGER.warning("Invalid install command payload: %s", payload)
|
|
302
|
+
return
|
|
303
|
+
|
|
304
|
+
_LOGGER.info("Received install command from Home Assistant")
|
|
305
|
+
|
|
306
|
+
# Check if update is available
|
|
307
|
+
if not self._last_check_result:
|
|
308
|
+
_LOGGER.warning("No update check result available, checking now...")
|
|
309
|
+
await self.async_update(timestamp=0)
|
|
310
|
+
|
|
311
|
+
if not self._last_check_result or not self._last_check_result.get("update_available"):
|
|
312
|
+
_LOGGER.warning("No update available to install")
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
# Trigger update via existing update endpoint
|
|
316
|
+
# Note: This requires the update API to be accessible
|
|
317
|
+
# The actual installation is handled by /api/update endpoint
|
|
318
|
+
_LOGGER.info(
|
|
319
|
+
"Update installation should be triggered via WebUI or API endpoint /api/update"
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# TODO: Consider adding direct integration with update logic
|
|
323
|
+
# For now, users should use the WebUI to trigger updates
|
|
324
|
+
|
|
325
|
+
async def send_ha_autodiscovery(self) -> None:
|
|
326
|
+
"""Send Home Assistant autodiscovery for Update entity."""
|
|
327
|
+
_LOGGER.debug("Sending HA autodiscovery for Update entity")
|
|
328
|
+
|
|
329
|
+
self._manager.send_ha_autodiscovery(
|
|
330
|
+
id="firmware",
|
|
331
|
+
name="Update",
|
|
332
|
+
ha_type="update",
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
# Subscribe to command topic for install commands
|
|
336
|
+
command_topic = f"{self._manager._topic_prefix}/update/install"
|
|
337
|
+
await self._manager._message_bus.subscribe_and_listen(
|
|
338
|
+
topic=command_topic,
|
|
339
|
+
callback=self._manager._handle_update_install_command
|
|
340
|
+
)
|
|
341
|
+
_LOGGER.info("Subscribed to update command topic: %s", command_topic)
|
|
@@ -661,3 +661,47 @@ def ha_cover_with_tilt_availabilty_message(
|
|
|
661
661
|
"position_template": '{{ value_json.position }}',
|
|
662
662
|
"tilt_status_template": '{{ value_json.tilt }}',
|
|
663
663
|
}
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
def ha_update_availability_message(
|
|
667
|
+
id: str, name: str, config_helper: ConfigHelper, **kwargs
|
|
668
|
+
) -> HomeAssistantDiscoveryMessage:
|
|
669
|
+
"""Create Update availability topic for HA.
|
|
670
|
+
|
|
671
|
+
Args:
|
|
672
|
+
id: Entity ID
|
|
673
|
+
name: Entity name
|
|
674
|
+
config_helper: ConfigHelper instance
|
|
675
|
+
**kwargs: Additional fields (e.g., device_class, entity_category)
|
|
676
|
+
|
|
677
|
+
Returns:
|
|
678
|
+
HA discovery message for Update entity
|
|
679
|
+
"""
|
|
680
|
+
topic = config_helper.topic_prefix
|
|
681
|
+
|
|
682
|
+
# Default kwargs for Update entity
|
|
683
|
+
default_kwargs = {
|
|
684
|
+
"device_class": "firmware",
|
|
685
|
+
"entity_category": "diagnostic",
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
msg = ha_availabilty_message(
|
|
689
|
+
device_type="update",
|
|
690
|
+
entity_type="update",
|
|
691
|
+
config_helper=config_helper,
|
|
692
|
+
id=id,
|
|
693
|
+
name=name,
|
|
694
|
+
**{**default_kwargs, **kwargs}
|
|
695
|
+
)
|
|
696
|
+
|
|
697
|
+
result = {
|
|
698
|
+
**msg,
|
|
699
|
+
"state_topic": f"{topic}/update/state",
|
|
700
|
+
"command_topic": f"{topic}/update/install",
|
|
701
|
+
"payload_install": "INSTALL",
|
|
702
|
+
"icon": "mdi:update",
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
_LOGGER.debug("Update HA discovery message: %s", result)
|
|
706
|
+
|
|
707
|
+
return result
|
|
@@ -120,6 +120,7 @@ async def async_run(
|
|
|
120
120
|
config_file_path=config_file,
|
|
121
121
|
send_boneio_autodiscovery=mqtt_config.get("send_boneio_autodiscovery", True),
|
|
122
122
|
receive_boneio_autodiscovery=mqtt_config.get("receive_boneio_autodiscovery", True),
|
|
123
|
+
update_channel=mqtt_config.get("update_channel", "stable"),
|
|
123
124
|
)
|
|
124
125
|
|
|
125
126
|
# Load areas configuration
|
|
@@ -87,6 +87,18 @@ mqtt:
|
|
|
87
87
|
description: |
|
|
88
88
|
When enabled, this device subscribes to BoneIO autodiscovery topics
|
|
89
89
|
(boneio/+/discovery/#) and automatically discovers neighboring BoneIO devices.
|
|
90
|
+
update_channel:
|
|
91
|
+
type: string
|
|
92
|
+
default: stable
|
|
93
|
+
allowed:
|
|
94
|
+
- stable
|
|
95
|
+
- dev
|
|
96
|
+
meta:
|
|
97
|
+
label: Update channel
|
|
98
|
+
description: |
|
|
99
|
+
Which releases to show in Home Assistant Update entity:
|
|
100
|
+
- stable: Only stable releases (recommended)
|
|
101
|
+
- dev: Include development/pre-release versions
|
|
90
102
|
|
|
91
103
|
web:
|
|
92
104
|
type: dict
|
|
@@ -153,6 +153,7 @@ from boneio.webui.routes import covers as covers_module
|
|
|
153
153
|
from boneio.webui.routes import modbus as modbus_module
|
|
154
154
|
from boneio.webui.routes import sensors as sensors_module
|
|
155
155
|
from boneio.webui.routes import remote_devices as remote_devices_module
|
|
156
|
+
from boneio.webui.routes import update as update_module
|
|
156
157
|
|
|
157
158
|
# Use dependency_overrides to replace the placeholder get_manager functions
|
|
158
159
|
app.dependency_overrides[outputs_module.get_manager] = get_manager
|
|
@@ -160,6 +161,7 @@ app.dependency_overrides[covers_module.get_manager] = get_manager
|
|
|
160
161
|
app.dependency_overrides[modbus_module.get_manager] = get_manager
|
|
161
162
|
app.dependency_overrides[sensors_module.get_manager] = get_manager
|
|
162
163
|
app.dependency_overrides[remote_devices_module.get_manager] = get_manager
|
|
164
|
+
app.dependency_overrides[update_module.get_manager] = get_manager
|
|
163
165
|
system_module.set_config_helper_getter(get_config_helper)
|
|
164
166
|
|
|
165
167
|
|