boneio 1.3.0.dev19__tar.gz → 1.3.1.dev1__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.3.0.dev19/boneio.egg-info → boneio-1.3.1.dev1}/PKG-INFO +1 -1
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/event.py +69 -51
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/update.py +56 -8
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/MANIFEST.sha256 +1 -1
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/runner.py +33 -13
- boneio-1.3.1.dev1/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +29 -0
- boneio-1.3.1.dev1/boneio/version.py +2 -0
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/ConfigEditor-CIjN171I.js → boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-DcU5XNy1.js +1 -1
- boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/index-BoLwm6vF.js +44 -0
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/useTranslation-BRR2hwZk.js → boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/useTranslation-Dwuk-AFr.js +2 -2
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/can.py +2 -38
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/migrations.py +10 -6
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/system.py +16 -33
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/SOURCES.txt +4 -4
- boneio-1.3.0.dev19/boneio/hardware/can/sudoers.py +0 -199
- boneio-1.3.0.dev19/boneio/version.py +0 -2
- boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/index-eaBQjHZY.js +0 -44
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/LICENSE +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/MANIFEST.in +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/README.md +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/bonecli.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/cover.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/group/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/group/output_group.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/detectors.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/basic.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/mcp.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/pca.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/pcf.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/const.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/package.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/discovery.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/events/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/events/bus.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/covers.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/display.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/manager.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/remote.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/local.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/loxone.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/base.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/can.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/wled.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/base.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/system.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/state/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/state/manager.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/host_data.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/monitor.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/filter.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/logger.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/util.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/exceptions.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/client.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/node.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/interlock.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/lox_template.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/actions.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/cli.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/client.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/utils.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/actions.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/events.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/files.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/logs.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/mqtt.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/state.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/runner.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/condition.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/filters.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/id.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/schema.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/action_validation.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/app.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/aiConfig-LL3nlemJ.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CmumVq54.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/index-C_S5rhz7.css +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/config.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/update.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/services/logs.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/web_server.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/pyproject.toml +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/setup.cfg +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/setup.py +0 -0
- {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/tests/test_py313_compatibility.py +0 -0
|
@@ -20,11 +20,11 @@ DEFAULT_SEQUENCE_WINDOW_MS = 500
|
|
|
20
20
|
|
|
21
21
|
def _to_milliseconds(value, default_ms: int) -> int:
|
|
22
22
|
"""Convert a value to milliseconds.
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
Args:
|
|
25
25
|
value: Can be int, float, TimePeriod, or None
|
|
26
26
|
default_ms: Default value in milliseconds if value is None
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
Returns:
|
|
29
29
|
Value in milliseconds as integer
|
|
30
30
|
"""
|
|
@@ -42,7 +42,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
42
42
|
|
|
43
43
|
def __init__(self, **kwargs) -> None:
|
|
44
44
|
"""Setup GPIO Event Button with multiclick support.
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
Args:
|
|
47
47
|
double_click_duration: Time window in ms to detect double click (default: 220ms)
|
|
48
48
|
long_press_duration: Time in ms to detect long press (default: 400ms)
|
|
@@ -50,51 +50,60 @@ class GpioEventButton(GpioBaseClass):
|
|
|
50
50
|
**kwargs: Additional arguments passed to GpioBaseClass
|
|
51
51
|
"""
|
|
52
52
|
super().__init__(**kwargs)
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
# Get timing values from config or use defaults, converting TimePeriod to ms
|
|
55
|
-
double_click_duration = _to_milliseconds(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
long_press_duration = _to_milliseconds(
|
|
60
|
-
kwargs.get('long_press_duration'),
|
|
61
|
-
DEFAULT_LONG_PRESS_DURATION_MS
|
|
62
|
-
)
|
|
63
|
-
sequence_window_duration = _to_milliseconds(
|
|
64
|
-
kwargs.get('sequence_window_duration'),
|
|
65
|
-
DEFAULT_SEQUENCE_WINDOW_MS
|
|
66
|
-
)
|
|
67
|
-
|
|
55
|
+
double_click_duration = _to_milliseconds(kwargs.get("double_click_duration"), DEFAULT_DOUBLE_CLICK_DURATION_MS)
|
|
56
|
+
long_press_duration = _to_milliseconds(kwargs.get("long_press_duration"), DEFAULT_LONG_PRESS_DURATION_MS)
|
|
57
|
+
sequence_window_duration = _to_milliseconds(kwargs.get("sequence_window_duration"), DEFAULT_SEQUENCE_WINDOW_MS)
|
|
58
|
+
|
|
68
59
|
# Determine which sequences are enabled based on configured actions OR mqtt_sequences
|
|
69
60
|
# A sequence is enabled if it has actions defined OR is set to publish to MQTT
|
|
70
61
|
enabled_sequences: set[str] = set()
|
|
71
|
-
sequence_types = {
|
|
72
|
-
|
|
62
|
+
sequence_types = {"double_then_long", "single_then_long", "double_then_single"}
|
|
63
|
+
|
|
73
64
|
# Check actions
|
|
74
|
-
actions = kwargs.get(
|
|
65
|
+
actions = kwargs.get("actions", {})
|
|
75
66
|
if isinstance(actions, dict):
|
|
76
67
|
for seq_type in sequence_types:
|
|
77
68
|
if seq_type in actions and actions[seq_type]:
|
|
78
69
|
enabled_sequences.add(seq_type)
|
|
79
|
-
|
|
70
|
+
|
|
80
71
|
# Check mqtt_sequences
|
|
81
|
-
mqtt_sequences = kwargs.get(
|
|
72
|
+
mqtt_sequences = kwargs.get("mqtt_sequences", {})
|
|
82
73
|
if isinstance(mqtt_sequences, dict):
|
|
83
74
|
for seq_type in sequence_types:
|
|
84
75
|
if mqtt_sequences.get(seq_type):
|
|
85
76
|
enabled_sequences.add(seq_type)
|
|
86
|
-
|
|
77
|
+
|
|
87
78
|
_LOGGER.debug("Enabled sequences for %s: %s", self._name, enabled_sequences)
|
|
88
|
-
|
|
79
|
+
|
|
89
80
|
# Get enable_triple_click setting (default: False)
|
|
90
|
-
enable_triple_click = kwargs.get(
|
|
91
|
-
|
|
81
|
+
enable_triple_click = kwargs.get("enable_triple_click", False)
|
|
82
|
+
|
|
92
83
|
# Safety timeout for long press (default: 120s)
|
|
93
|
-
max_long_press_seconds =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
84
|
+
max_long_press_seconds = (
|
|
85
|
+
_to_milliseconds(
|
|
86
|
+
kwargs.get("max_long_press_duration"),
|
|
87
|
+
120 * 1000, # 120s default
|
|
88
|
+
)
|
|
89
|
+
/ 1000.0
|
|
90
|
+
)
|
|
91
|
+
# Guard: if resolved to < 0.8s (misconfigured or zero), use default 120s
|
|
92
|
+
if max_long_press_seconds < 0.8:
|
|
93
|
+
raw = kwargs.get("max_long_press_duration")
|
|
94
|
+
if raw is not None:
|
|
95
|
+
_LOGGER.warning(
|
|
96
|
+
"max_long_press_duration for %s resolved to %.1fs (too small), using default 120s",
|
|
97
|
+
kwargs.get("name", "unknown"),
|
|
98
|
+
max_long_press_seconds,
|
|
99
|
+
)
|
|
100
|
+
max_long_press_seconds = 120.0
|
|
101
|
+
_LOGGER.debug(
|
|
102
|
+
"max_long_press_seconds for %s = %.1fs",
|
|
103
|
+
kwargs.get("name", "unknown"),
|
|
104
|
+
max_long_press_seconds,
|
|
105
|
+
)
|
|
106
|
+
|
|
98
107
|
# Create multiclick detector
|
|
99
108
|
self._detector = MultiClickDetector(
|
|
100
109
|
loop=self._loop,
|
|
@@ -110,7 +119,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
110
119
|
pin=self._pin,
|
|
111
120
|
max_long_press_seconds=max_long_press_seconds,
|
|
112
121
|
)
|
|
113
|
-
|
|
122
|
+
|
|
114
123
|
# Register with GPIO manager
|
|
115
124
|
gpio_manager = get_gpio_manager(loop=self._loop)
|
|
116
125
|
gpio_manager.add_input(
|
|
@@ -119,12 +128,12 @@ class GpioEventButton(GpioBaseClass):
|
|
|
119
128
|
detector=self._detector,
|
|
120
129
|
gpio_mode=kwargs.get("gpio_mode", "gpio"),
|
|
121
130
|
)
|
|
122
|
-
|
|
131
|
+
|
|
123
132
|
_LOGGER.debug("Configured event input %s on pin %s", self._name, self._pin)
|
|
124
133
|
|
|
125
134
|
def _on_click_detected(self, click_type: ClickTypes, duration: float | None) -> None:
|
|
126
135
|
"""Called by MultiClickDetector when a click is detected.
|
|
127
|
-
|
|
136
|
+
|
|
128
137
|
Args:
|
|
129
138
|
click_type: Type of click (SINGLE, DOUBLE, LONG)
|
|
130
139
|
duration: Duration of the press (for LONG press)
|
|
@@ -137,7 +146,7 @@ class GpioEventButton(GpioBaseClass):
|
|
|
137
146
|
click_type,
|
|
138
147
|
duration,
|
|
139
148
|
)
|
|
140
|
-
|
|
149
|
+
|
|
141
150
|
# Call the base class press_callback which handles manager callback and events
|
|
142
151
|
self.press_callback(
|
|
143
152
|
click_type=click_type,
|
|
@@ -158,10 +167,10 @@ class GpioEventButton(GpioBaseClass):
|
|
|
158
167
|
max_long_press_duration: int | float | None = None,
|
|
159
168
|
) -> None:
|
|
160
169
|
"""Update timing parameters for click detection.
|
|
161
|
-
|
|
170
|
+
|
|
162
171
|
This method allows updating timing parameters at runtime without
|
|
163
172
|
recreating the detector. Useful for config reload.
|
|
164
|
-
|
|
173
|
+
|
|
165
174
|
Args:
|
|
166
175
|
double_click_duration: Time window in ms to detect double click
|
|
167
176
|
long_press_duration: Time in ms to detect long press
|
|
@@ -174,48 +183,48 @@ class GpioEventButton(GpioBaseClass):
|
|
|
174
183
|
max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
|
|
175
184
|
"""
|
|
176
185
|
from boneio.const import CLICK_SEQUENCES
|
|
177
|
-
|
|
186
|
+
|
|
178
187
|
if double_click_duration is not None:
|
|
179
188
|
value_ms = _to_milliseconds(double_click_duration, DEFAULT_DOUBLE_CLICK_DURATION_MS)
|
|
180
189
|
self._detector._multiclick_window = value_ms / 1000.0
|
|
181
190
|
_LOGGER.debug("Updated double_click_duration to %dms for %s", value_ms, self._name)
|
|
182
|
-
|
|
191
|
+
|
|
183
192
|
if long_press_duration is not None:
|
|
184
193
|
value_ms = _to_milliseconds(long_press_duration, DEFAULT_LONG_PRESS_DURATION_MS)
|
|
185
194
|
self._detector._hold_threshold = value_ms / 1000.0
|
|
186
195
|
_LOGGER.debug("Updated long_press_duration to %dms for %s", value_ms, self._name)
|
|
187
|
-
|
|
196
|
+
|
|
188
197
|
if sequence_window_duration is not None:
|
|
189
198
|
value_ms = _to_milliseconds(sequence_window_duration, DEFAULT_SEQUENCE_WINDOW_MS)
|
|
190
199
|
self._detector._sequence_window = value_ms / 1000.0
|
|
191
200
|
_LOGGER.debug("Updated sequence_window_duration to %dms for %s", value_ms, self._name)
|
|
192
|
-
|
|
201
|
+
|
|
193
202
|
if sequence_mode is not None:
|
|
194
203
|
self._sequence_mode = sequence_mode
|
|
195
204
|
self._detector._sequence_mode = sequence_mode
|
|
196
205
|
_LOGGER.debug("Updated sequence_mode to %s for %s", sequence_mode, self._name)
|
|
197
|
-
|
|
206
|
+
|
|
198
207
|
if enable_triple_click is not None:
|
|
199
208
|
self._detector._enable_triple_click = enable_triple_click
|
|
200
209
|
_LOGGER.debug("Updated enable_triple_click to %s for %s", enable_triple_click, self._name)
|
|
201
|
-
|
|
210
|
+
|
|
202
211
|
# Update enabled sequences based on actions and mqtt_sequences
|
|
203
|
-
sequence_types = {
|
|
212
|
+
sequence_types = {"double_then_long", "single_then_long", "double_then_single"}
|
|
204
213
|
enabled_sequences: set[str] = set()
|
|
205
|
-
|
|
214
|
+
|
|
206
215
|
if actions is not None and isinstance(actions, dict):
|
|
207
216
|
for seq_type in sequence_types:
|
|
208
217
|
if seq_type in actions and actions[seq_type]:
|
|
209
218
|
enabled_sequences.add(seq_type)
|
|
210
|
-
|
|
219
|
+
|
|
211
220
|
if mqtt_sequences is not None and isinstance(mqtt_sequences, dict):
|
|
212
221
|
for seq_type in sequence_types:
|
|
213
222
|
if mqtt_sequences.get(seq_type):
|
|
214
223
|
enabled_sequences.add(seq_type)
|
|
215
|
-
|
|
224
|
+
|
|
216
225
|
if actions is not None or mqtt_sequences is not None:
|
|
217
226
|
self._detector._enabled_sequences = enabled_sequences
|
|
218
|
-
|
|
227
|
+
|
|
219
228
|
# Recompute delay_click_types
|
|
220
229
|
self._detector._delay_click_types = set()
|
|
221
230
|
if self._detector._sequence_mode == "exclusive" and enabled_sequences:
|
|
@@ -228,9 +237,18 @@ class GpioEventButton(GpioBaseClass):
|
|
|
228
237
|
|
|
229
238
|
if max_long_press_duration is not None:
|
|
230
239
|
value_ms = _to_milliseconds(max_long_press_duration, 120 * 1000)
|
|
231
|
-
|
|
232
|
-
|
|
240
|
+
value_s = value_ms / 1000.0
|
|
241
|
+
# Guard: if resolved to < 1s (misconfigured or zero), use default 120s
|
|
242
|
+
if value_s < 1.0:
|
|
243
|
+
_LOGGER.warning(
|
|
244
|
+
"max_long_press_duration for %s resolved to %.1fs (too small), using default 120s",
|
|
245
|
+
self._name,
|
|
246
|
+
value_s,
|
|
247
|
+
)
|
|
248
|
+
value_s = 120.0
|
|
249
|
+
self._detector._max_long_press_seconds = value_s
|
|
250
|
+
_LOGGER.debug("Updated max_long_press_duration to %.0fs for %s", value_s, self._name)
|
|
233
251
|
|
|
234
252
|
if long_press_mqtt_mode is not None:
|
|
235
253
|
self._long_press_mqtt_mode = long_press_mqtt_mode
|
|
236
|
-
_LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
|
|
254
|
+
_LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
|
|
@@ -12,6 +12,7 @@ import logging
|
|
|
12
12
|
import os
|
|
13
13
|
import subprocess
|
|
14
14
|
from collections.abc import Callable
|
|
15
|
+
from pathlib import Path
|
|
15
16
|
from typing import TYPE_CHECKING
|
|
16
17
|
|
|
17
18
|
from boneio.core.utils.async_updater import AsyncUpdater
|
|
@@ -19,6 +20,9 @@ from boneio.core.utils.timeperiod import TimePeriod
|
|
|
19
20
|
from boneio.version import __version__
|
|
20
21
|
from boneio.webui.services.logs import is_running_as_service
|
|
21
22
|
|
|
23
|
+
# Flag file created before restart so the new process knows it was an update
|
|
24
|
+
UPDATE_FLAG_PATH = Path("/tmp/boneio_update_in_progress")
|
|
25
|
+
|
|
22
26
|
if TYPE_CHECKING:
|
|
23
27
|
from boneio.core.manager import Manager
|
|
24
28
|
|
|
@@ -532,19 +536,27 @@ class UpdateManager(AsyncUpdater):
|
|
|
532
536
|
await _report(90, "Installation verified", f"Updated from {current_version} to {new_version}")
|
|
533
537
|
await _report(95, "Finalizing...")
|
|
534
538
|
|
|
535
|
-
#
|
|
536
|
-
|
|
539
|
+
# Keep in_progress=true as retained so HA shows "Updating"
|
|
540
|
+
# even during the restart window. The new process will clear
|
|
541
|
+
# this via _check_post_update_flag() on startup.
|
|
537
542
|
await self._publish_update_progress(
|
|
538
|
-
current_version=
|
|
539
|
-
target_version=
|
|
540
|
-
progress=
|
|
543
|
+
current_version=current_version,
|
|
544
|
+
target_version=new_version,
|
|
545
|
+
progress=95,
|
|
541
546
|
)
|
|
547
|
+
|
|
548
|
+
# Write a flag file so the new process knows to immediately
|
|
549
|
+
# publish "up to date" on startup.
|
|
550
|
+
try:
|
|
551
|
+
UPDATE_FLAG_PATH.write_text(new_version, encoding="utf-8")
|
|
552
|
+
except OSError:
|
|
553
|
+
_LOGGER.warning("Could not write update flag file at %s", UPDATE_FLAG_PATH)
|
|
554
|
+
|
|
542
555
|
if on_progress:
|
|
543
556
|
on_progress(100, "Update complete!", "Restarting service in 2 seconds...")
|
|
544
557
|
|
|
545
|
-
# Wait long enough for MQTT to drain the
|
|
546
|
-
# before killing the process.
|
|
547
|
-
# "in_progress" message persisting in the broker.
|
|
558
|
+
# Wait long enough for MQTT to drain the retained in_progress
|
|
559
|
+
# message before killing the process.
|
|
548
560
|
await asyncio.sleep(5)
|
|
549
561
|
|
|
550
562
|
_LOGGER.info("Restarting BoneIO service after update...")
|
|
@@ -664,10 +676,46 @@ class UpdateManager(AsyncUpdater):
|
|
|
664
676
|
)
|
|
665
677
|
_LOGGER.info("Subscribed to update command topic: %s", command_topic)
|
|
666
678
|
|
|
679
|
+
# If we just restarted after an update, immediately clear the
|
|
680
|
+
# retained in_progress state so HA transitions from "Updating"
|
|
681
|
+
# to "Up to date" as fast as possible.
|
|
682
|
+
await self._check_post_update_flag()
|
|
683
|
+
|
|
667
684
|
# Migration alert event entity — fires when system migrations are pending
|
|
668
685
|
await self._send_migration_event_discovery()
|
|
669
686
|
await self._fire_migration_event_if_pending()
|
|
670
687
|
|
|
688
|
+
async def _check_post_update_flag(self) -> None:
|
|
689
|
+
"""Check if we just restarted after a firmware update.
|
|
690
|
+
|
|
691
|
+
If the flag file exists, publish an immediate 'up to date' state
|
|
692
|
+
to clear the retained ``in_progress: true`` message left by the
|
|
693
|
+
previous process before it called ``os._exit()``. This minimises
|
|
694
|
+
the window in which HA shows "unavailable" for the update entity.
|
|
695
|
+
"""
|
|
696
|
+
if not UPDATE_FLAG_PATH.exists():
|
|
697
|
+
return
|
|
698
|
+
|
|
699
|
+
try:
|
|
700
|
+
new_version = UPDATE_FLAG_PATH.read_text(encoding="utf-8").strip()
|
|
701
|
+
UPDATE_FLAG_PATH.unlink(missing_ok=True)
|
|
702
|
+
except OSError as exc:
|
|
703
|
+
_LOGGER.warning("Failed to read/remove update flag: %s", exc)
|
|
704
|
+
return
|
|
705
|
+
|
|
706
|
+
_LOGGER.info(
|
|
707
|
+
"Post-update restart detected (updated to %s). "
|
|
708
|
+
"Publishing 'up to date' state to clear retained in_progress.",
|
|
709
|
+
new_version,
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
# Publish idle state with the new version
|
|
713
|
+
await self._publish_update_progress(
|
|
714
|
+
current_version=new_version,
|
|
715
|
+
target_version=None,
|
|
716
|
+
progress=0,
|
|
717
|
+
)
|
|
718
|
+
|
|
671
719
|
async def _send_migration_event_discovery(self) -> None:
|
|
672
720
|
"""Register HA event entity for system migration alerts.
|
|
673
721
|
|
|
@@ -13,7 +13,7 @@ f2ed05c6f5934a15f12571139bdc225804f67b8c83561cc39868f7b2296d2697 docker/daemon.
|
|
|
13
13
|
9d4f46cfe6df36ee786b4b08fccc0a4dbe8161b82bdcb74f61cde45869e20ff9 systemd/boneio.service
|
|
14
14
|
5abbd8e37720f31d44ad59814c7ebbcfb5ae09ef32d83682dee6479f34270a31 systemd/set-hostname-once.service
|
|
15
15
|
8eaea86c51a17c1bc7b68e9ea65a20b428577a0bc16793768f8dba575532e8ed usr-local-bin/set-hostname-once.sh
|
|
16
|
-
|
|
16
|
+
3340abd637e15bb789e20f2e7de5d95dc45d8e427689e0c62312d044cd3ad86e usr-sbin/oled_boot_splash.py
|
|
17
17
|
0537e194700c50d91295517e23bcccce9b23be740b93381dff35b510d562c6fe usr-sbin/oled_boot_splash.sh
|
|
18
18
|
700c812bcf192f8be079ae58fce45543c8f60d9a9c25ab149f8dd68786c717d7 usr-sbin/oled_msg.py
|
|
19
19
|
e07152aae00b0d020ae69a69bfe2738a5f4b8768b62639516d85bbd2d808ba0a usr-sbin/oled_msg.sh
|
|
@@ -27,7 +27,7 @@ from enum import Enum
|
|
|
27
27
|
from pathlib import Path
|
|
28
28
|
from typing import TYPE_CHECKING, Any
|
|
29
29
|
|
|
30
|
-
from boneio.migrations.actions import InstallFile, MigrationAction,
|
|
30
|
+
from boneio.migrations.actions import InstallFile, MigrationAction, render_template, sha256_of_content
|
|
31
31
|
|
|
32
32
|
if TYPE_CHECKING:
|
|
33
33
|
pass
|
|
@@ -53,6 +53,7 @@ BOOTSTRAP_INSTALL_SCRIPT = Path(__file__).parent / "bootstrap" / "install-helper
|
|
|
53
53
|
# Status enum
|
|
54
54
|
# ---------------------------------------------------------------------------
|
|
55
55
|
|
|
56
|
+
|
|
56
57
|
class MigrationStatus(str, Enum):
|
|
57
58
|
"""High-level migration subsystem status."""
|
|
58
59
|
|
|
@@ -66,6 +67,7 @@ class MigrationStatus(str, Enum):
|
|
|
66
67
|
# Migration descriptor
|
|
67
68
|
# ---------------------------------------------------------------------------
|
|
68
69
|
|
|
70
|
+
|
|
69
71
|
@dataclass
|
|
70
72
|
class MigrationInfo:
|
|
71
73
|
"""Metadata about a single versioned migration module.
|
|
@@ -94,6 +96,7 @@ class MigrationInfo:
|
|
|
94
96
|
# MigrationRunner
|
|
95
97
|
# ---------------------------------------------------------------------------
|
|
96
98
|
|
|
99
|
+
|
|
97
100
|
class MigrationRunner:
|
|
98
101
|
"""Discovers, tracks and applies boneio system migrations.
|
|
99
102
|
|
|
@@ -145,8 +148,7 @@ class MigrationRunner:
|
|
|
145
148
|
|
|
146
149
|
if not self._helper_installed():
|
|
147
150
|
_LOGGER.warning(
|
|
148
|
-
"boneio-migrate helper not found at %s. "
|
|
149
|
-
"Bootstrap required — open WebUI to install.",
|
|
151
|
+
"boneio-migrate helper not found at %s. Bootstrap required — open WebUI to install.",
|
|
150
152
|
HELPER_PATH,
|
|
151
153
|
)
|
|
152
154
|
self.bootstrap_required = True
|
|
@@ -195,13 +197,26 @@ class MigrationRunner:
|
|
|
195
197
|
self._load_applied_flags()
|
|
196
198
|
pending = self._get_pending()
|
|
197
199
|
|
|
200
|
+
# Build applied list with descriptions from discovered migrations
|
|
201
|
+
migration_by_version = {m.version: m for m in self._all_migrations}
|
|
202
|
+
applied_list = []
|
|
203
|
+
for version in sorted(self._applied):
|
|
204
|
+
migration = migration_by_version.get(version)
|
|
205
|
+
applied_list.append(
|
|
206
|
+
{
|
|
207
|
+
"version": version,
|
|
208
|
+
"description": migration.description if migration else "",
|
|
209
|
+
"module_name": migration.module_name if migration else "",
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
|
|
198
213
|
return {
|
|
199
214
|
"status": self.status.value,
|
|
200
215
|
"bootstrap_required": self.bootstrap_required,
|
|
201
216
|
"helper_installed": self._helper_installed(),
|
|
202
217
|
"pending_count": len(pending),
|
|
203
218
|
"pending": [{"version": m.version, "description": m.description} for m in pending],
|
|
204
|
-
"applied":
|
|
219
|
+
"applied": applied_list,
|
|
205
220
|
"last_error": self.last_error,
|
|
206
221
|
}
|
|
207
222
|
|
|
@@ -225,8 +240,11 @@ class MigrationRunner:
|
|
|
225
240
|
return False, f"Bootstrap install script not found: {BOOTSTRAP_INSTALL_SCRIPT}"
|
|
226
241
|
|
|
227
242
|
cmd = [
|
|
228
|
-
"sudo",
|
|
229
|
-
"
|
|
243
|
+
"sudo",
|
|
244
|
+
"-S",
|
|
245
|
+
"-k",
|
|
246
|
+
"bash",
|
|
247
|
+
str(BOOTSTRAP_INSTALL_SCRIPT),
|
|
230
248
|
str(BOOTSTRAP_HELPER_SRC),
|
|
231
249
|
str(BOOTSTRAP_SUDOERS_SRC),
|
|
232
250
|
]
|
|
@@ -295,7 +313,7 @@ class MigrationRunner:
|
|
|
295
313
|
|
|
296
314
|
migrations: list[MigrationInfo] = []
|
|
297
315
|
|
|
298
|
-
for
|
|
316
|
+
for _, module_name, _ in pkgutil.iter_modules([str(versions_path)]):
|
|
299
317
|
full_name = f"{VERSIONS_PKG}.{module_name}"
|
|
300
318
|
try:
|
|
301
319
|
mod = importlib.import_module(full_name)
|
|
@@ -307,12 +325,14 @@ class MigrationRunner:
|
|
|
307
325
|
_LOGGER.warning("Migration module %s has no VERSION, skipping.", full_name)
|
|
308
326
|
continue
|
|
309
327
|
|
|
310
|
-
migrations.append(
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
328
|
+
migrations.append(
|
|
329
|
+
MigrationInfo(
|
|
330
|
+
version=version,
|
|
331
|
+
module_name=full_name,
|
|
332
|
+
description=description,
|
|
333
|
+
requires_root=requires_root,
|
|
334
|
+
)
|
|
335
|
+
)
|
|
316
336
|
except Exception as exc:
|
|
317
337
|
_LOGGER.error("Failed to import migration module %s: %s", full_name, exc)
|
|
318
338
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Remove legacy /etc/sudoers.d/boneio-can (CAN rules now in boneio sudoers).
|
|
2
|
+
|
|
3
|
+
The CAN interface NOPASSWD rules (/sbin/ip link set can0/can1) were
|
|
4
|
+
historically installed as a separate file ``/etc/sudoers.d/boneio-can``
|
|
5
|
+
by the old ``FixCanSudoers`` WebUI component.
|
|
6
|
+
|
|
7
|
+
Since v1.3.0 baseline, these rules live in ``/etc/sudoers.d/boneio``.
|
|
8
|
+
The separate file is therefore redundant and should be removed to avoid
|
|
9
|
+
duplicated sudoers entries.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from boneio.migrations.actions import MigrationAction, RemoveFile
|
|
15
|
+
|
|
16
|
+
VERSION = "1.3.2"
|
|
17
|
+
DESCRIPTION = "Remove legacy /etc/sudoers.d/boneio-can (CAN rules already in /etc/sudoers.d/boneio)"
|
|
18
|
+
REQUIRES_ROOT = True
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def plan() -> list[MigrationAction]:
|
|
22
|
+
"""Return the ordered list of migration actions.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
List of actions: removes the redundant CAN sudoers file.
|
|
26
|
+
"""
|
|
27
|
+
return [
|
|
28
|
+
RemoveFile(path="/etc/sudoers.d/boneio-can"),
|
|
29
|
+
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Dt as l,Ot as u,d,f,it as p,nt as m,rt as h,t as g}from"./useTranslation-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Dt as l,Ot as u,d,f,it as p,nt as m,rt as h,t as g}from"./useTranslation-Dwuk-AFr.js";var _=e(s(),1);function v(){let[e,t]=(0,_.useState)(`dark`);return(0,_.useEffect)(()=>{t(localStorage.getItem(`theme`)||`dark`);let e=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`data-theme`&&t(document.documentElement.getAttribute(`data-theme`)||`dark`)})});return e.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]}),()=>e.disconnect()},[]),e}function y(e){return l({tag:`svg`,attr:{viewBox:`0 0 24 24`},child:[{tag:`path`,attr:{d:`M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z`},child:[]},{tag:`path`,attr:{d:`M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z`},child:[]}]})(e)}var b=c();function x({isOpen:e,onClose:t}){let{t:n}=g(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await u.get(`/api/check_configuration`);o({status:e.data.status,message:e.data.message})}catch{o({status:`error`,message:n(`config_check.failed`)})}finally{i(!1)}};return e?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4`,children:[(0,b.jsx)(`h2`,{className:`text-2xl font-bold mb-6`,children:n(`config_check.title`)}),r?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-8`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg`}),(0,b.jsx)(`p`,{className:`text-lg`,children:n(`config_check.checking`)})]}):a?(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsx)(`div`,{className:`text-lg font-semibold ${a.status===`success`?`text-success`:`text-error`}`,children:a.status===`success`?n(`config_check.valid`):n(`config_check.error`)}),a.message&&(0,b.jsx)(`pre`,{className:`bg-base-300 p-4 rounded-lg whitespace-pre-wrap`,children:a.message}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4 mt-6`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{o(null),t()},children:n(`common.close`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:()=>{o(null),s()},children:n(`config_check.check_again`)})]})]}):(0,b.jsxs)(`div`,{className:`space-y-6`,children:[(0,b.jsx)(`p`,{className:`text-base-content/70`,children:n(`config_check.description`)}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:t,children:n(`common.cancel`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:s,children:n(`config_check.check_button`)})]})]})]})}):null}function S(e){return new Worker(`/assets/yaml.worker-nZQZSRZ7.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new o:new r}},i.config({monaco:n});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[g,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await u.get(`/api/files`)).data.items)}catch(e){console.error(`Error loading directory:`,e)}},A=async e=>{try{let t=`/api/files/${encodeURIComponent(e)}`,n=await u.get(t);i(e),s(n.data.content),localStorage.setItem(`lastOpenedFile`,e)}catch(e){console.error(`Error loading file:`,e)}},j=async()=>{if(r)try{await u.put(`/api/files/${encodeURIComponent(r)}`,{content:o}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await u.get(`/schema/config.schema.json`)).data;C=await a(e,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+`/schema/config.schema.json`,fileMatch:[`config.yaml`,`config.yml`],schema:t},...Object.keys(t.properties).map(e=>({uri:window.location.origin+`/schema/${e}.schema.json`,fileMatch:[`${e}.yaml`,`${e}.yml`],schema:t.properties[e]}))],validate:!0})}},N=async(e,t)=>{e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>{j()})},P=e=>{n(t=>{let n=t=>t.map(t=>t.path===e?{...t,isOpen:!t.isOpen}:t.children?{...t,children:n(t.children)}:t);return n(t)})},F=(e,t=0)=>e.map(e=>{let n=t==0||e.isOpen;return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${r===e.path?`bg-primary/10`:``}`,style:{paddingLeft:`${t*16+8}px`},onClick:()=>e.type===`file`?A(e.path):P(e.path),children:[e.type===`directory`&&(0,b.jsx)(`span`,{className:`text-xs`,children:n?(0,b.jsx)(d,{}):(0,b.jsx)(f,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(p,{}):(0,b.jsx)(h,{}):(0,b.jsx)(m,{})}),(0,b.jsx)(`span`,{className:`text-sm truncate`,children:e.name})]}),e.type===`directory`&&n&&e.children&&F(e.children,t+1)]},e.path)}),I=async()=>{try{return await u.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(l(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),l(!1),k();break}await new Promise(e=>setTimeout(e,1e3))}};return(0,_.useEffect)(()=>{(async()=>{await k();let e=localStorage.getItem(`lastOpenedFile`);e&&A(e)})()},[]),(0,b.jsxs)(`div`,{className:`flex h-full bg-base-300`,children:[c?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg text-center`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg mb-4`}),(0,b.jsxs)(`h2`,{className:`text-xl font-bold mb-4`,children:[g===`waiting`&&`Restarting Service...`,g===`checking`&&`Waiting for Service...`,g===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[g===`waiting`&&`Initiating service restart`,g===`checking`&&`Checking if service is back online`,g===`ready`&&`Redirecting...`]})]})}):null,(0,b.jsxs)(`div`,{className:`${w?`w-64`:`w-0`} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`p-2 text-sm font-semibold text-base-content/70 uppercase`,children:`Explorer`}),(0,b.jsx)(`div`,{className:`overflow-y-auto`,children:F(e)})]}),(0,b.jsxs)(`div`,{className:`flex-1 overflow-hidden flex flex-col h-full max-h-screen`,children:[(0,b.jsxs)(`div`,{className:`flex items-center p-2 border-b border-base-content/10`,children:[(0,b.jsx)(`button`,{onClick:()=>T(!w),className:`btn btn-ghost btn-sm p-1`,title:w?`Hide file tree`:`Show file tree`,children:(0,b.jsx)(y,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${w?``:`rotate-180`}`})}),r&&(0,b.jsx)(`span`,{className:`ml-2 text-sm opacity-70`,children:r})]}),(0,b.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,b.jsx)(t,{height:`100%`,width:`100%`,defaultLanguage:`yaml`,path:r||`config.yaml`,theme:O===`light`?`vs-light`:`vs-dark`,value:o,onChange:e=>s(e||``),onMount:N,beforeMount:M,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),(0,b.jsxs)(`div`,{className:`h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4`,children:[(0,b.jsx)(`button`,{onClick:j,disabled:!r,className:`btn btn-primary btn-sm`,children:`Save`}),(0,b.jsx)(`button`,{onClick:()=>D(!0),className:`btn btn-primary btn-sm`,children:`Check Config`}),(0,b.jsx)(`button`,{onClick:async()=>{await j();try{if((await u.post(`/api/restart`)).data.status===`not available`){let e=document.getElementById(`toast`);e&&(e.classList.remove(`hidden`),setTimeout(()=>{e.classList.add(`hidden`)},5e3))}else console.log(`Service restarted successfully`),L()}catch(e){console.error(`Error restarting service:`,e)}},disabled:!r,className:`btn btn-secondary btn-sm`,children:`Save and Restart`})]})]}),(0,b.jsx)(`div`,{id:`toast`,className:`toast toast-end hidden`,children:(0,b.jsx)(`div`,{className:`alert alert-warning`,children:(0,b.jsx)(`span`,{children:`Restart not possible. Application is not running as systemd service. Restart manually.`})})}),(0,b.jsx)(x,{isOpen:E,onClose:()=>D(!1)})]})}export{w as default};
|