boneio 1.5.0.dev8__tar.gz → 1.5.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.5.0.dev8/boneio.egg-info → boneio-1.5.0.dev10}/PKG-INFO +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/time_based.py +3 -2
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/venetian.py +4 -3
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/config_helper.py +57 -19
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/discovery.py +2 -2
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/covers.py +9 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/inputs.py +13 -4
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/irrigation.py +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/manager.py +18 -27
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/update.py +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/mqtt.py +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/__init__.py +2 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/timeperiod.py +67 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/homeassistant.py +9 -9
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/lox_template.py +2 -2
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/boneio-edge-temp.json +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/base.py +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/runner.py +2 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/schema.yaml +13 -0
- boneio-1.5.0.dev10/boneio/version.py +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/BindingMatrix-DAAjBzzR.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ConfigEditor-iXr5kaqI.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EditItemDialog-tVR2WDXW.js +66 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityCard-CVch9a7x.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityGrid-DrIgH2RW.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/InputsView-DcezF20P.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/LogViewer-BPb6YMmQ.js +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ModbusView-DfHlmQ4U.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/NodeRedView-CR3ZGtc9.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/OutputsView-nljQGE7z.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +11 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SensorView-B2oFg70N.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +10 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SudoPasswordDialog-CYEaTaL9.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SystemState-D7PUoRdp.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/TemplatesView-BDccDcwP.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/Tools-DAFDHpzm.js +14 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/UISettings-L_Uh0sL_.js +38 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/dialog-Bj5BD-Tr.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/gi-AjEh3QsP.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/index-CDsuwPez.js +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +2 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D5oIDT5t.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/select-CZiAfWrl.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/tabs-box-BQJbfr3G.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +13 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/utils-C6puLrXz.js +1 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +11 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/index.html +5 -3
- {boneio-1.5.0.dev8/boneio/webui → boneio-1.5.0.dev10/boneio/webui/frontend-dist}/schema/boneio.schema.json +8 -0
- {boneio-1.5.0.dev8/boneio/webui → boneio-1.5.0.dev10/boneio/webui/frontend-dist}/schema/config.schema.json +8 -0
- boneio-1.5.0.dev10/boneio/webui/frontend-dist/sw.js +1 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/middleware/auth.py +1 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/config.py +342 -7
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/dev_fake_device.py +2 -2
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/sensors.py +41 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/system.py +60 -3
- {boneio-1.5.0.dev8/boneio/webui/frontend-dist → boneio-1.5.0.dev10/boneio/webui}/schema/boneio.schema.json +8 -0
- {boneio-1.5.0.dev8/boneio/webui/frontend-dist → boneio-1.5.0.dev10/boneio/webui}/schema/config.schema.json +8 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/SOURCES.txt +35 -5
- boneio-1.5.0.dev8/boneio/version.py +0 -2
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/ConfigEditor-D4xZU9og.js +0 -1
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/aiWizardPrompt-DFwp2Xa8.js +0 -2
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/index-BpK_lX6d.js +0 -140
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/index-zdMDZxqr.css +0 -2
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/vendor-pmGLHP0_.js +0 -55
- boneio-1.5.0.dev8/boneio/webui/frontend-dist/sw.js +0 -1
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/LICENSE +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/MANIFEST.in +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/README.md +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/bonecli.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/cover.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/group/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/group/output_group.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/detectors.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/event.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/basic.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/mcp.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/pca.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/pcf.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/remote.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/const.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/package.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/events/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/events/bus.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/display.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/remote.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/local.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/base.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/can.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/wled.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/base.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/system.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/state/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/state/manager.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/host_data.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/monitor.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/filter.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/logger.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/util.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/exceptions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/client.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/node.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/interlock.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/actions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/runner.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/cli.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/client.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/utils.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/actions.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/events.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/files.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/logs.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/mqtt.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/state.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/condition.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/filters.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/id.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/action_validation.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/app.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/can.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/update.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/services/logs.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/web_server.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/pyproject.toml +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/setup.cfg +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/setup.py +0 -0
- {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/tests/test_py313_compatibility.py +0 -0
|
@@ -12,6 +12,7 @@ from boneio.components.output import BasicOutput
|
|
|
12
12
|
from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
|
|
13
13
|
from boneio.core.events import EventBus
|
|
14
14
|
from boneio.core.utils import TimePeriod
|
|
15
|
+
from boneio.core.utils.timeperiod import ensure_time_period
|
|
15
16
|
|
|
16
17
|
_LOGGER = logging.getLogger(__name__)
|
|
17
18
|
DEFAULT_RESTORED_STATE = {"position": 100}
|
|
@@ -151,6 +152,6 @@ class TimeBasedCover(BaseCover):
|
|
|
151
152
|
Keys: open_time, close_time
|
|
152
153
|
"""
|
|
153
154
|
if "open_time" in config:
|
|
154
|
-
self._open_time = config["open_time"].total_milliseconds
|
|
155
|
+
self._open_time = ensure_time_period(config["open_time"]).total_milliseconds
|
|
155
156
|
if "close_time" in config:
|
|
156
|
-
self._close_time = config["close_time"].total_milliseconds
|
|
157
|
+
self._close_time = ensure_time_period(config["close_time"]).total_milliseconds
|
|
@@ -8,6 +8,7 @@ import time
|
|
|
8
8
|
from boneio.components.cover.cover import BaseCover, BaseVenetianCoverABC
|
|
9
9
|
from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
|
|
10
10
|
from boneio.core.utils import TimePeriod
|
|
11
|
+
from boneio.core.utils.timeperiod import ensure_time_period
|
|
11
12
|
from boneio.models import PositionDict, SavedPositionDict
|
|
12
13
|
|
|
13
14
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -362,11 +363,11 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
362
363
|
Keys: open_time, close_time, tilt_duration, tilt_restore_after_close
|
|
363
364
|
"""
|
|
364
365
|
if "open_time" in config:
|
|
365
|
-
self._open_time = config["open_time"].total_milliseconds
|
|
366
|
+
self._open_time = ensure_time_period(config["open_time"]).total_milliseconds
|
|
366
367
|
if "close_time" in config:
|
|
367
|
-
self._close_time = config["close_time"].total_milliseconds
|
|
368
|
+
self._close_time = ensure_time_period(config["close_time"]).total_milliseconds
|
|
368
369
|
if "tilt_duration" in config and config["tilt_duration"]:
|
|
369
|
-
self._tilt_duration = config["tilt_duration"].total_milliseconds
|
|
370
|
+
self._tilt_duration = ensure_time_period(config["tilt_duration"]).total_milliseconds
|
|
370
371
|
if "tilt_restore_after_close" in config:
|
|
371
372
|
self._tilt_restore_after_close = bool(config["tilt_restore_after_close"])
|
|
372
373
|
|
|
@@ -6,6 +6,7 @@ from __future__ import annotations
|
|
|
6
6
|
import logging
|
|
7
7
|
from _collections_abc import dict_values
|
|
8
8
|
from typing import TYPE_CHECKING, Any
|
|
9
|
+
import time as _time
|
|
9
10
|
|
|
10
11
|
if TYPE_CHECKING:
|
|
11
12
|
from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
|
|
@@ -28,7 +29,6 @@ from boneio.const import (
|
|
|
28
29
|
VALVE,
|
|
29
30
|
)
|
|
30
31
|
from boneio.core.system import get_serial_from_mac
|
|
31
|
-
from boneio.core.utils.util import sanitize_mqtt_topic
|
|
32
32
|
|
|
33
33
|
_LOGGER = logging.getLogger(__name__)
|
|
34
34
|
|
|
@@ -53,21 +53,29 @@ class ConfigHelper:
|
|
|
53
53
|
pwa_name: str | None = None,
|
|
54
54
|
ha_child_devices: bool = False,
|
|
55
55
|
ha_child_devices_naming: str = "default",
|
|
56
|
+
serial_override: str | None = None,
|
|
56
57
|
):
|
|
57
58
|
self._name = name
|
|
58
59
|
self._version = version
|
|
59
60
|
|
|
60
|
-
# Generate serial number from MAC - always required for
|
|
61
|
-
self.
|
|
61
|
+
# Generate real serial number from MAC - always required for physical identification
|
|
62
|
+
self._real_serial = get_serial_from_mac(network_info or {})
|
|
62
63
|
|
|
63
|
-
#
|
|
64
|
+
# If override is provided, use it as effective serial, otherwise use real MAC-based serial
|
|
65
|
+
if serial_override:
|
|
66
|
+
self._serial_no = serial_override
|
|
67
|
+
_LOGGER.warning("Serial override active: effective=%s, real=%s", serial_override, self._real_serial)
|
|
68
|
+
else:
|
|
69
|
+
self._serial_no = self._real_serial
|
|
70
|
+
|
|
71
|
+
# Build fixed topic prefix: boneio/blk_{serial} using effective serial
|
|
64
72
|
# This is no longer configurable - always uses this format
|
|
65
73
|
if self._serial_no:
|
|
66
74
|
self._topic_prefix = f"boneio/{self._serial_no}"
|
|
67
75
|
else:
|
|
68
76
|
# Fallback if MAC not available (should rarely happen)
|
|
69
77
|
self._topic_prefix = "boneio/blk_unknown"
|
|
70
|
-
_LOGGER.warning("Could not determine serial number
|
|
78
|
+
_LOGGER.warning("Could not determine serial number, using fallback topic prefix")
|
|
71
79
|
|
|
72
80
|
# PWA short name for Android home screen (max 12 chars)
|
|
73
81
|
if pwa_name:
|
|
@@ -165,7 +173,8 @@ class ConfigHelper:
|
|
|
165
173
|
|
|
166
174
|
@property
|
|
167
175
|
def serial_number(self) -> str:
|
|
168
|
-
|
|
176
|
+
"""Get effective device serial number (e.g., 'blk_abc123')."""
|
|
177
|
+
return self._serial_no or "blk_unknown"
|
|
169
178
|
|
|
170
179
|
@property
|
|
171
180
|
def proxy_port(self) -> int | None:
|
|
@@ -186,9 +195,16 @@ class ConfigHelper:
|
|
|
186
195
|
return self._topic_prefix
|
|
187
196
|
|
|
188
197
|
@property
|
|
189
|
-
def
|
|
190
|
-
"""
|
|
191
|
-
return self.
|
|
198
|
+
def real_serial(self) -> str:
|
|
199
|
+
"""Real serial from MAC — for HA device_info and UI display."""
|
|
200
|
+
return self._real_serial or "blk_unknown"
|
|
201
|
+
|
|
202
|
+
@property
|
|
203
|
+
def serial_override(self) -> str | None:
|
|
204
|
+
"""Return override value if active, None otherwise."""
|
|
205
|
+
if self._serial_no != self._real_serial:
|
|
206
|
+
return self._serial_no
|
|
207
|
+
return None
|
|
192
208
|
|
|
193
209
|
@property
|
|
194
210
|
def pwa_name(self) -> str:
|
|
@@ -390,16 +406,20 @@ class ConfigHelper:
|
|
|
390
406
|
return self._config_cache
|
|
391
407
|
|
|
392
408
|
def reload_config(self) -> dict[str, Any]:
|
|
393
|
-
"""Reload configuration from file
|
|
409
|
+
"""Reload configuration from YAML file (fast path for hot-reload).
|
|
394
410
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
(~
|
|
398
|
-
cache rebuild — it's independent.
|
|
411
|
+
Uses load_yaml_file() + merge_board_config() to read the config
|
|
412
|
+
directly from YAML without running Cerberus validation. This is
|
|
413
|
+
much faster (~0.5-1s) than the full validation path (~20s on BB).
|
|
399
414
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
415
|
+
Full Cerberus validation is only needed at:
|
|
416
|
+
- Application startup (via load_config_from_file)
|
|
417
|
+
- Background disk cache rebuild (debounced after config changes)
|
|
418
|
+
- Monaco YAML editor validation (load_config_from_string)
|
|
419
|
+
|
|
420
|
+
NOTE: Migrations are not applied here — they run at startup and
|
|
421
|
+
are idempotent (version-gated). Config saved via the UI always
|
|
422
|
+
has current schema version.
|
|
403
423
|
|
|
404
424
|
Returns:
|
|
405
425
|
dict: Reloaded configuration dictionary
|
|
@@ -407,8 +427,26 @@ class ConfigHelper:
|
|
|
407
427
|
Raises:
|
|
408
428
|
ValueError: If config_file_path is not set
|
|
409
429
|
"""
|
|
410
|
-
|
|
411
|
-
|
|
430
|
+
|
|
431
|
+
if self._config_file_path is None:
|
|
432
|
+
raise ValueError("config_file_path not set in ConfigHelper")
|
|
433
|
+
|
|
434
|
+
_t0 = _time.monotonic()
|
|
435
|
+
_LOGGER.info("Fast-reloading config from: %s", self._config_file_path)
|
|
436
|
+
|
|
437
|
+
from boneio.core.config.yaml_util import load_yaml_file, merge_board_config
|
|
438
|
+
|
|
439
|
+
config_yaml = load_yaml_file(self._config_file_path)
|
|
440
|
+
if config_yaml is None:
|
|
441
|
+
raise ValueError(f"Failed to load config from: {self._config_file_path}")
|
|
442
|
+
|
|
443
|
+
merged = merge_board_config(config_yaml)
|
|
444
|
+
self._config_cache = merged
|
|
445
|
+
|
|
446
|
+
elapsed = _time.monotonic() - _t0
|
|
447
|
+
_LOGGER.info("Fast config reload completed in %.2fs", elapsed)
|
|
448
|
+
|
|
449
|
+
return merged
|
|
412
450
|
|
|
413
451
|
def get_section(self, section_name: str, force_reload: bool = False) -> Any:
|
|
414
452
|
"""Get a specific configuration section.
|
|
@@ -62,9 +62,9 @@ class BlackDiscoveryPublisher:
|
|
|
62
62
|
|
|
63
63
|
config_helper = self._manager._config_helper
|
|
64
64
|
device_info = {
|
|
65
|
-
"id": config_helper.
|
|
65
|
+
"id": config_helper.serial_number,
|
|
66
66
|
"name": config_helper.name,
|
|
67
|
-
"serial_number": config_helper.
|
|
67
|
+
"serial_number": config_helper.serial_number,
|
|
68
68
|
"type": "black",
|
|
69
69
|
"firmware": __version__,
|
|
70
70
|
"topic_prefix": config_helper.topic_prefix,
|
|
@@ -14,7 +14,7 @@ import logging
|
|
|
14
14
|
from typing import TYPE_CHECKING, Any
|
|
15
15
|
|
|
16
16
|
from boneio.const import COVER, DEVICE_CLASS, ID, NAME, RESTORE_STATE, SHOW_HA, cover_actions, filter_cover_extra_data
|
|
17
|
-
from boneio.core.utils import TimePeriod, strip_accents
|
|
17
|
+
from boneio.core.utils import TimePeriod, ensure_time_period, strip_accents
|
|
18
18
|
from boneio.exceptions import CoverConfigurationException
|
|
19
19
|
from boneio.integration import ha_cover_availabilty_message
|
|
20
20
|
from boneio.integration.homeassistant import ha_cover_with_tilt_availabilty_message
|
|
@@ -230,6 +230,14 @@ class CoverManager:
|
|
|
230
230
|
|
|
231
231
|
platform = config.get("platform", "time_based")
|
|
232
232
|
|
|
233
|
+
# Normalize time period fields — during hot-reload YAML values may
|
|
234
|
+
# arrive as raw strings (e.g. "5s") instead of TimePeriod objects.
|
|
235
|
+
for time_key in ("open_time", "close_time", "actuator_activation_duration"):
|
|
236
|
+
if time_key in config and config[time_key] is not None:
|
|
237
|
+
config[time_key] = ensure_time_period(config[time_key])
|
|
238
|
+
if tilt_duration is not None and not isinstance(tilt_duration, TimePeriod):
|
|
239
|
+
tilt_duration = ensure_time_period(tilt_duration)
|
|
240
|
+
|
|
233
241
|
def state_save(value: dict[str, float]):
|
|
234
242
|
if config[RESTORE_STATE]:
|
|
235
243
|
self._manager._state_manager.save_attribute(
|
|
@@ -255,13 +255,17 @@ class InputManager:
|
|
|
255
255
|
|
|
256
256
|
# Reload: update existing input's actions and name
|
|
257
257
|
if existing_input:
|
|
258
|
-
# Check if HA-relevant fields changed (name, area, mqtt_sequences)
|
|
258
|
+
# Check if HA-relevant fields changed (name, area, device_class, mqtt_sequences)
|
|
259
259
|
old_name = existing_input._name if hasattr(existing_input, "_name") else None
|
|
260
260
|
old_area = getattr(existing_input, "area", None)
|
|
261
|
+
old_device_class = getattr(existing_input, "_device_class", None)
|
|
262
|
+
new_device_class = gpio.get(DEVICE_CLASS)
|
|
261
263
|
old_mqtt_sequences = existing_input.mqtt_sequences if hasattr(existing_input, "mqtt_sequences") else {}
|
|
262
264
|
new_mqtt_sequences = gpio.get("mqtt_sequences", {})
|
|
263
265
|
ha_fields_changed = (
|
|
264
|
-
(old_name != name) or (old_area != area)
|
|
266
|
+
(old_name != name) or (old_area != area)
|
|
267
|
+
or (old_device_class != new_device_class)
|
|
268
|
+
or (old_mqtt_sequences != new_mqtt_sequences)
|
|
265
269
|
)
|
|
266
270
|
|
|
267
271
|
# Update actions (always - this is internal to the controller)
|
|
@@ -383,10 +387,15 @@ class InputManager:
|
|
|
383
387
|
|
|
384
388
|
# Reload: update existing input's actions and name
|
|
385
389
|
if existing_input:
|
|
386
|
-
# Check if HA-relevant fields changed (name, area)
|
|
390
|
+
# Check if HA-relevant fields changed (name, area, device_class)
|
|
387
391
|
old_name = existing_input._name if hasattr(existing_input, "_name") else None
|
|
388
392
|
old_area = getattr(existing_input, "area", None)
|
|
389
|
-
|
|
393
|
+
old_device_class = getattr(existing_input, "_device_class", None)
|
|
394
|
+
new_device_class = gpio.get(DEVICE_CLASS)
|
|
395
|
+
ha_fields_changed = (
|
|
396
|
+
(old_name != name) or (old_area != area)
|
|
397
|
+
or (old_device_class != new_device_class)
|
|
398
|
+
)
|
|
390
399
|
|
|
391
400
|
# Update actions (always - this is internal to the controller)
|
|
392
401
|
existing_input.set_actions(actions=actions)
|
|
@@ -309,7 +309,7 @@ class IrrigationManager:
|
|
|
309
309
|
Sends empty payload to discovery topics to remove entities from HA.
|
|
310
310
|
"""
|
|
311
311
|
cfg = self._manager.config_helper
|
|
312
|
-
serial = cfg.
|
|
312
|
+
serial = cfg.serial_number
|
|
313
313
|
|
|
314
314
|
# Build list of discovery IDs to remove
|
|
315
315
|
discovery_ids: list[tuple[str, str]] = [
|
|
@@ -52,6 +52,7 @@ from boneio.core.manager.templates import TemplateManager
|
|
|
52
52
|
from boneio.core.manager.update import UpdateManager
|
|
53
53
|
from boneio.core.messaging import MessageBus
|
|
54
54
|
from boneio.core.state import StateManager
|
|
55
|
+
from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
|
|
55
56
|
from boneio.hardware.i2c.bus import SMBus2I2C
|
|
56
57
|
from boneio.migrations import MigrationRunner, MigrationStatus
|
|
57
58
|
|
|
@@ -243,7 +244,7 @@ class Manager:
|
|
|
243
244
|
self.remote_devices = RemoteDeviceManager(
|
|
244
245
|
message_bus=message_bus,
|
|
245
246
|
remote_devices_config=remote_devices,
|
|
246
|
-
own_serial=config_helper.
|
|
247
|
+
own_serial=config_helper.serial_number,
|
|
247
248
|
name=self.config_helper.name,
|
|
248
249
|
)
|
|
249
250
|
|
|
@@ -625,7 +626,7 @@ class Manager:
|
|
|
625
626
|
ha_type: Home Assistant entity type (sensor, light, cover …).
|
|
626
627
|
payload: Ready-to-publish discovery payload dict.
|
|
627
628
|
"""
|
|
628
|
-
topic = f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.
|
|
629
|
+
topic = f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_number}/{id}/config"
|
|
629
630
|
_LOGGER.debug("Sending HA discovery for %s entity %s.", ha_type, id)
|
|
630
631
|
self._config_helper.add_autodiscovery_msg(topic=topic, ha_type=ha_type, payload=payload)
|
|
631
632
|
self.send_message(topic=topic, payload=payload, retain=True)
|
|
@@ -657,23 +658,19 @@ class Manager:
|
|
|
657
658
|
"""Copy long press meta fields (duration thresholds, repeat), delay, and conditions to parsed action."""
|
|
658
659
|
for key in ("min_duration", "max_duration"):
|
|
659
660
|
if action_definition.get(key) is not None:
|
|
660
|
-
parsed_action[key] = action_definition[key]
|
|
661
|
+
parsed_action[key] = parse_time_to_ms(action_definition[key], None)
|
|
661
662
|
if action_definition.get("repeat"):
|
|
662
663
|
parsed_action["repeat"] = True
|
|
663
664
|
ri = action_definition.get("repeat_interval", 1000)
|
|
664
|
-
#
|
|
665
|
-
|
|
666
|
-
parsed_action["repeat_interval"] = ri.total_milliseconds
|
|
667
|
-
else:
|
|
668
|
-
parsed_action["repeat_interval"] = ri
|
|
665
|
+
# Safely convert TimePeriod, string ("1s"), or number to ms
|
|
666
|
+
parsed_action["repeat_interval"] = parse_time_to_ms(ri, 1000)
|
|
669
667
|
# Copy delay fields for cancelable timer support
|
|
670
668
|
delay_val = action_definition.get("delay")
|
|
671
669
|
if delay_val is not None:
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
_LOGGER.debug("Action has delay: %.1fs", parsed_action.get("delay", 0))
|
|
670
|
+
# Safely convert TimePeriod, string ("5s"), or number to seconds
|
|
671
|
+
parsed_delay = parse_time_to_seconds(delay_val, 0.0)
|
|
672
|
+
parsed_action["delay"] = parsed_delay
|
|
673
|
+
_LOGGER.debug("Action has delay: %.1fs", parsed_delay)
|
|
677
674
|
cancel_on = action_definition.get("delay_cancel_on")
|
|
678
675
|
if cancel_on:
|
|
679
676
|
parsed_action["delay_cancel_on"] = cancel_on
|
|
@@ -818,13 +815,11 @@ class Manager:
|
|
|
818
815
|
val = action_definition.get(opt_key)
|
|
819
816
|
if val is not None:
|
|
820
817
|
parsed_action[opt_key] = val
|
|
821
|
-
# Convert transition TimePeriod to float seconds
|
|
818
|
+
# Convert transition TimePeriod/string to float seconds
|
|
822
819
|
if "transition" in parsed_action:
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
elif not isinstance(t_val, (int, float)):
|
|
827
|
-
parsed_action["transition"] = 0.0
|
|
820
|
+
parsed_action["transition"] = parse_time_to_seconds(
|
|
821
|
+
parsed_action["transition"], 0.0
|
|
822
|
+
)
|
|
828
823
|
_copy_long_press_meta(parsed_action, action_definition)
|
|
829
824
|
parsed_actions[click_type].append(parsed_action)
|
|
830
825
|
continue
|
|
@@ -1089,11 +1084,7 @@ class Manager:
|
|
|
1089
1084
|
if transition_val and action_definition.get("repeat"):
|
|
1090
1085
|
repeat_interval = action_definition.get("repeat_interval")
|
|
1091
1086
|
if repeat_interval:
|
|
1092
|
-
ri_seconds = (
|
|
1093
|
-
repeat_interval.total_in_seconds
|
|
1094
|
-
if hasattr(repeat_interval, "total_in_seconds")
|
|
1095
|
-
else repeat_interval / 1000.0
|
|
1096
|
-
)
|
|
1087
|
+
ri_seconds = parse_time_to_seconds(repeat_interval, 1.0)
|
|
1097
1088
|
if transition_val > ri_seconds:
|
|
1098
1089
|
_LOGGER.debug(
|
|
1099
1090
|
"Clamping transition %.3fs to repeat_interval %.3fs",
|
|
@@ -1590,9 +1581,9 @@ class Manager:
|
|
|
1590
1581
|
_LOGGER.info("Starting config reload")
|
|
1591
1582
|
|
|
1592
1583
|
# Reload config cache in ConfigHelper
|
|
1593
|
-
#
|
|
1594
|
-
# full Cerberus validation (~20s)
|
|
1595
|
-
#
|
|
1584
|
+
# Uses fast path: load_yaml_file() + merge_board_config() (~0.5-1s)
|
|
1585
|
+
# instead of full Cerberus validation (~20s). Run in thread executor
|
|
1586
|
+
# because it still does file I/O (reading YAML files from disk).
|
|
1596
1587
|
try:
|
|
1597
1588
|
config = await asyncio.to_thread(self._config_helper.reload_config)
|
|
1598
1589
|
# Update areas mapping from reloaded config
|
|
@@ -737,7 +737,7 @@ class UpdateManager(AsyncUpdater):
|
|
|
737
737
|
# --- Remove legacy event entity discovery (if any) ---
|
|
738
738
|
old_event_topic = (
|
|
739
739
|
f"{config.ha_discovery_prefix}/event/"
|
|
740
|
-
f"{config.
|
|
740
|
+
f"{config.serial_number}/migration_alert/config"
|
|
741
741
|
)
|
|
742
742
|
self._manager.send_message(topic=old_event_topic, payload="", retain=True)
|
|
743
743
|
_LOGGER.debug("Removed legacy migration_alert event entity discovery")
|
|
@@ -59,7 +59,7 @@ class MQTTClient(MessageBus):
|
|
|
59
59
|
self._mqtt_energy_listeners: dict[str, Callable[[str, str], Awaitable[None]]] = {}
|
|
60
60
|
self._discovery_topics = (
|
|
61
61
|
[
|
|
62
|
-
f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.
|
|
62
|
+
f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_number}/#"
|
|
63
63
|
for ha_type in self._config_helper.ha_types
|
|
64
64
|
]
|
|
65
65
|
if self._config_helper.ha_discovery
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
from boneio.core.utils.async_updater import AsyncUpdater
|
|
4
4
|
from boneio.core.utils.filter import Filter
|
|
5
5
|
from boneio.core.utils.logger import configure_logger
|
|
6
|
-
from boneio.core.utils.timeperiod import TimePeriod
|
|
6
|
+
from boneio.core.utils.timeperiod import TimePeriod, ensure_time_period
|
|
7
7
|
from boneio.core.utils.util import callback, open_json, strip_accents
|
|
8
8
|
|
|
9
9
|
__all__ = [
|
|
10
10
|
"Filter",
|
|
11
11
|
"TimePeriod",
|
|
12
|
+
"ensure_time_period",
|
|
12
13
|
"callback",
|
|
13
14
|
"configure_logger",
|
|
14
15
|
"strip_accents",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import math
|
|
3
|
+
import re
|
|
3
4
|
from collections import OrderedDict
|
|
4
5
|
from datetime import timedelta
|
|
5
6
|
from typing import Any
|
|
@@ -238,3 +239,69 @@ def parse_time_to_ms(value: Any, default: int | None) -> int | None:
|
|
|
238
239
|
except (ValueError, TypeError):
|
|
239
240
|
_LOGGER.warning("Invalid time value: %s, using default %s ms", value, default)
|
|
240
241
|
return default
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
_TIME_UNIT_MAP = {
|
|
245
|
+
"us": "microseconds",
|
|
246
|
+
"microseconds": "microseconds",
|
|
247
|
+
"ms": "milliseconds",
|
|
248
|
+
"milliseconds": "milliseconds",
|
|
249
|
+
"s": "seconds",
|
|
250
|
+
"sec": "seconds",
|
|
251
|
+
"secs": "seconds",
|
|
252
|
+
"seconds": "seconds",
|
|
253
|
+
"min": "minutes",
|
|
254
|
+
"mins": "minutes",
|
|
255
|
+
"minutes": "minutes",
|
|
256
|
+
"h": "hours",
|
|
257
|
+
"hours": "hours",
|
|
258
|
+
"d": "days",
|
|
259
|
+
"days": "days",
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
_TIME_PERIOD_RE = re.compile(r"^([-+]?[0-9]*\.?[0-9]+)\s*([a-zA-Z]+)$")
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def ensure_time_period(value: "TimePeriod | str | int | float") -> "TimePeriod":
|
|
267
|
+
"""Ensure a value is a TimePeriod object.
|
|
268
|
+
|
|
269
|
+
Converts strings like '5s', '1000ms', '2min' and raw numeric values
|
|
270
|
+
(treated as seconds) to TimePeriod. Passes through existing TimePeriod
|
|
271
|
+
objects unchanged. This is the defensive layer for hot-reload scenarios
|
|
272
|
+
where YAML values may arrive as raw strings instead of pre-parsed
|
|
273
|
+
TimePeriod objects.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
value: A TimePeriod, time string with unit, or numeric seconds.
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
A TimePeriod instance.
|
|
280
|
+
|
|
281
|
+
Raises:
|
|
282
|
+
ValueError: If the string format is invalid or the unit is unknown.
|
|
283
|
+
"""
|
|
284
|
+
if isinstance(value, TimePeriod):
|
|
285
|
+
return value
|
|
286
|
+
|
|
287
|
+
if isinstance(value, (int, float)):
|
|
288
|
+
return TimePeriod(seconds=float(value))
|
|
289
|
+
|
|
290
|
+
if not isinstance(value, str):
|
|
291
|
+
raise ValueError(f"Cannot convert {type(value).__name__} to TimePeriod: {value!r}")
|
|
292
|
+
|
|
293
|
+
value = value.strip()
|
|
294
|
+
if not value:
|
|
295
|
+
raise ValueError("Empty string cannot be converted to TimePeriod")
|
|
296
|
+
|
|
297
|
+
match = _TIME_PERIOD_RE.match(value)
|
|
298
|
+
if match is None:
|
|
299
|
+
raise ValueError(f"Invalid time period format: {value!r}")
|
|
300
|
+
|
|
301
|
+
num_str, unit = match.group(1), match.group(2).lower()
|
|
302
|
+
kwarg = _TIME_UNIT_MAP.get(unit)
|
|
303
|
+
if kwarg is None:
|
|
304
|
+
raise ValueError(f"Unknown time unit '{unit}' in: {value!r}")
|
|
305
|
+
|
|
306
|
+
return TimePeriod(**{kwarg: float(num_str)})
|
|
307
|
+
|
|
@@ -123,9 +123,9 @@ def ha_availabilty_message(
|
|
|
123
123
|
"identifiers": [child_identifier],
|
|
124
124
|
"manufacturer": manufacturer,
|
|
125
125
|
"model": model,
|
|
126
|
-
"model_id": config_helper.
|
|
126
|
+
"model_id": config_helper.real_serial,
|
|
127
127
|
"name": child_device_name,
|
|
128
|
-
"serial_number": config_helper.
|
|
128
|
+
"serial_number": config_helper.real_serial,
|
|
129
129
|
"sw_version": __version__,
|
|
130
130
|
"via_device": topic, # Link to main BoneIO device
|
|
131
131
|
**web_url_dict,
|
|
@@ -144,9 +144,9 @@ def ha_availabilty_message(
|
|
|
144
144
|
"identifiers": [f"{topic}_{area}"], # Use area ID for consistent grouping
|
|
145
145
|
"manufacturer": manufacturer,
|
|
146
146
|
"model": model,
|
|
147
|
-
"model_id": config_helper.
|
|
147
|
+
"model_id": config_helper.real_serial,
|
|
148
148
|
"name": sub_device_name,
|
|
149
|
-
"serial_number": config_helper.
|
|
149
|
+
"serial_number": config_helper.real_serial,
|
|
150
150
|
"sw_version": __version__,
|
|
151
151
|
"via_device": topic, # Link to main BoneIO device
|
|
152
152
|
"suggested_area": area_name, # Use area ID (lowercase) - HA converts area names to lowercase
|
|
@@ -158,9 +158,9 @@ def ha_availabilty_message(
|
|
|
158
158
|
"identifiers": [topic],
|
|
159
159
|
"manufacturer": manufacturer,
|
|
160
160
|
"model": model,
|
|
161
|
-
"model_id": config_helper.
|
|
161
|
+
"model_id": config_helper.real_serial,
|
|
162
162
|
"name": device_name,
|
|
163
|
-
"serial_number": config_helper.
|
|
163
|
+
"serial_number": config_helper.real_serial,
|
|
164
164
|
"sw_version": __version__,
|
|
165
165
|
**web_url_dict
|
|
166
166
|
}
|
|
@@ -297,9 +297,9 @@ def _ha_irrigation_device(
|
|
|
297
297
|
"identifiers": [f"{topic}_{IRRIGATION}_{ctrl_id}"],
|
|
298
298
|
"manufacturer": "boneIO",
|
|
299
299
|
"model": model,
|
|
300
|
-
"model_id": config_helper.
|
|
300
|
+
"model_id": config_helper.real_serial,
|
|
301
301
|
"name": ctrl_name,
|
|
302
|
-
"serial_number": config_helper.
|
|
302
|
+
"serial_number": config_helper.real_serial,
|
|
303
303
|
"sw_version": __version__,
|
|
304
304
|
"via_device": topic,
|
|
305
305
|
}
|
|
@@ -880,7 +880,7 @@ def modbus_polling_switch_message(
|
|
|
880
880
|
|
|
881
881
|
discovery_topic = (
|
|
882
882
|
f"{config_helper.ha_discovery_prefix}/switch/"
|
|
883
|
-
f"{config_helper.
|
|
883
|
+
f"{config_helper.serial_number}/{entity_id}/config"
|
|
884
884
|
)
|
|
885
885
|
|
|
886
886
|
area_name = config_helper.get_area_name(area) if area else None
|
|
@@ -52,7 +52,7 @@ def generate_lox_template(manager: Manager) -> str:
|
|
|
52
52
|
Returns:
|
|
53
53
|
XML string ready to be saved as a .xml template file.
|
|
54
54
|
"""
|
|
55
|
-
serial = manager.config_helper.
|
|
55
|
+
serial = manager.config_helper.serial_number or "boneio"
|
|
56
56
|
device_name = manager.config_helper.name or serial
|
|
57
57
|
|
|
58
58
|
# Get Lox UDP config (host/ports) from running config
|
|
@@ -275,7 +275,7 @@ def generate_lox_summary(manager: Manager) -> dict[str, Any]:
|
|
|
275
275
|
Returns:
|
|
276
276
|
Dictionary with 'commands' and 'status' sections.
|
|
277
277
|
"""
|
|
278
|
-
serial = manager.config_helper.
|
|
278
|
+
serial = manager.config_helper.serial_number or "boneio"
|
|
279
279
|
device_name = manager.config_helper.name or serial
|
|
280
280
|
|
|
281
281
|
commands: list[dict[str, str]] = []
|
|
@@ -60,7 +60,7 @@ class BaseEntity(Filter):
|
|
|
60
60
|
self._timestamp = time.time()
|
|
61
61
|
self._id = f"{self._parent[ID]}_{self._decoded_name_low.replace('_', '')}"
|
|
62
62
|
self._topic = (
|
|
63
|
-
f"{self._config_helper.ha_discovery_prefix}/{self._entity_type}/{self._config_helper.
|
|
63
|
+
f"{self._config_helper.ha_discovery_prefix}/{self._entity_type}/{self._config_helper.serial_number}"
|
|
64
64
|
f"/{self._id}/config"
|
|
65
65
|
)
|
|
66
66
|
|
|
@@ -170,6 +170,7 @@ async def async_run(
|
|
|
170
170
|
pwa_name=web_config.get("cloud", {}).get("pwa_name"),
|
|
171
171
|
ha_child_devices=main_config.get("ha_child_devices", False),
|
|
172
172
|
ha_child_devices_naming=main_config.get("ha_child_devices_naming", "default"),
|
|
173
|
+
serial_override=main_config.get("serial_override"),
|
|
173
174
|
)
|
|
174
175
|
|
|
175
176
|
# Load areas configuration
|
|
@@ -358,7 +359,7 @@ async def async_run(
|
|
|
358
359
|
cloud_reg = None
|
|
359
360
|
if _config_helper.cloud_registration:
|
|
360
361
|
local_ip = network_state.get("ip", "")
|
|
361
|
-
serial = _config_helper.
|
|
362
|
+
serial = _config_helper.serial_number
|
|
362
363
|
if local_ip and serial:
|
|
363
364
|
cloud_reg = CloudRegistration(
|
|
364
365
|
serial_number=serial,
|
|
@@ -2255,3 +2255,16 @@ boneio:
|
|
|
2255
2255
|
- default: Entity name only (e.g., "OUT 17"). May cause duplicates if multiple boneIO devices share output names.
|
|
2256
2256
|
- device_name: Adds boneIO device name prefix (e.g., "boneIO Black - OUT 17").
|
|
2257
2257
|
- device_name_area: Adds device name and area (e.g., "boneIO Black - Living Room - OUT 17"). Falls back to device_name if no area is assigned.
|
|
2258
|
+
serial_override:
|
|
2259
|
+
required: False
|
|
2260
|
+
type: string
|
|
2261
|
+
nullable: True
|
|
2262
|
+
regex: '^blk[a-f0-9]{6}$'
|
|
2263
|
+
meta:
|
|
2264
|
+
label: Serial number override
|
|
2265
|
+
description: |
|
|
2266
|
+
Override the auto-detected serial number (based on MAC address).
|
|
2267
|
+
Use this when restoring config from a different device (e.g., RMA replacement).
|
|
2268
|
+
Format: blk followed by 6 hex characters (e.g., blk8c7df0).
|
|
2269
|
+
WARNING: Two devices with the same serial on the same MQTT broker will conflict!
|
|
2270
|
+
|