boneio 1.2.0.dev7__tar.gz → 1.2.0.dev9__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.2.0.dev7/boneio.egg-info → boneio-1.2.0.dev9}/PKG-INFO +1 -1
- boneio-1.2.0.dev9/boneio/core/config/migrations/__init__.py +222 -0
- boneio-1.2.0.dev9/boneio/core/config/migrations/v1_proxy_port.py +75 -0
- boneio-1.2.0.dev9/boneio/core/config/migrations/v2_transition.py +94 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/yaml_util.py +31 -81
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/manager.py +21 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/update.py +268 -6
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/mqtt.py +8 -6
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/homeassistant.py +1 -1
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions.yaml +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/schema.yaml +6 -0
- boneio-1.2.0.dev9/boneio/version.py +2 -0
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/cssMode-D2_GdEHn.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/cssMode-xo2BdOZm.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/freemarker2-Ccev9DQ3.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/freemarker2-CpF78_ZW.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/handlebars-CSWuYUii.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/handlebars-CTxt7dmO.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/html-BeCDD7uj.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/html-BU5yZ3BK.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/htmlMode-Csqim4tI.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/htmlMode-Bi7QBmdE.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/index-C6eDye5h.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/index-TnEo7N0a.js +145 -145
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/javascript-CNjo7h5s.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/javascript-BTvyG1P5.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/jsonMode-CrofIOf5.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/jsonMode-HE9dW4cx.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/liquid-DhQWiRQL.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/liquid-BxuGpv1s.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/mdx-B7NfGq9x.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/mdx-C04Q98IR.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/python-CfAzolFq.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/python-CKNUIQdp.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/razor-nVU9Xllg.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/razor-UrUJyAuF.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/tsMode-DUyiY9xo.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/tsMode-AhPw7VFe.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/typescript-Cz5XSgIr.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/typescript-CLXQgPoF.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/xml-Bf4znVSR.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/xml-DZmKn2me.js +1 -1
- boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/yaml-KWLRG-vP.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/yaml-CGKDqmHX.js +1 -1
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/index.html +1 -1
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/adc.schema.json +2 -2
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +30 -30
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/boneio.schema.json +11 -2
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/config.schema.json +247 -238
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/cover.schema.json +8 -8
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/event.schema.json +106 -106
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/ina219.schema.json +4 -4
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/lm75.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/modbus.schema.json +6 -6
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +8 -8
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/mqtt.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/oled.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/output.schema.json +8 -8
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/pca9685.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +26 -26
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/sensor.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/web.schema.json +12 -12
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/update.py +44 -113
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/adc.schema.json +2 -2
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/binary_sensor.schema.json +30 -30
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/boneio.schema.json +11 -2
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/config.schema.json +247 -238
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/cover.schema.json +8 -8
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/event.schema.json +106 -106
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/ina219.schema.json +4 -4
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/lm75.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/mcp23017.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/mcp9808.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/modbus.schema.json +6 -6
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/modbus_devices.schema.json +8 -8
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/mqtt.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/oled.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/output.schema.json +8 -8
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/pca9685.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/pcf8575.schema.json +4 -4
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/remote_devices.schema.json +26 -26
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/sensor.schema.json +2 -2
- {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/web.schema.json +12 -12
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/SOURCES.txt +19 -16
- boneio-1.2.0.dev7/boneio/version.py +0 -2
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/LICENSE +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/MANIFEST.in +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/README.md +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/bonecli.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/cover.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/previous.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/group/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/group/output_group.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/detectors.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/event.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/basic.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/mcp.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/pca.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/pcf.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/const.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/package.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/discovery.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/events/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/events/bus.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/covers.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/display.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/remote.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/local.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/base.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/wled.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/base.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/system.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/state/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/state/manager.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/host_data.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/monitor.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/filter.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/logger.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/util.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/exceptions.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/interlock.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/cli.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/client.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/utils.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/actions.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/events.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/files.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/logs.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/mqtt.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/state.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/runner.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/filters.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/id.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/app.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/index-CyjBlAI7.css +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/config.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/system.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/services/logs.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/web_server.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/pyproject.toml +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/setup.cfg +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/setup.py +0 -0
- {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/tests/test_py313_compatibility.py +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""Configuration migration system for boneIO.
|
|
2
|
+
|
|
3
|
+
Migrations are versioned and executed once per config file.
|
|
4
|
+
The config_version field in the boneio section tracks which
|
|
5
|
+
migrations have already been applied.
|
|
6
|
+
|
|
7
|
+
Each migration module registers itself via the @register_migration decorator.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import re
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from typing import Callable
|
|
16
|
+
|
|
17
|
+
_LOGGER = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
# Current schema version — bump this when adding new migrations
|
|
20
|
+
CURRENT_SCHEMA_VERSION = 2
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class Migration:
|
|
25
|
+
"""A single config migration step.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
version: Target schema version after this migration.
|
|
29
|
+
name: Human-readable description.
|
|
30
|
+
migrate_dict: Transforms the raw config dict in memory.
|
|
31
|
+
migrate_file: Optional — persists changes directly in the YAML file.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
version: int
|
|
35
|
+
name: str
|
|
36
|
+
migrate_dict: Callable[[dict], dict]
|
|
37
|
+
migrate_file: Callable[[str], None] | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Global ordered registry of migrations
|
|
41
|
+
_MIGRATIONS: list[Migration] = []
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def register_migration(
|
|
45
|
+
version: int,
|
|
46
|
+
name: str,
|
|
47
|
+
migrate_file: Callable[[str], None] | None = None,
|
|
48
|
+
) -> Callable:
|
|
49
|
+
"""Decorator to register a dict migration function.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
version: Target schema version after this migration.
|
|
53
|
+
name: Human-readable description.
|
|
54
|
+
migrate_file: Optional file-level persistence function.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Decorator that registers the function and returns it unchanged.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def decorator(fn: Callable[[dict], dict]) -> Callable[[dict], dict]:
|
|
61
|
+
_MIGRATIONS.append(
|
|
62
|
+
Migration(
|
|
63
|
+
version=version,
|
|
64
|
+
name=name,
|
|
65
|
+
migrate_dict=fn,
|
|
66
|
+
migrate_file=migrate_file,
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
# Keep sorted by version
|
|
70
|
+
_MIGRATIONS.sort(key=lambda m: m.version)
|
|
71
|
+
return fn
|
|
72
|
+
|
|
73
|
+
return decorator
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_config_version(doc: dict) -> int:
|
|
77
|
+
"""Read config_version from the boneio section (default 0).
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
doc: Raw config dict.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Current config version number.
|
|
84
|
+
"""
|
|
85
|
+
boneio = doc.get("boneio")
|
|
86
|
+
if isinstance(boneio, dict):
|
|
87
|
+
return boneio.get("config_version", 0)
|
|
88
|
+
return 0
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def run_migrations(
|
|
92
|
+
doc: dict,
|
|
93
|
+
from_version: int | None = None,
|
|
94
|
+
config_file: str | None = None,
|
|
95
|
+
) -> tuple[dict, int]:
|
|
96
|
+
"""Run all pending migrations on a config dict.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
doc: Raw config dict (will be mutated in place).
|
|
100
|
+
from_version: Override starting version (default: read from doc).
|
|
101
|
+
config_file: If provided, also persist file-level migrations
|
|
102
|
+
and update config_version in the file.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Tuple of (migrated dict, new config_version).
|
|
106
|
+
"""
|
|
107
|
+
if from_version is None:
|
|
108
|
+
from_version = get_config_version(doc)
|
|
109
|
+
|
|
110
|
+
if from_version >= CURRENT_SCHEMA_VERSION:
|
|
111
|
+
return doc, from_version
|
|
112
|
+
|
|
113
|
+
applied: list[str] = []
|
|
114
|
+
|
|
115
|
+
for migration in _MIGRATIONS:
|
|
116
|
+
if migration.version <= from_version:
|
|
117
|
+
continue
|
|
118
|
+
if migration.version > CURRENT_SCHEMA_VERSION:
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
_LOGGER.info(
|
|
122
|
+
"Running migration v%d: %s", migration.version, migration.name
|
|
123
|
+
)
|
|
124
|
+
doc = migration.migrate_dict(doc)
|
|
125
|
+
applied.append(f"v{migration.version}: {migration.name}")
|
|
126
|
+
|
|
127
|
+
# Persist file-level changes
|
|
128
|
+
if config_file and migration.migrate_file:
|
|
129
|
+
try:
|
|
130
|
+
migration.migrate_file(config_file)
|
|
131
|
+
except Exception as e:
|
|
132
|
+
_LOGGER.error(
|
|
133
|
+
"Failed to persist migration v%d to file: %s",
|
|
134
|
+
migration.version,
|
|
135
|
+
e,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
new_version = CURRENT_SCHEMA_VERSION
|
|
139
|
+
|
|
140
|
+
if applied:
|
|
141
|
+
_LOGGER.info("Migrations applied: %s", ", ".join(applied))
|
|
142
|
+
|
|
143
|
+
# Persist config_version to file
|
|
144
|
+
if config_file:
|
|
145
|
+
try:
|
|
146
|
+
_persist_config_version(config_file, new_version)
|
|
147
|
+
except Exception as e:
|
|
148
|
+
_LOGGER.error("Failed to persist config_version: %s", e)
|
|
149
|
+
|
|
150
|
+
# Update in-memory dict
|
|
151
|
+
if "boneio" not in doc or not isinstance(doc.get("boneio"), dict):
|
|
152
|
+
doc["boneio"] = {}
|
|
153
|
+
doc["boneio"]["config_version"] = new_version
|
|
154
|
+
|
|
155
|
+
return doc, new_version
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _persist_config_version(config_file: str, version: int) -> None:
|
|
159
|
+
"""Write config_version into the boneio section of the YAML file.
|
|
160
|
+
|
|
161
|
+
Handles three cases:
|
|
162
|
+
- config_version already exists → update value
|
|
163
|
+
- boneio section exists but no config_version → insert after 'boneio:'
|
|
164
|
+
- no boneio section → skip (shouldn't happen in practice)
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
config_file: Path to the YAML config file.
|
|
168
|
+
version: New config_version value to write.
|
|
169
|
+
"""
|
|
170
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
171
|
+
lines = f.readlines()
|
|
172
|
+
|
|
173
|
+
updated_lines: list[str] = []
|
|
174
|
+
version_written = False
|
|
175
|
+
in_boneio = False
|
|
176
|
+
boneio_indent = -1
|
|
177
|
+
config_version_re = re.compile(r"^(\s*)config_version:\s*\d+")
|
|
178
|
+
|
|
179
|
+
for i, line in enumerate(lines):
|
|
180
|
+
stripped = line.rstrip()
|
|
181
|
+
|
|
182
|
+
# Check if we're entering the boneio section
|
|
183
|
+
if stripped == "boneio:" or stripped.startswith("boneio:"):
|
|
184
|
+
in_boneio = True
|
|
185
|
+
boneio_indent = len(line) - len(line.lstrip())
|
|
186
|
+
updated_lines.append(line)
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
if in_boneio and not version_written:
|
|
190
|
+
line_indent = len(line) - len(line.lstrip())
|
|
191
|
+
|
|
192
|
+
# Existing config_version line — replace it
|
|
193
|
+
if config_version_re.match(line):
|
|
194
|
+
indent = " " * (boneio_indent + 2)
|
|
195
|
+
updated_lines.append(f"{indent}config_version: {version}\n")
|
|
196
|
+
version_written = True
|
|
197
|
+
continue
|
|
198
|
+
|
|
199
|
+
# Left the boneio section (non-empty line at same or lower indent)
|
|
200
|
+
if stripped and line_indent <= boneio_indent and i > 0:
|
|
201
|
+
# Insert config_version before leaving
|
|
202
|
+
indent = " " * (boneio_indent + 2)
|
|
203
|
+
updated_lines.append(f"{indent}config_version: {version}\n")
|
|
204
|
+
version_written = True
|
|
205
|
+
in_boneio = False
|
|
206
|
+
|
|
207
|
+
updated_lines.append(line)
|
|
208
|
+
|
|
209
|
+
# If boneio was the last section and we haven't written yet
|
|
210
|
+
if in_boneio and not version_written:
|
|
211
|
+
indent = " " * (boneio_indent + 2)
|
|
212
|
+
updated_lines.append(f"{indent}config_version: {version}\n")
|
|
213
|
+
|
|
214
|
+
with open(config_file, "w", encoding="utf-8") as f:
|
|
215
|
+
f.writelines(updated_lines)
|
|
216
|
+
|
|
217
|
+
_LOGGER.info("Persisted config_version: %d to %s", version, config_file)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# Import migration modules to trigger registration
|
|
221
|
+
from boneio.core.config.migrations import v1_proxy_port # noqa: E402, F401
|
|
222
|
+
from boneio.core.config.migrations import v2_transition # noqa: E402, F401
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Migration v1: Rename deprecated config fields.
|
|
2
|
+
|
|
3
|
+
- web.nginx_proxy_port -> web.proxy_port
|
|
4
|
+
- modbus_sensors -> modbus_devices (warning only, no rename)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
from boneio.core.config.migrations import register_migration
|
|
13
|
+
|
|
14
|
+
_LOGGER = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _persist_proxy_port(config_file: str) -> None:
|
|
18
|
+
"""Replace nginx_proxy_port with proxy_port in the YAML file.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
config_file: Path to the YAML config file.
|
|
22
|
+
"""
|
|
23
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
24
|
+
lines = f.readlines()
|
|
25
|
+
|
|
26
|
+
updated = False
|
|
27
|
+
updated_lines: list[str] = []
|
|
28
|
+
for line in lines:
|
|
29
|
+
if "nginx_proxy_port:" in line:
|
|
30
|
+
indent = len(line) - len(line.lstrip())
|
|
31
|
+
value_part = line.split("nginx_proxy_port:", 1)[1]
|
|
32
|
+
new_line = " " * indent + "proxy_port:" + value_part
|
|
33
|
+
updated_lines.append(new_line)
|
|
34
|
+
updated = True
|
|
35
|
+
_LOGGER.info(
|
|
36
|
+
"Replaced in config file: %s -> %s",
|
|
37
|
+
line.rstrip(),
|
|
38
|
+
new_line.rstrip(),
|
|
39
|
+
)
|
|
40
|
+
else:
|
|
41
|
+
updated_lines.append(line)
|
|
42
|
+
|
|
43
|
+
if updated:
|
|
44
|
+
with open(config_file, "w", encoding="utf-8") as f:
|
|
45
|
+
f.writelines(updated_lines)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@register_migration(
|
|
49
|
+
version=1,
|
|
50
|
+
name="nginx_proxy_port -> proxy_port, modbus_sensors deprecation",
|
|
51
|
+
migrate_file=_persist_proxy_port,
|
|
52
|
+
)
|
|
53
|
+
def migrate(doc: dict) -> dict:
|
|
54
|
+
"""Migrate web.nginx_proxy_port to web.proxy_port and warn about modbus_sensors.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
doc: Raw config dict.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Migrated config dict.
|
|
61
|
+
"""
|
|
62
|
+
# web.nginx_proxy_port -> web.proxy_port
|
|
63
|
+
if "web" in doc and isinstance(doc["web"], dict):
|
|
64
|
+
if "nginx_proxy_port" in doc["web"]:
|
|
65
|
+
_LOGGER.info("Migrating 'web.nginx_proxy_port' to 'web.proxy_port'")
|
|
66
|
+
doc["web"]["proxy_port"] = doc["web"].pop("nginx_proxy_port")
|
|
67
|
+
|
|
68
|
+
# modbus_sensors -> modbus_devices (warning only)
|
|
69
|
+
if "modbus_sensors" in doc:
|
|
70
|
+
_LOGGER.warning(
|
|
71
|
+
"Modbus sensors are renamed to modbus_devices. "
|
|
72
|
+
"Please update your config."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return doc
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Migration v2: Convert transition field from float to timeperiod string.
|
|
2
|
+
|
|
3
|
+
Before: transition: 2 (bare number, interpreted as seconds)
|
|
4
|
+
After: transition: 2s (timeperiod string with unit)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
from boneio.core.config.migrations import register_migration
|
|
13
|
+
|
|
14
|
+
_LOGGER = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _persist_transition(config_file: str) -> None:
|
|
18
|
+
"""Replace bare-number transition values with timeperiod strings in YAML file.
|
|
19
|
+
|
|
20
|
+
Matches lines like ``transition: 2`` or ``transition: 0.5`` and appends ``s``.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
config_file: Path to the YAML config file.
|
|
24
|
+
"""
|
|
25
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
26
|
+
lines = f.readlines()
|
|
27
|
+
|
|
28
|
+
updated = False
|
|
29
|
+
updated_lines: list[str] = []
|
|
30
|
+
transition_re = re.compile(r"^(\s*transition:\s*)(\d+(?:\.\d+)?)\s*$")
|
|
31
|
+
|
|
32
|
+
for line in lines:
|
|
33
|
+
m = transition_re.match(line)
|
|
34
|
+
if m:
|
|
35
|
+
new_line = f"{m.group(1)}{m.group(2)}s\n"
|
|
36
|
+
updated_lines.append(new_line)
|
|
37
|
+
updated = True
|
|
38
|
+
_LOGGER.info(
|
|
39
|
+
"Replaced in config file: %s -> %s",
|
|
40
|
+
line.rstrip(),
|
|
41
|
+
new_line.rstrip(),
|
|
42
|
+
)
|
|
43
|
+
else:
|
|
44
|
+
updated_lines.append(line)
|
|
45
|
+
|
|
46
|
+
if updated:
|
|
47
|
+
with open(config_file, "w", encoding="utf-8") as f:
|
|
48
|
+
f.writelines(updated_lines)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@register_migration(
|
|
52
|
+
version=2,
|
|
53
|
+
name="transition: float -> timeperiod string",
|
|
54
|
+
migrate_file=_persist_transition,
|
|
55
|
+
)
|
|
56
|
+
def migrate(doc: dict) -> dict:
|
|
57
|
+
"""Convert transition fields from int/float to timeperiod strings.
|
|
58
|
+
|
|
59
|
+
Walks through event and binary_sensor sections, finding action
|
|
60
|
+
definitions with a bare numeric transition value and converting
|
|
61
|
+
them to strings with an ``s`` suffix.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
doc: Raw config dict.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Migrated config dict.
|
|
68
|
+
"""
|
|
69
|
+
for section_name in ("event", "binary_sensor"):
|
|
70
|
+
for item in doc.get(section_name, []) or []:
|
|
71
|
+
if not isinstance(item, dict):
|
|
72
|
+
continue
|
|
73
|
+
actions = item.get("actions")
|
|
74
|
+
if not isinstance(actions, dict):
|
|
75
|
+
continue
|
|
76
|
+
for _click_type, action_list in actions.items():
|
|
77
|
+
if not isinstance(action_list, list):
|
|
78
|
+
continue
|
|
79
|
+
for action_def in action_list:
|
|
80
|
+
if not isinstance(action_def, dict):
|
|
81
|
+
continue
|
|
82
|
+
if "transition" in action_def:
|
|
83
|
+
val = action_def["transition"]
|
|
84
|
+
if isinstance(val, (int, float)):
|
|
85
|
+
new_val = f"{val}s"
|
|
86
|
+
_LOGGER.info(
|
|
87
|
+
"Migrating transition: %s -> '%s' in %s action",
|
|
88
|
+
val,
|
|
89
|
+
new_val,
|
|
90
|
+
section_name,
|
|
91
|
+
)
|
|
92
|
+
action_def["transition"] = new_val
|
|
93
|
+
|
|
94
|
+
return doc
|
|
@@ -724,84 +724,32 @@ class CustomValidator(Validator):
|
|
|
724
724
|
|
|
725
725
|
|
|
726
726
|
|
|
727
|
-
def
|
|
728
|
-
"""
|
|
729
|
-
|
|
730
|
-
|
|
727
|
+
def _run_config_migrations(doc: dict, config_file: str | None = None) -> tuple[dict, bool]:
|
|
728
|
+
"""Run versioned config migrations via the migrations module.
|
|
729
|
+
|
|
730
|
+
Migrations are only applied if config_version < CURRENT_SCHEMA_VERSION.
|
|
731
|
+
When config_file is provided, changes are persisted to the YAML file
|
|
732
|
+
and config_version is updated so migrations won't run again.
|
|
733
|
+
|
|
731
734
|
Args:
|
|
732
|
-
doc:
|
|
733
|
-
config_file: Optional path to config file for
|
|
734
|
-
|
|
735
|
+
doc: Raw configuration dict (mutated in place).
|
|
736
|
+
config_file: Optional path to config file for persistence.
|
|
737
|
+
|
|
735
738
|
Returns:
|
|
736
|
-
Tuple of (migrated
|
|
739
|
+
Tuple of (migrated dict, whether any migrations were applied).
|
|
737
740
|
"""
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
if "nginx_proxy_port" in doc["web"]:
|
|
744
|
-
_LOGGER.info("Migrating 'web.nginx_proxy_port' to 'web.proxy_port'")
|
|
745
|
-
doc["web"]["proxy_port"] = doc["web"].pop("nginx_proxy_port")
|
|
746
|
-
migrated = True
|
|
747
|
-
migrations_applied.append("web.nginx_proxy_port -> web.proxy_port")
|
|
748
|
-
|
|
749
|
-
# Migration: modbus_sensors -> modbus_devices
|
|
750
|
-
if "modbus_sensors" in doc:
|
|
751
|
-
_LOGGER.warning("Modbus sensors are renamed to modbus_devices. Please update your config.")
|
|
752
|
-
migrated = True
|
|
753
|
-
migrations_applied.append("modbus_sensors -> modbus_devices")
|
|
754
|
-
|
|
755
|
-
if migrated:
|
|
756
|
-
_LOGGER.info("Configuration migrations applied: %s", ", ".join(migrations_applied))
|
|
757
|
-
|
|
758
|
-
# Persist migrations to config file if provided
|
|
759
|
-
if config_file:
|
|
760
|
-
try:
|
|
761
|
-
_persist_migrations(config_file, doc, migrations_applied)
|
|
762
|
-
except Exception as e:
|
|
763
|
-
_LOGGER.error("Failed to persist migrations to config file: %s", e)
|
|
764
|
-
|
|
765
|
-
return doc, migrated
|
|
741
|
+
from boneio.core.config.migrations import (
|
|
742
|
+
CURRENT_SCHEMA_VERSION,
|
|
743
|
+
get_config_version,
|
|
744
|
+
run_migrations,
|
|
745
|
+
)
|
|
766
746
|
|
|
747
|
+
current_version = get_config_version(doc)
|
|
748
|
+
if current_version >= CURRENT_SCHEMA_VERSION:
|
|
749
|
+
return doc, False
|
|
767
750
|
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
Persist migrated configuration back to YAML file.
|
|
771
|
-
|
|
772
|
-
Args:
|
|
773
|
-
config_file: Path to config file
|
|
774
|
-
migrated_doc: Migrated configuration document
|
|
775
|
-
migrations: List of applied migrations for logging
|
|
776
|
-
"""
|
|
777
|
-
import os
|
|
778
|
-
from pathlib import Path
|
|
779
|
-
|
|
780
|
-
config_dir = Path(config_file).parent
|
|
781
|
-
|
|
782
|
-
# Read original file to preserve structure and !include directives
|
|
783
|
-
with open(config_file, 'r', encoding='utf-8') as f:
|
|
784
|
-
original_lines = f.readlines()
|
|
785
|
-
|
|
786
|
-
# For web.nginx_proxy_port -> web.proxy_port migration
|
|
787
|
-
if any("nginx_proxy_port" in m for m in migrations):
|
|
788
|
-
updated_lines = []
|
|
789
|
-
for line in original_lines:
|
|
790
|
-
# Replace nginx_proxy_port with proxy_port in the line
|
|
791
|
-
if "nginx_proxy_port:" in line:
|
|
792
|
-
indent = len(line) - len(line.lstrip())
|
|
793
|
-
value_part = line.split("nginx_proxy_port:", 1)[1]
|
|
794
|
-
updated_line = " " * indent + "proxy_port:" + value_part
|
|
795
|
-
updated_lines.append(updated_line)
|
|
796
|
-
_LOGGER.info("Replaced line in config file: %s -> %s", line.rstrip(), updated_line.rstrip())
|
|
797
|
-
else:
|
|
798
|
-
updated_lines.append(line)
|
|
799
|
-
|
|
800
|
-
# Write back to file
|
|
801
|
-
with open(config_file, 'w', encoding='utf-8') as f:
|
|
802
|
-
f.writelines(updated_lines)
|
|
803
|
-
|
|
804
|
-
_LOGGER.info("Persisted migrations to config file: %s", config_file)
|
|
751
|
+
doc, new_version = run_migrations(doc, current_version, config_file)
|
|
752
|
+
return doc, new_version > current_version
|
|
805
753
|
|
|
806
754
|
|
|
807
755
|
def load_config_from_string(config_str: str) -> dict:
|
|
@@ -809,11 +757,12 @@ def load_config_from_string(config_str: str) -> dict:
|
|
|
809
757
|
schema = _get_schema() # Use cached schema instead of loading every time
|
|
810
758
|
v = CustomValidator(schema, purge_unknown=True)
|
|
811
759
|
|
|
812
|
-
#
|
|
813
|
-
|
|
760
|
+
# Apply migrations on raw dict BEFORE normalization/coercion
|
|
761
|
+
# (coerce: positive_time_period would fail on bare int like transition: 2)
|
|
762
|
+
migrated_str, _ = _run_config_migrations(config_str, config_file=None)
|
|
814
763
|
|
|
815
|
-
#
|
|
816
|
-
doc
|
|
764
|
+
# Normalize the document (applies coercion rules)
|
|
765
|
+
doc = v.normalized(migrated_str, always_return_document=True) # type: ignore[attr-defined]
|
|
817
766
|
|
|
818
767
|
# Then merge board config
|
|
819
768
|
merged_doc = merge_board_config(doc)
|
|
@@ -847,11 +796,12 @@ def load_config_from_file(config_file: str):
|
|
|
847
796
|
schema = _get_schema()
|
|
848
797
|
v = CustomValidator(schema, purge_unknown=True)
|
|
849
798
|
|
|
850
|
-
#
|
|
851
|
-
|
|
799
|
+
# Apply migrations on raw dict BEFORE normalization/coercion
|
|
800
|
+
# (coerce: positive_time_period would fail on bare int like transition: 2)
|
|
801
|
+
config_yaml, migrations_applied = _run_config_migrations(config_yaml, config_file=config_file)
|
|
852
802
|
|
|
853
|
-
#
|
|
854
|
-
doc
|
|
803
|
+
# Normalize the document (applies coercion rules)
|
|
804
|
+
doc = v.normalized(config_yaml, always_return_document=True) # type: ignore[attr-defined]
|
|
855
805
|
|
|
856
806
|
# Then merge board config
|
|
857
807
|
merged_doc = merge_board_config(doc)
|
|
@@ -566,6 +566,13 @@ class Manager:
|
|
|
566
566
|
val = action_definition.get(opt_key)
|
|
567
567
|
if val is not None:
|
|
568
568
|
parsed_action[opt_key] = val
|
|
569
|
+
# Convert transition TimePeriod to float seconds
|
|
570
|
+
if "transition" in parsed_action:
|
|
571
|
+
t_val = parsed_action["transition"]
|
|
572
|
+
if hasattr(t_val, "total_in_seconds"):
|
|
573
|
+
parsed_action["transition"] = t_val.total_in_seconds
|
|
574
|
+
elif not isinstance(t_val, (int, float)):
|
|
575
|
+
parsed_action["transition"] = 0.0
|
|
569
576
|
_copy_long_press_meta(parsed_action, action_definition)
|
|
570
577
|
parsed_actions[click_type].append(parsed_action)
|
|
571
578
|
continue
|
|
@@ -739,6 +746,20 @@ class Manager:
|
|
|
739
746
|
output_id = action_definition.get("output_id")
|
|
740
747
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
741
748
|
|
|
749
|
+
# Clamp transition to repeat_interval to avoid overlapping animations
|
|
750
|
+
transition_val = action_definition.get("transition")
|
|
751
|
+
if transition_val and action_definition.get("repeat"):
|
|
752
|
+
repeat_interval = action_definition.get("repeat_interval")
|
|
753
|
+
if repeat_interval:
|
|
754
|
+
ri_seconds = repeat_interval.total_in_seconds if hasattr(repeat_interval, "total_in_seconds") else repeat_interval / 1000.0
|
|
755
|
+
if transition_val > ri_seconds:
|
|
756
|
+
_LOGGER.debug(
|
|
757
|
+
"Clamping transition %.3fs to repeat_interval %.3fs",
|
|
758
|
+
transition_val, ri_seconds,
|
|
759
|
+
)
|
|
760
|
+
transition_val = ri_seconds
|
|
761
|
+
action_definition = {**action_definition, "transition": transition_val}
|
|
762
|
+
|
|
742
763
|
if action_output == "CYCLE_COLOR":
|
|
743
764
|
await self.remote_devices.cycle_color(
|
|
744
765
|
device_id=remote_device_id,
|