boneio 1.2.0.dev8__tar.gz → 1.2.0.dev10__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.dev8/boneio.egg-info → boneio-1.2.0.dev10}/PKG-INFO +1 -1
- boneio-1.2.0.dev10/boneio/core/config/migrations/__init__.py +222 -0
- boneio-1.2.0.dev10/boneio/core/config/migrations/v1_proxy_port.py +75 -0
- boneio-1.2.0.dev10/boneio/core/config/migrations/v2_transition.py +94 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/yaml_util.py +31 -81
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/update.py +6 -3
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/schema.yaml +6 -0
- boneio-1.2.0.dev10/boneio/version.py +2 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/app.py +19 -2
- {boneio-1.2.0.dev8/boneio/webui/schema → boneio-1.2.0.dev10/boneio/webui/frontend-dist/schem}/adc.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +10 -10
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/boneio.schema.json +11 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/config.schema.json +97 -88
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/cover.schema.json +8 -8
- {boneio-1.2.0.dev8/boneio/webui/schema → boneio-1.2.0.dev10/boneio/webui/frontend-dist/schem}/event.schema.json +36 -36
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/ina219.schema.json +2 -2
- {boneio-1.2.0.dev8/boneio/webui/schema → boneio-1.2.0.dev10/boneio/webui/frontend-dist/schem}/lm75.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +6 -6
- {boneio-1.2.0.dev8/boneio/webui/schema → boneio-1.2.0.dev10/boneio/webui/frontend-dist/schem}/oled.schema.json +2 -2
- {boneio-1.2.0.dev8/boneio/webui/schema → boneio-1.2.0.dev10/boneio/webui/frontend-dist/schem}/output.schema.json +4 -4
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/pca9685.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +4 -4
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/sensor.schema.json +2 -2
- {boneio-1.2.0.dev8/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev10/boneio/webui/schema}/adc.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/binary_sensor.schema.json +10 -10
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/boneio.schema.json +11 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/config.schema.json +97 -88
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/cover.schema.json +8 -8
- {boneio-1.2.0.dev8/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev10/boneio/webui/schema}/event.schema.json +36 -36
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/ina219.schema.json +2 -2
- {boneio-1.2.0.dev8/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev10/boneio/webui/schema}/lm75.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/mcp23017.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/mcp9808.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/modbus_devices.schema.json +6 -6
- {boneio-1.2.0.dev8/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev10/boneio/webui/schema}/oled.schema.json +2 -2
- {boneio-1.2.0.dev8/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev10/boneio/webui/schema}/output.schema.json +4 -4
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/pca9685.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/pcf8575.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/remote_devices.schema.json +4 -4
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/sensor.schema.json +2 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio.egg-info/SOURCES.txt +3 -0
- boneio-1.2.0.dev8/boneio/version.py +0 -2
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/LICENSE +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/MANIFEST.in +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/README.md +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/bonecli.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/cover/cover.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/cover/previous.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/group/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/group/output_group.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/input/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/input/detectors.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/input/event.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/output/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/output/basic.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/output/mcp.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/output/pca.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/output/pcf.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/const.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/package.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/discovery.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/events/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/events/bus.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/covers.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/display.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/manager.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/remote.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/local.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/remote/base.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/remote/wled.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/sensor/base.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/sensor/system.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/state/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/state/manager.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/system/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/system/host_data.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/system/monitor.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/filter.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/logger.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/core/utils/util.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/exceptions.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/integration/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/integration/interlock.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/cli.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/client.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/modbus/utils.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/actions.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/events.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/files.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/logs.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/mqtt.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/models/state.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/runner.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/actions.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/filters.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/id.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/cssMode-xo2BdOZm.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/freemarker2-CpF78_ZW.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/handlebars-CTxt7dmO.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/html-BU5yZ3BK.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/htmlMode-Bi7QBmdE.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/index-CyjBlAI7.css +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/index-TnEo7N0a.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/javascript-BTvyG1P5.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/jsonMode-HE9dW4cx.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/liquid-BxuGpv1s.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/mdx-C04Q98IR.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/python-CKNUIQdp.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/razor-UrUJyAuF.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/tsMode-AhPw7VFe.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/typescript-CLXQgPoF.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/xml-DZmKn2me.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/yaml-CGKDqmHX.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/index.html +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/schem/web.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/sw.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/config.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/system.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/routes/update.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/services/logs.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/web_server.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/pyproject.toml +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/setup.cfg +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/setup.py +0 -0
- {boneio-1.2.0.dev8 → boneio-1.2.0.dev10}/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)
|
|
@@ -585,8 +585,10 @@ class UpdateManager(AsyncUpdater):
|
|
|
585
585
|
target_version: Version being installed (None if not updating)
|
|
586
586
|
progress: Update progress percentage (0 = not updating, 1-100 = in progress)
|
|
587
587
|
"""
|
|
588
|
-
# HA
|
|
589
|
-
|
|
588
|
+
# HA update entity progress:
|
|
589
|
+
# - in_progress: boolean (true = updating, false = idle)
|
|
590
|
+
# - update_percentage: float 0-100 (shows progress bar in HA UI)
|
|
591
|
+
is_updating = progress > 0
|
|
590
592
|
|
|
591
593
|
state_payload = {
|
|
592
594
|
"installed_version": current_version,
|
|
@@ -595,7 +597,8 @@ class UpdateManager(AsyncUpdater):
|
|
|
595
597
|
"release_url": self._last_check_result.get("release_url", "") if self._last_check_result else "",
|
|
596
598
|
"release_summary": self._last_check_result.get("release_notes", "") if self._last_check_result else "",
|
|
597
599
|
"entity_picture": "http://boneio.eu/logo_fb_circle.png",
|
|
598
|
-
"in_progress":
|
|
600
|
+
"in_progress": is_updating,
|
|
601
|
+
"update_percentage": float(progress) if is_updating else None,
|
|
599
602
|
}
|
|
600
603
|
|
|
601
604
|
topic_prefix = self._manager._config_helper.topic_prefix
|
|
@@ -1325,6 +1325,12 @@ boneio:
|
|
|
1325
1325
|
meta:
|
|
1326
1326
|
label: "https://boneio.eu/docs/black/0.9.x-dev/configuration/boneio \n BoneIO configuration section. It's new section for boneIO Black. It enables you to use predefined device types. For now only 0.7 and 0.8 devices are supported."
|
|
1327
1327
|
schema:
|
|
1328
|
+
config_version:
|
|
1329
|
+
type: integer
|
|
1330
|
+
required: False
|
|
1331
|
+
default: 0
|
|
1332
|
+
meta:
|
|
1333
|
+
label: Schema version for config migrations. Managed automatically.
|
|
1328
1334
|
name:
|
|
1329
1335
|
type: string
|
|
1330
1336
|
required: True
|
|
@@ -696,6 +696,7 @@ if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
|
|
|
696
696
|
return JSONResponse(
|
|
697
697
|
content=manifest,
|
|
698
698
|
media_type="application/manifest+json",
|
|
699
|
+
headers={"Cache-Control": "no-store, no-cache, must-revalidate"},
|
|
699
700
|
)
|
|
700
701
|
|
|
701
702
|
@app.get("/sw.js")
|
|
@@ -704,11 +705,17 @@ if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
|
|
|
704
705
|
return FileResponse(
|
|
705
706
|
f"{FRONTEND_DIR}/sw.js",
|
|
706
707
|
media_type="application/javascript",
|
|
708
|
+
headers={"Cache-Control": "no-store, no-cache, must-revalidate"},
|
|
707
709
|
)
|
|
708
710
|
|
|
709
711
|
@app.get("/{filename:path}")
|
|
710
712
|
async def serve_react_app(filename: str):
|
|
711
|
-
"""Serve static files from frontend-dist, fallback to index.html for SPA routing.
|
|
713
|
+
"""Serve static files from frontend-dist, fallback to index.html for SPA routing.
|
|
714
|
+
|
|
715
|
+
Hashed assets (in /assets/) are immutable and cached long-term.
|
|
716
|
+
index.html (SPA fallback) is never cached to prevent stale versions
|
|
717
|
+
being served through Cloudflare Tunnel or other caching proxies.
|
|
718
|
+
"""
|
|
712
719
|
file_path = (FRONTEND_DIR / filename).resolve()
|
|
713
720
|
if (
|
|
714
721
|
filename
|
|
@@ -716,8 +723,18 @@ if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
|
|
|
716
723
|
and file_path.exists()
|
|
717
724
|
and file_path.is_file()
|
|
718
725
|
):
|
|
726
|
+
# Hashed assets can be cached forever
|
|
727
|
+
if filename.startswith("assets/"):
|
|
728
|
+
return FileResponse(
|
|
729
|
+
str(file_path),
|
|
730
|
+
headers={"Cache-Control": "public, max-age=31536000, immutable"},
|
|
731
|
+
)
|
|
719
732
|
return FileResponse(str(file_path))
|
|
720
|
-
|
|
733
|
+
# SPA fallback — never cache index.html
|
|
734
|
+
return FileResponse(
|
|
735
|
+
f"{FRONTEND_DIR}/index.html",
|
|
736
|
+
headers={"Cache-Control": "no-store, no-cache, must-revalidate"},
|
|
737
|
+
)
|
|
721
738
|
else:
|
|
722
739
|
_LOGGER.warning(
|
|
723
740
|
f"Frontend not found at {FRONTEND_DIR}. "
|