boneio 1.3.0.dev3__tar.gz → 1.3.0.dev5__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.dev3/boneio.egg-info → boneio-1.3.0.dev5}/PKG-INFO +2 -2
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/config_helper.py +13 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/canopen.py +7 -1
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/client.py +18 -4
- boneio-1.3.0.dev5/boneio/hardware/can/sudoers.py +199 -0
- boneio-1.3.0.dev5/boneio/hardware/can/test_od.py +15 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/homeassistant.py +15 -2
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/runner.py +1 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/schema.yaml +12 -0
- boneio-1.3.0.dev5/boneio/version.py +2 -0
- boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/ConfigEditor-DCabX5qK.js → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/ConfigEditor-BWHZGmYg.js +1 -1
- boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/aiWizardPrompt-B5y1tw6O.js → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/aiWizardPrompt-C1vdmyeb.js +1 -1
- boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/index-CmBl6pFS.css → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/index-BZZGqf-N.css +1 -1
- boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/index-DXEKDEyX.js +105 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/index.html +2 -2
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/boneio.schema.json +14 -0
- {boneio-1.3.0.dev3/boneio/webui → boneio-1.3.0.dev5/boneio/webui/frontend-dist}/schema/config.schema.json +14 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/can.py +37 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/system.py +257 -4
- boneio-1.3.0.dev5/boneio/webui/routes/timezone_sudoers.py +202 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/boneio.schema.json +14 -0
- {boneio-1.3.0.dev3/boneio/webui/frontend-dist → boneio-1.3.0.dev5/boneio/webui}/schema/config.schema.json +14 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5/boneio.egg-info}/PKG-INFO +2 -2
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/SOURCES.txt +6 -4
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/requires.txt +1 -1
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/pyproject.toml +1 -1
- boneio-1.3.0.dev3/boneio/hardware/can/test_od.py +0 -10
- boneio-1.3.0.dev3/boneio/version.py +0 -2
- boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/index-CYk12kJk.js +0 -105
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/LICENSE +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/MANIFEST.in +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/README.md +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/bonecli.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/cover.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/group/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/group/output_group.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/detectors.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/event.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/basic.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/mcp.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/pca.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/pcf.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/const.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/package.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/discovery.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/events/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/events/bus.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/covers.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/display.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/manager.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/remote.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/update.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/local.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/base.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/can.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/wled.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/base.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/system.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/state/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/state/manager.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/host_data.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/monitor.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/filter.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/logger.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/util.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/exceptions.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/node.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/interlock.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/cli.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/client.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/utils.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/actions.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/events.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/files.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/logs.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/mqtt.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/state.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/condition.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/filters.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/id.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/action_validation.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/app.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cssMode-DShylJqh.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/freemarker2-CdX7KyE5.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/handlebars-C3LDizRo.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/html-z-YV0Mzh.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/htmlMode-D7IIR2va.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/javascript-CH6jkTQ0.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/jsonMode-CLzeI5HJ.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/liquid-DuoI_Tv0.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mdx-C2KSoPE6.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/monaco-DVn9mNSL.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/monaco-xnhJeWAr.css +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/python-Dh7Kzq6D.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/razor-CJwYmOfy.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/tsMode-VSMpyycN.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/typescript-C4HjhnfC.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/vendor-8TE4Uyqi.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/xml-ByUHJiRO.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/yaml-CTy8Ej0Q.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/config.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/update.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/services/logs.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/web_server.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/setup.cfg +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/setup.py +0 -0
- {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/tests/test_py313_compatibility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boneio
|
|
3
|
-
Version: 1.3.0.
|
|
3
|
+
Version: 1.3.0.dev5
|
|
4
4
|
Summary: Python App for BoneIO
|
|
5
5
|
Author-email: Paweł Szafer <pszafer@gmail.com>
|
|
6
6
|
License: GNU General Public License v3.0
|
|
@@ -35,7 +35,7 @@ Requires-Dist: requests==2.32.5
|
|
|
35
35
|
Requires-Dist: packaging==25.0
|
|
36
36
|
Requires-Dist: aioesphomeapi>=29.0.0
|
|
37
37
|
Requires-Dist: zeroconf>=0.148.0
|
|
38
|
-
Requires-Dist: canopen-asyncio>=2.
|
|
38
|
+
Requires-Dist: canopen-asyncio>=2.4.1
|
|
39
39
|
Dynamic: license-file
|
|
40
40
|
|
|
41
41
|
Example usage:
|
|
@@ -51,6 +51,7 @@ class ConfigHelper:
|
|
|
51
51
|
cloud_registration: bool = False,
|
|
52
52
|
pwa_name: str | None = None,
|
|
53
53
|
ha_child_devices: bool = False,
|
|
54
|
+
ha_child_devices_naming: str = "default",
|
|
54
55
|
):
|
|
55
56
|
self._name = name
|
|
56
57
|
|
|
@@ -83,6 +84,7 @@ class ConfigHelper:
|
|
|
83
84
|
self._update_channel = update_channel
|
|
84
85
|
self._cloud_registration = cloud_registration
|
|
85
86
|
self._ha_child_devices = ha_child_devices
|
|
87
|
+
self._ha_child_devices_naming = ha_child_devices_naming
|
|
86
88
|
self._device_type = device_type
|
|
87
89
|
self._web_port = web_port
|
|
88
90
|
self._proxy_port = proxy_port
|
|
@@ -236,6 +238,17 @@ class ConfigHelper:
|
|
|
236
238
|
"""
|
|
237
239
|
return self._ha_child_devices
|
|
238
240
|
|
|
241
|
+
@property
|
|
242
|
+
def ha_child_devices_naming(self) -> str:
|
|
243
|
+
"""Get the naming style for HA child devices.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
'default' — entity name only (e.g. "OUT 17")
|
|
247
|
+
'device_name' — "{device_name} - {name}" (e.g. "boneIO Black - OUT 17")
|
|
248
|
+
'device_name_area' — "{device_name} - {area} - {name}" (e.g. "boneIO Black - Gabinet - OUT 17")
|
|
249
|
+
"""
|
|
250
|
+
return self._ha_child_devices_naming
|
|
251
|
+
|
|
239
252
|
@property
|
|
240
253
|
def device_type(self) -> str:
|
|
241
254
|
return self._device_type
|
|
@@ -111,7 +111,13 @@ class CANopenManager:
|
|
|
111
111
|
True if started successfully.
|
|
112
112
|
"""
|
|
113
113
|
if not self.is_enabled:
|
|
114
|
-
|
|
114
|
+
if not self._enabled:
|
|
115
|
+
_LOGGER.info("CANopen is disabled in configuration (enabled: false)")
|
|
116
|
+
elif not CANOPEN_AVAILABLE:
|
|
117
|
+
_LOGGER.warning(
|
|
118
|
+
"CANopen is enabled in configuration but canopen library is not installed. "
|
|
119
|
+
"Install with: pip install canopen-asyncio"
|
|
120
|
+
)
|
|
115
121
|
return False
|
|
116
122
|
|
|
117
123
|
if self._running:
|
|
@@ -12,15 +12,27 @@ from types import ModuleType
|
|
|
12
12
|
from typing import TYPE_CHECKING, Callable
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
|
|
15
|
+
try:
|
|
16
|
+
from canopen import Network, LocalNode
|
|
17
|
+
except ImportError:
|
|
18
|
+
from canopen_asyncio import Network, LocalNode # type: ignore[assignment]
|
|
16
19
|
|
|
17
20
|
try:
|
|
18
21
|
import canopen
|
|
19
22
|
|
|
20
23
|
CANOPEN_AVAILABLE = True
|
|
21
24
|
except ImportError:
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
try:
|
|
26
|
+
import canopen_asyncio as canopen # type: ignore[no-redef]
|
|
27
|
+
|
|
28
|
+
CANOPEN_AVAILABLE = True
|
|
29
|
+
except ImportError as _import_err:
|
|
30
|
+
CANOPEN_AVAILABLE = False
|
|
31
|
+
canopen: ModuleType = None # type: ignore[assignment]
|
|
32
|
+
logging.getLogger(__name__).warning(
|
|
33
|
+
"canopen module not available: %s. Install with: pip install canopen-asyncio",
|
|
34
|
+
_import_err,
|
|
35
|
+
)
|
|
24
36
|
|
|
25
37
|
_LOGGER = logging.getLogger(__name__)
|
|
26
38
|
|
|
@@ -330,7 +342,9 @@ class CANopenClient:
|
|
|
330
342
|
|
|
331
343
|
def _create_object_dictionary(self):
|
|
332
344
|
"""Create minimal Object Dictionary for SDO operations."""
|
|
333
|
-
|
|
345
|
+
# Use module-level canopen (may be aliased from canopen_asyncio)
|
|
346
|
+
ObjectDictionary = canopen.objectdictionary.ObjectDictionary
|
|
347
|
+
Variable = canopen.objectdictionary.Variable
|
|
334
348
|
|
|
335
349
|
od = ObjectDictionary()
|
|
336
350
|
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""CAN interface sudoers management for boneIO.
|
|
2
|
+
|
|
3
|
+
Provides functions to check and fix sudoers configuration
|
|
4
|
+
for CAN interface management commands (ip link set).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
_LOGGER = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
# Sudoers file path for CAN interface
|
|
16
|
+
SUDOERS_FILE = "/etc/sudoers.d/boneio-can"
|
|
17
|
+
|
|
18
|
+
# Expected sudoers content template
|
|
19
|
+
# {user} will be replaced with the current system user
|
|
20
|
+
SUDOERS_TEMPLATE = """{user} ALL=(ALL) NOPASSWD: /sbin/ip link set can0 *
|
|
21
|
+
{user} ALL=(ALL) NOPASSWD: /sbin/ip link set can1 *
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_sudoers_content(user: str | None = None) -> str:
|
|
26
|
+
"""Generate expected sudoers file content.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
user: System user name. Defaults to current user or 'boneio'.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Sudoers file content string.
|
|
33
|
+
"""
|
|
34
|
+
if user is None:
|
|
35
|
+
user = os.environ.get("USER", "boneio")
|
|
36
|
+
return SUDOERS_TEMPLATE.format(user=user)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def check_sudo_nopasswd_for_ip() -> dict:
|
|
40
|
+
"""Check if sudo NOPASSWD is configured for 'ip link set can*'.
|
|
41
|
+
|
|
42
|
+
Uses 'sudo -n -l' to list allowed commands and verifies that
|
|
43
|
+
'/sbin/ip link set can0' is permitted without a password.
|
|
44
|
+
This avoids false positives from cached sudo credentials.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Dictionary with:
|
|
48
|
+
- needs_password: bool — True if NOPASSWD rule is missing
|
|
49
|
+
- sudoers_file_exists: bool — True if /etc/sudoers.d/boneio-can exists
|
|
50
|
+
- error: str | None — error message if check failed
|
|
51
|
+
"""
|
|
52
|
+
result = {
|
|
53
|
+
"needs_password": True,
|
|
54
|
+
"sudoers_file_exists": os.path.exists(SUDOERS_FILE),
|
|
55
|
+
"error": None,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
# Use 'sudo -n -l' to list what the user can run without a password.
|
|
60
|
+
# This is the correct way to check NOPASSWD rules — it doesn't
|
|
61
|
+
# execute anything and is not affected by cached sudo credentials.
|
|
62
|
+
proc = await asyncio.create_subprocess_exec(
|
|
63
|
+
"sudo", "-n", "-l",
|
|
64
|
+
stdout=asyncio.subprocess.PIPE,
|
|
65
|
+
stderr=asyncio.subprocess.PIPE,
|
|
66
|
+
)
|
|
67
|
+
stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=5)
|
|
68
|
+
|
|
69
|
+
if proc.returncode != 0:
|
|
70
|
+
stderr_str = stderr.decode().strip()
|
|
71
|
+
if "password is required" in stderr_str or "a terminal is required" in stderr_str:
|
|
72
|
+
result["needs_password"] = True
|
|
73
|
+
result["error"] = "sudo requires a password to list allowed commands"
|
|
74
|
+
else:
|
|
75
|
+
result["error"] = stderr_str
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
# Parse the output to find NOPASSWD rules for /sbin/ip link set can*
|
|
79
|
+
sudo_list = stdout.decode()
|
|
80
|
+
# Look for line containing '/sbin/ip link set can0' (with NOPASSWD)
|
|
81
|
+
# sudo -l output format: (ALL) NOPASSWD: /sbin/ip link set can0 *
|
|
82
|
+
has_can0 = any(
|
|
83
|
+
"/sbin/ip link set can0" in line
|
|
84
|
+
for line in sudo_list.splitlines()
|
|
85
|
+
if "NOPASSWD" in line
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if has_can0:
|
|
89
|
+
result["needs_password"] = False
|
|
90
|
+
else:
|
|
91
|
+
result["needs_password"] = True
|
|
92
|
+
result["error"] = (
|
|
93
|
+
"No NOPASSWD rule found for '/sbin/ip link set can0'. "
|
|
94
|
+
"CAN interface auto-setup will fail."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
except asyncio.TimeoutError:
|
|
98
|
+
result["error"] = "sudo check timed out"
|
|
99
|
+
except FileNotFoundError:
|
|
100
|
+
result["error"] = "sudo command not found"
|
|
101
|
+
except Exception as e:
|
|
102
|
+
result["error"] = str(e)
|
|
103
|
+
|
|
104
|
+
return result
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
async def create_sudoers_file(password: str) -> dict:
|
|
108
|
+
"""Create /etc/sudoers.d/boneio-can with NOPASSWD rules for CAN interface.
|
|
109
|
+
|
|
110
|
+
Uses sudo with the provided password to write the sudoers file.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
password: User's sudo password.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Dictionary with status and message.
|
|
117
|
+
"""
|
|
118
|
+
user = os.environ.get("USER", "boneio")
|
|
119
|
+
content = get_sudoers_content(user)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
# Write content to a temp file first, then move it with sudo
|
|
123
|
+
# This is safer than piping directly to sudoers
|
|
124
|
+
tmp_path = f"/tmp/boneio-can-sudoers-{os.getpid()}"
|
|
125
|
+
|
|
126
|
+
with open(tmp_path, "w") as f:
|
|
127
|
+
f.write(content)
|
|
128
|
+
|
|
129
|
+
# Validate the sudoers file before installing
|
|
130
|
+
validate_cmd = ["sudo", "-S", "visudo", "-c", "-f", tmp_path]
|
|
131
|
+
proc = await asyncio.create_subprocess_exec(
|
|
132
|
+
*validate_cmd,
|
|
133
|
+
stdin=asyncio.subprocess.PIPE,
|
|
134
|
+
stdout=asyncio.subprocess.PIPE,
|
|
135
|
+
stderr=asyncio.subprocess.PIPE,
|
|
136
|
+
)
|
|
137
|
+
stdout, stderr = await asyncio.wait_for(
|
|
138
|
+
proc.communicate(input=(password + "\n").encode()),
|
|
139
|
+
timeout=10,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if proc.returncode != 0:
|
|
143
|
+
stderr_str = stderr.decode().strip()
|
|
144
|
+
os.unlink(tmp_path)
|
|
145
|
+
if "incorrect password" in stderr_str.lower() or "sorry" in stderr_str.lower():
|
|
146
|
+
return {"status": "error", "message": "Incorrect sudo password"}
|
|
147
|
+
return {"status": "error", "message": f"Sudoers validation failed: {stderr_str}"}
|
|
148
|
+
|
|
149
|
+
# Copy the validated file to /etc/sudoers.d/ and set correct permissions
|
|
150
|
+
install_cmd = ["sudo", "-S", "cp", tmp_path, SUDOERS_FILE]
|
|
151
|
+
proc = await asyncio.create_subprocess_exec(
|
|
152
|
+
*install_cmd,
|
|
153
|
+
stdin=asyncio.subprocess.PIPE,
|
|
154
|
+
stdout=asyncio.subprocess.PIPE,
|
|
155
|
+
stderr=asyncio.subprocess.PIPE,
|
|
156
|
+
)
|
|
157
|
+
_, stderr = await asyncio.wait_for(
|
|
158
|
+
proc.communicate(input=(password + "\n").encode()),
|
|
159
|
+
timeout=10,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
if proc.returncode != 0:
|
|
163
|
+
stderr_str = stderr.decode().strip()
|
|
164
|
+
os.unlink(tmp_path)
|
|
165
|
+
if "incorrect password" in stderr_str.lower() or "sorry" in stderr_str.lower():
|
|
166
|
+
return {"status": "error", "message": "Incorrect sudo password"}
|
|
167
|
+
return {"status": "error", "message": f"Failed to install sudoers file: {stderr_str}"}
|
|
168
|
+
|
|
169
|
+
# Set correct permissions (must be 0440)
|
|
170
|
+
chmod_cmd = ["sudo", "-S", "chmod", "0440", SUDOERS_FILE]
|
|
171
|
+
proc = await asyncio.create_subprocess_exec(
|
|
172
|
+
*chmod_cmd,
|
|
173
|
+
stdin=asyncio.subprocess.PIPE,
|
|
174
|
+
stdout=asyncio.subprocess.PIPE,
|
|
175
|
+
stderr=asyncio.subprocess.PIPE,
|
|
176
|
+
)
|
|
177
|
+
await asyncio.wait_for(
|
|
178
|
+
proc.communicate(input=(password + "\n").encode()),
|
|
179
|
+
timeout=10,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Clean up temp file
|
|
183
|
+
try:
|
|
184
|
+
os.unlink(tmp_path)
|
|
185
|
+
except OSError:
|
|
186
|
+
pass
|
|
187
|
+
|
|
188
|
+
_LOGGER.info("Successfully created sudoers file for CAN interface: %s", SUDOERS_FILE)
|
|
189
|
+
return {
|
|
190
|
+
"status": "success",
|
|
191
|
+
"message": f"Sudoers file created at {SUDOERS_FILE}",
|
|
192
|
+
"content": content,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
except asyncio.TimeoutError:
|
|
196
|
+
return {"status": "error", "message": "sudo command timed out"}
|
|
197
|
+
except Exception as e:
|
|
198
|
+
_LOGGER.error("Failed to create CAN sudoers file: %s", e)
|
|
199
|
+
return {"status": "error", "message": str(e)}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
try:
|
|
2
|
+
import canopen
|
|
3
|
+
except ImportError:
|
|
4
|
+
import canopen_asyncio as canopen # type: ignore[no-redef]
|
|
5
|
+
|
|
6
|
+
ObjectDictionary = canopen.objectdictionary.ObjectDictionary
|
|
7
|
+
Variable = canopen.objectdictionary.Variable
|
|
8
|
+
|
|
9
|
+
od = ObjectDictionary()
|
|
10
|
+
var_node = Variable("Node ID", 0x2000, 0)
|
|
11
|
+
var_node.data_type = 5 # UNSIGNED8
|
|
12
|
+
var_node.access_type = "rw"
|
|
13
|
+
od.add_object(var_node)
|
|
14
|
+
|
|
15
|
+
print(od[0x2000].name)
|
|
@@ -79,7 +79,10 @@ def ha_availabilty_message(
|
|
|
79
79
|
topic = config_helper.topic_prefix if topic is None else topic
|
|
80
80
|
device_name = config_helper.name if device_name is None else device_name
|
|
81
81
|
model = f"boneIO Black {config_helper.device_type.title().replace('X', 'x')}"
|
|
82
|
-
if config_helper.
|
|
82
|
+
if config_helper.cloud_registration and config_helper.serial_number:
|
|
83
|
+
# PWA-registered device: use the public PWA domain with TLS
|
|
84
|
+
web_url = f"https://{config_helper.serial_number}.black.boneio.app:8443"
|
|
85
|
+
elif config_helper.is_web_active and config_helper.network_info and IP in config_helper.network_info:
|
|
83
86
|
web_url = f"{config_helper.http_proto}://{config_helper.network_info[IP]}:{config_helper.web_configuration_port}"
|
|
84
87
|
|
|
85
88
|
web_url_dict = {
|
|
@@ -101,7 +104,17 @@ def ha_availabilty_message(
|
|
|
101
104
|
_CHILD_DEVICE_TYPES = {OUTPUT, INPUT, COVER, "group", ADC}
|
|
102
105
|
|
|
103
106
|
if config_helper.ha_child_devices and device_type in _CHILD_DEVICE_TYPES:
|
|
104
|
-
|
|
107
|
+
# Build child device name based on naming style
|
|
108
|
+
naming = config_helper.ha_child_devices_naming
|
|
109
|
+
if naming == "device_name_area" and area_name:
|
|
110
|
+
child_device_name = f"{device_name} - {area_name} - {name}"
|
|
111
|
+
elif naming == "device_name_area" or naming == "device_name":
|
|
112
|
+
# device_name_area without area falls back to device_name style
|
|
113
|
+
child_device_name = f"{device_name} - {name}"
|
|
114
|
+
else:
|
|
115
|
+
# 'default' — entity name only (e.g. "OUT 17")
|
|
116
|
+
child_device_name = name
|
|
117
|
+
|
|
105
118
|
child_identifier = f"{topic}_{device_type}_{id}"
|
|
106
119
|
device_info = {
|
|
107
120
|
"identifiers": [child_identifier],
|
|
@@ -186,6 +186,7 @@ async def async_run(
|
|
|
186
186
|
cloud_registration=web_config.get("cloud", {}).get("enabled", False),
|
|
187
187
|
pwa_name=web_config.get("cloud", {}).get("pwa_name"),
|
|
188
188
|
ha_child_devices=main_config.get("ha_child_devices", False),
|
|
189
|
+
ha_child_devices_naming=main_config.get("ha_child_devices_naming", "default"),
|
|
189
190
|
)
|
|
190
191
|
|
|
191
192
|
# Load areas configuration
|
|
@@ -1746,3 +1746,15 @@ boneio:
|
|
|
1746
1746
|
This allows HA to auto-generate dashboards per area.
|
|
1747
1747
|
Entity names become empty so HA uses the device name directly.
|
|
1748
1748
|
WARNING: Experimental feature — may change or be removed in future versions.
|
|
1749
|
+
ha_child_devices_naming:
|
|
1750
|
+
type: string
|
|
1751
|
+
required: False
|
|
1752
|
+
default: 'default'
|
|
1753
|
+
allowed: ['default', 'device_name', 'device_name_area']
|
|
1754
|
+
meta:
|
|
1755
|
+
label: "Child device naming style"
|
|
1756
|
+
description: |
|
|
1757
|
+
Controls how child device names are constructed when ha_child_devices is enabled.
|
|
1758
|
+
- default: Entity name only (e.g., "OUT 17"). May cause duplicates if multiple boneIO devices share output names.
|
|
1759
|
+
- device_name: Adds boneIO device name prefix (e.g., "boneIO Black - OUT 17").
|
|
1760
|
+
- 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.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{G as W,u as _,j as e,a as f,F as $,b as B,c as L,d as H,e as z}from"./index-
|
|
1
|
+
import{G as W,u as _,j as e,a as f,F as $,b as B,c as L,d as H,e as z}from"./index-DXEKDEyX.js";import{a as c,F as A,c as D,l as Z,m as P}from"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function U(){const[r,i]=c.useState("dark");return c.useEffect(()=>{const a=localStorage.getItem("theme")||"dark";i(a);const g=new MutationObserver(m=>{m.forEach(o=>{if(o.attributeName==="data-theme"){const h=document.documentElement.getAttribute("data-theme")||"dark";i(h)}})});return g.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>g.disconnect()},[]),r}function G(r){return W({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:[]}]})(r)}function K({isOpen:r,onClose:i}){const{t:a}=_(),[g,m]=c.useState(!1),[o,h]=c.useState(null),p=async()=>{m(!0);try{const l=await f.get("/api/check_configuration");h({status:l.data.status,message:l.data.message})}catch{h({status:"error",message:a("config_check.failed")})}finally{m(!1)}};return r?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4",children:[e.jsx("h2",{className:"text-2xl font-bold mb-6",children:a("config_check.title")}),g?e.jsxs("div",{className:"flex flex-col items-center gap-4 py-8",children:[e.jsx("div",{className:"loading loading-spinner loading-lg"}),e.jsx("p",{className:"text-lg",children:a("config_check.checking")})]}):o?e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:`text-lg font-semibold ${o.status==="success"?"text-success":"text-error"}`,children:o.status==="success"?a("config_check.valid"):a("config_check.error")}),o.message&&e.jsx("pre",{className:"bg-base-300 p-4 rounded-lg whitespace-pre-wrap",children:o.message}),e.jsxs("div",{className:"flex justify-end gap-4 mt-6",children:[e.jsx("button",{className:"btn btn-ghost",onClick:()=>{h(null),i()},children:a("common.close")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>{h(null),p()},children:a("config_check.check_again")})]})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("p",{className:"text-base-content/70",children:a("config_check.description")}),e.jsxs("div",{className:"flex justify-end gap-4",children:[e.jsx("button",{className:"btn btn-ghost",onClick:i,children:a("common.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:p,children:a("config_check.check_button")})]})]})]})}):null}function q(r){return new Worker("/assets/editor.worker-B4pQIWZD.js",{name:r?.name})}function V(r){return new Worker("/assets/json.worker-aFakAbRR.js",{name:r?.name})}function Y(r){return new Worker("/assets/yaml.worker-DBeHcBRc.js",{name:r?.name})}self.MonacoEnvironment={getWorker(r,i){return i==="yaml"?new Y:i==="json"?new V:new q}};Z.config({monaco:P});let N;function ee(){const[r,i]=c.useState([]),[a,g]=c.useState(null),[m,o]=c.useState(""),[h,p]=c.useState(!1),[l,b]=c.useState("waiting"),[x,C]=c.useState(!0),[S,j]=c.useState(!1),F=U(),w=async()=>{try{const s=await f.get("/api/files");i(s.data.items)}catch(t){console.error("Error loading directory:",t)}},v=async t=>{try{const s=`/api/files/${encodeURIComponent(t)}`,n=await f.get(s);g(t),o(n.data.content),localStorage.setItem("lastOpenedFile",t)}catch(s){console.error("Error loading file:",s)}},y=async()=>{if(a)try{await f.put(`/api/files/${encodeURIComponent(a)}`,{content:m}),console.log("File saved successfully")}catch(t){console.error("Error saving file:",t)}},R=async t=>{if(!N){const n=(await f.get("/schema/config.schema.json")).data;N=await D(t,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+"/schema/config.schema.json",fileMatch:["config.yaml","config.yml"],schema:n},...Object.keys(n.properties).map(d=>({uri:window.location.origin+`/schema/${d}.schema.json`,fileMatch:[`${d}.yaml`,`${d}.yml`],schema:n.properties[d]}))],validate:!0})}},E=async(t,s)=>{t.addCommand(s.KeyMod.CtrlCmd|s.KeyCode.KeyS,()=>{y()})},O=t=>{i(s=>{const n=d=>d.map(u=>u.path===t?{...u,isOpen:!u.isOpen}:u.children?{...u,children:n(u.children)}:u);return n(s)})},k=(t,s=0)=>t.map(n=>{const d=s==0||n.isOpen;return e.jsxs("div",{children:[e.jsxs("button",{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${a===n.path?"bg-primary/10":""}`,style:{paddingLeft:`${s*16+8}px`},onClick:()=>n.type==="file"?v(n.path):O(n.path),children:[n.type==="directory"&&e.jsx("span",{className:"text-xs",children:d?e.jsx($,{}):e.jsx(B,{})}),e.jsx("span",{className:"text-base-content/70",children:n.type==="directory"?d?e.jsx(L,{}):e.jsx(H,{}):e.jsx(z,{})}),e.jsx("span",{className:"text-sm truncate",children:n.name})]}),n.type==="directory"&&d&&n.children&&k(n.children,s+1)]},n.path)}),M=async()=>{try{return await f.get("/api/files"),!0}catch{return!1}},T=async()=>{for(p(!0),b("waiting"),await new Promise(t=>setTimeout(t,2e3)),b("checking");;){if(await M()){b("ready"),await new Promise(s=>setTimeout(s,1e3)),p(!1),w();break}await new Promise(s=>setTimeout(s,1e3))}},I=()=>h?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg text-center",children:[e.jsx("div",{className:"loading loading-spinner loading-lg mb-4"}),e.jsxs("h2",{className:"text-xl font-bold mb-4",children:[l==="waiting"&&"Restarting Service...",l==="checking"&&"Waiting for Service...",l==="ready"&&"Service Restarted!"]}),e.jsxs("p",{className:"text-base-content/70",children:[l==="waiting"&&"Initiating service restart",l==="checking"&&"Checking if service is back online",l==="ready"&&"Redirecting..."]})]})}):null;return c.useEffect(()=>{(async()=>{await w();const s=localStorage.getItem("lastOpenedFile");s&&v(s)})()},[]),e.jsxs("div",{className:"flex h-full bg-base-300",children:[I(),e.jsxs("div",{className:`${x?"w-64":"w-0"} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[e.jsx("div",{className:"p-2 text-sm font-semibold text-base-content/70 uppercase",children:"Explorer"}),e.jsx("div",{className:"overflow-y-auto",children:k(r)})]}),e.jsxs("div",{className:"flex-1 overflow-hidden flex flex-col h-full max-h-screen",children:[e.jsxs("div",{className:"flex items-center p-2 border-b border-base-content/10",children:[e.jsx("button",{onClick:()=>C(!x),className:"btn btn-ghost btn-sm p-1",title:x?"Hide file tree":"Show file tree",children:e.jsx(G,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${x?"":"rotate-180"}`})}),a&&e.jsx("span",{className:"ml-2 text-sm opacity-70",children:a})]}),e.jsx("div",{className:"flex-1 overflow-hidden",children:e.jsx(A,{height:"100%",width:"100%",defaultLanguage:"yaml",path:a||"config.yaml",theme:F==="light"?"vs-light":"vs-dark",value:m,onChange:t=>o(t||""),onMount:E,beforeMount:R,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),e.jsxs("div",{className:"h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4",children:[e.jsx("button",{onClick:y,disabled:!a,className:"btn btn-primary btn-sm",children:"Save"}),e.jsx("button",{onClick:()=>j(!0),className:"btn btn-primary btn-sm",children:"Check Config"}),e.jsx("button",{onClick:async()=>{await y();try{if((await f.post("/api/restart")).data.status==="not available"){const s=document.getElementById("toast");s&&(s.classList.remove("hidden"),setTimeout(()=>{s.classList.add("hidden")},5e3))}else console.log("Service restarted successfully"),T()}catch(t){console.error("Error restarting service:",t)}},disabled:!a,className:"btn btn-secondary btn-sm",children:"Save and Restart"})]})]}),e.jsx("div",{id:"toast",className:"toast toast-end hidden",children:e.jsx("div",{className:"alert alert-warning",children:e.jsx("span",{children:"Restart not possible. Application is not running as systemd service. Restart manually."})})}),e.jsx(K,{isOpen:S,onClose:()=>j(!1)})]})}export{ee as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{f as o}from"./index-
|
|
1
|
+
import{f as o}from"./index-DXEKDEyX.js";import"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function r(t){const e=o(t);return["=== ROLE ===","You are a friendly boneIO Black input configuration wizard.","Your job is to help the user configure a physical input (button/switch) step by step.","","=== CONVERSATION RULES ===","1. Ask ONE question at a time. Keep questions short and clear.","2. ONLY use IDs and values from the CONTEXT section below — never invent IDs.","3. When the user describes an action in natural language, match it to the closest available output, cover, or remote device from the context.","4. After each user answer, confirm what you understood before moving on.",'5. When the user mentions a "light" or ESPHome light output, ask follow-up questions about:'," - Action type (TOGGLE, ON, OFF, BRIGHTNESS_UP, BRIGHTNESS_DOWN, SET_BRIGHTNESS)"," - Transition time (in seconds)"," - Brightness level (0-255)"," - Color temperature (if supported)",'6. When the user mentions a "cover" or "blind" or "roller shutter", ask about:'," - Cover action (TOGGLE, OPEN, CLOSE, STOP, SMART_TOGGLE, TILT)"," - Position (0-100) if applicable","7. When the user mentions MQTT action, ask for the MQTT topic and message payload.","8. Skip questions about features the user says they don't need.","","=== CONVERSATION FLOW ===","Follow this order (skip steps the user already answered):","","Step 1: Ask which physical input to configure (e.g. IN_01 to IN_49)."," Show a few available inputs from the context if helpful.",'Step 2: Ask what name to give this input (e.g. "Bedroom Light Switch").',"Step 3: Ask which area/room it belongs to (show available areas).","Step 4: Ask what should happen on SINGLE CLICK."," - Which output/cover/remote device should it control?"," - What action? (TOGGLE, ON, OFF, etc.)"," - If it's a light with brightness: ask about transition, brightness.","Step 5: Ask if the user wants a DOUBLE CLICK action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 6.","Step 6: Ask if the user wants a LONG PRESS action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 7.","Step 7: Ask if they want any advanced settings (bounce_time, double_click_duration, etc.)."," - Most users will say no — that's fine, use defaults.","Step 8: Show a summary of the configuration and ask for confirmation.","Step 9: Output the final JSON.","","=== OUTPUT FORMAT ===","When the user confirms the configuration, output ONLY a valid JSON block.","No markdown code fences, no explanations around the JSON.","The JSON must have this exact shape:",'{"version":1,"entity_type":"event","apply_to":"current_form","changes":{...}}',"",'The "changes" object should contain ALL fields for the configured input:','- "name": display name','- "boneio_input": the selected input ID (e.g. "IN_01")','- "area": room/area ID (if selected)','- "actions": object with click type keys, each containing an array of action objects',"","Action object fields: action, boneio_output, action_output, boneio_cover, action_cover,","remote_device, output_id, cover_id, brightness, color_temp, transition, topic, action_mqtt_msg.","Only include fields relevant to the action type.","","=== EXAMPLE FINAL JSON ===",JSON.stringify({version:1,entity_type:"event",apply_to:"current_form",changes:{name:"Bedroom Light",boneio_input:"IN_01",area:"bedroom",actions:{single:[{action:"output",boneio_output:"out_01",action_output:"TOGGLE"}],double:[{action:"output",boneio_output:"out_01",action_output:"ON",brightness:255}],long:[{action:"output",boneio_output:"out_01",action_output:"OFF"}]}}},null,2),"","=== CONTEXT (your knowledge about this boneIO device) ===",JSON.stringify(e,null,2),"","=== BEGIN ===","Start by greeting the user and asking which input (IN_01 to IN_49) they want to configure.","If there are no available inputs left, let the user know."].join(`
|
|
2
2
|
`)}export{r as buildAiWizardPrompt};
|