boneIO 1.3.1__tar.gz → 1.3.1.dev2__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.1/boneio.egg-info → boneio-1.3.1.dev2}/PKG-INFO +1 -1
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/cover/cover.py +11 -16
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/cover/time_based.py +2 -2
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/cover/venetian.py +72 -65
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/covers.py +1 -1
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/display/early_oled.py +16 -22
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/input/base.py +2 -4
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/__init__.py +0 -2
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/state.py +1 -8
- boneio-1.3.1.dev2/boneio/version.py +2 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/can.py +16 -15
- {boneio-1.3.1 → boneio-1.3.1.dev2/boneio.egg-info}/PKG-INFO +1 -1
- boneio-1.3.1/boneio/version.py +0 -2
- {boneio-1.3.1 → boneio-1.3.1.dev2}/LICENSE +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/MANIFEST.in +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/README.md +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/bonecli.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/group/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/group/output_group.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/input/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/input/detectors.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/input/event.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/output/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/output/basic.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/output/mcp.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/output/pca.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/output/pcf.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/template/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/const.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/package.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/discovery.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/events/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/events/bus.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/display.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/manager.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/remote.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/templates.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/manager/update.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/local.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/loxone.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/base.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/can.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/remote/wled.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/sensor/base.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/sensor/system.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/state/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/state/manager.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/system/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/system/host_data.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/system/monitor.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/filter.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/logger.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/core/utils/util.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/exceptions.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/client.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/node.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/onewire/bus.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/onewire/ds2482.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/integration/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/integration/interlock.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/integration/lox_template.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/actions.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/runner.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/cli.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/client.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/inverters/thessla.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/other/wanas415.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/modbus/utils.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/actions.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/events.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/files.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/logs.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/models/mqtt.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/runner.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/actions.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/condition.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/filters.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/id.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/schema.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/action_validation.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/app.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/ConfigEditor-wi_Mieo6.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/aiConfig-LL3nlemJ.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CmumVq54.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/index-C_7FDXG5.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/index-C_S5rhz7.css +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/useTranslation-BsWm27qn.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/index.html +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/sw.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/caddy.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/config.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/system.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/routes/update.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/services/logs.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/web_server.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio.egg-info/SOURCES.txt +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/pyproject.toml +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/setup.cfg +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/setup.py +0 -0
- {boneio-1.3.1 → boneio-1.3.1.dev2}/tests/test_py313_compatibility.py +0 -0
|
@@ -21,7 +21,7 @@ from boneio.const import (
|
|
|
21
21
|
from boneio.core.events import EventBus
|
|
22
22
|
from boneio.core.messaging import BasicMqtt
|
|
23
23
|
from boneio.core.utils import TimePeriod
|
|
24
|
-
from boneio.models import CoverState, PositionDict
|
|
24
|
+
from boneio.models import CoverState, PositionDict
|
|
25
25
|
from boneio.models.events import CoverEvent
|
|
26
26
|
|
|
27
27
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -40,7 +40,7 @@ class BaseCoverABC(ABC):
|
|
|
40
40
|
open_time: TimePeriod,
|
|
41
41
|
close_time: TimePeriod,
|
|
42
42
|
event_bus: EventBus,
|
|
43
|
-
position:
|
|
43
|
+
position: int = 100,
|
|
44
44
|
**kwargs,
|
|
45
45
|
) -> None:
|
|
46
46
|
pass
|
|
@@ -106,12 +106,14 @@ class BaseCoverABC(ABC):
|
|
|
106
106
|
pass
|
|
107
107
|
|
|
108
108
|
@abstractmethod
|
|
109
|
-
async def run_cover(
|
|
109
|
+
async def run_cover(
|
|
110
|
+
self, current_operation: str, target_position: float | None = None, target_tilt: float | None = None
|
|
111
|
+
) -> None:
|
|
110
112
|
"""This function is called to run cover after calling open, close, toggle, toggle_open, toggle_close, set_cover_position"""
|
|
111
113
|
pass
|
|
112
114
|
|
|
113
115
|
@abstractmethod
|
|
114
|
-
def send_state(self, state: str,
|
|
116
|
+
async def send_state(self, state: str, position: float) -> None:
|
|
115
117
|
pass
|
|
116
118
|
|
|
117
119
|
|
|
@@ -157,7 +159,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
157
159
|
open_time: TimePeriod,
|
|
158
160
|
close_time: TimePeriod,
|
|
159
161
|
event_bus: EventBus,
|
|
160
|
-
position:
|
|
162
|
+
position: int = 100,
|
|
161
163
|
name: str | None = None,
|
|
162
164
|
**kwargs,
|
|
163
165
|
) -> None:
|
|
@@ -173,7 +175,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
173
175
|
self._open_time = open_time.total_milliseconds
|
|
174
176
|
self._close_time = close_time.total_milliseconds
|
|
175
177
|
self._position = position
|
|
176
|
-
self._initial_position
|
|
178
|
+
self._initial_position = None
|
|
177
179
|
self._current_operation = IDLE
|
|
178
180
|
self._last_operation = CLOSING
|
|
179
181
|
_LOGGER.debug(
|
|
@@ -186,7 +188,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
186
188
|
|
|
187
189
|
self._last_timestamp = time.time()
|
|
188
190
|
|
|
189
|
-
self._last_update_time = 0
|
|
191
|
+
self._last_update_time = 0
|
|
190
192
|
self._closed = position <= 0
|
|
191
193
|
|
|
192
194
|
self._movement_thread = None
|
|
@@ -354,8 +356,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
354
356
|
|
|
355
357
|
@property
|
|
356
358
|
def position(self) -> int:
|
|
357
|
-
|
|
358
|
-
return round(self._position)
|
|
359
|
+
return round(self._position, 0)
|
|
359
360
|
|
|
360
361
|
@property
|
|
361
362
|
def json_position(self) -> PositionDict:
|
|
@@ -383,12 +384,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
|
|
|
383
384
|
self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=state)
|
|
384
385
|
self._message_bus.send_message(topic=f"{self._send_topic}/pos", payload=json.dumps(json_position))
|
|
385
386
|
|
|
386
|
-
@property
|
|
387
|
-
def saved_position(self) -> SavedPositionDict:
|
|
388
|
-
"""Raw float position for disk persistence."""
|
|
389
|
-
return {"position": self._position}
|
|
390
|
-
|
|
391
387
|
def send_state_and_save(self, json_position: PositionDict):
|
|
392
|
-
"""Send state to MQTT/WebSocket and save raw float position to disk."""
|
|
393
388
|
self.send_state(self.state, json_position)
|
|
394
|
-
self._state_save(
|
|
389
|
+
self._state_save(json_position)
|
|
@@ -31,7 +31,7 @@ class TimeBasedCover(BaseCover):
|
|
|
31
31
|
restored_state: dict = DEFAULT_RESTORED_STATE,
|
|
32
32
|
**kwargs,
|
|
33
33
|
) -> None:
|
|
34
|
-
position =
|
|
34
|
+
position = int(restored_state.get("position", DEFAULT_RESTORED_STATE["position"]))
|
|
35
35
|
super().__init__(
|
|
36
36
|
open_relay=open_relay,
|
|
37
37
|
close_relay=close_relay,
|
|
@@ -113,7 +113,7 @@ class TimeBasedCover(BaseCover):
|
|
|
113
113
|
self._loop.call_soon_threadsafe(lambda: self.send_state_and_save(self.json_position))
|
|
114
114
|
self._last_update_time = time.monotonic() # Upewnij się, że aktualizacja jest wysłana na końcu ruchu
|
|
115
115
|
|
|
116
|
-
async def run_cover(self, current_operation: str, target_position: int | None = None
|
|
116
|
+
async def run_cover(self, current_operation: str, target_position: int | None = None) -> None:
|
|
117
117
|
if self._movement_thread and self._movement_thread.is_alive():
|
|
118
118
|
_LOGGER.warning("Cover movement already in progress. Stopping first.")
|
|
119
119
|
await self.stop()
|
|
@@ -8,7 +8,7 @@ import time
|
|
|
8
8
|
from boneio.components.cover.cover import BaseCover, BaseVenetianCoverABC
|
|
9
9
|
from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
|
|
10
10
|
from boneio.core.utils import TimePeriod
|
|
11
|
-
from boneio.models import PositionDict
|
|
11
|
+
from boneio.models import PositionDict
|
|
12
12
|
|
|
13
13
|
_LOGGER = logging.getLogger(__name__)
|
|
14
14
|
COVER_MOVE_UPDATE_INTERVAL = 50 # ms
|
|
@@ -27,12 +27,20 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
27
27
|
restored_state: dict = DEFAULT_RESTORED_STATE,
|
|
28
28
|
**kwargs,
|
|
29
29
|
) -> None:
|
|
30
|
-
self._tilt_duration =
|
|
31
|
-
|
|
30
|
+
self._tilt_duration = (
|
|
31
|
+
tilt_duration.total_milliseconds
|
|
32
|
+
) # Czas trwania ruchu lameli
|
|
33
|
+
self._initial_tilt_position = int(
|
|
34
|
+
restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"])
|
|
35
|
+
)
|
|
32
36
|
|
|
33
|
-
position =
|
|
37
|
+
position = int(
|
|
38
|
+
restored_state.get("position", DEFAULT_RESTORED_STATE["position"])
|
|
39
|
+
)
|
|
34
40
|
# --- TILT ---
|
|
35
|
-
self._tilt_position =
|
|
41
|
+
self._tilt_position = int(
|
|
42
|
+
restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"])
|
|
43
|
+
)
|
|
36
44
|
|
|
37
45
|
# self._actuator_activation_duration = (
|
|
38
46
|
# actuator_activation_duration.total_milliseconds
|
|
@@ -45,12 +53,7 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
45
53
|
)
|
|
46
54
|
_LOGGER.debug(
|
|
47
55
|
"VenetianCover %s initialized: open_time=%dms, close_time=%dms, tilt_duration=%dms, position=%d%%, tilt=%d%%",
|
|
48
|
-
self._id,
|
|
49
|
-
self._open_time,
|
|
50
|
-
self._close_time,
|
|
51
|
-
self._tilt_duration,
|
|
52
|
-
position,
|
|
53
|
-
self._tilt_position,
|
|
56
|
+
self._id, self._open_time, self._close_time, self._tilt_duration, position, self._tilt_position
|
|
54
57
|
)
|
|
55
58
|
|
|
56
59
|
def _move_cover(
|
|
@@ -66,12 +69,20 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
66
69
|
if direction == OPEN:
|
|
67
70
|
relay = self._open_relay
|
|
68
71
|
total_steps = 100 - self._position
|
|
69
|
-
total_tilt_step =
|
|
72
|
+
total_tilt_step = (
|
|
73
|
+
tilt_delta
|
|
74
|
+
if target_tilt_position is not None
|
|
75
|
+
else 100 - self._initial_tilt_position
|
|
76
|
+
)
|
|
70
77
|
|
|
71
78
|
elif direction == CLOSE:
|
|
72
79
|
relay = self._close_relay
|
|
73
80
|
total_steps = self._position
|
|
74
|
-
total_tilt_step =
|
|
81
|
+
total_tilt_step = (
|
|
82
|
+
tilt_delta
|
|
83
|
+
if target_tilt_position is not None
|
|
84
|
+
else self._initial_tilt_position
|
|
85
|
+
)
|
|
75
86
|
else:
|
|
76
87
|
return
|
|
77
88
|
if target_tilt_position is not None:
|
|
@@ -82,7 +93,9 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
82
93
|
|
|
83
94
|
if total_steps == 0 or duration == 0:
|
|
84
95
|
self._current_operation = IDLE
|
|
85
|
-
self._loop.call_soon_threadsafe(
|
|
96
|
+
self._loop.call_soon_threadsafe(
|
|
97
|
+
self.send_state, self.state, self.json_position
|
|
98
|
+
)
|
|
86
99
|
return
|
|
87
100
|
|
|
88
101
|
# Calculate actual duration based on remaining distance
|
|
@@ -98,11 +111,17 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
98
111
|
needed_tilt_duration = tilt_duration * (total_tilt_step / 100)
|
|
99
112
|
if target_tilt_position is None:
|
|
100
113
|
tilt_delta = 1.0
|
|
114
|
+
|
|
101
115
|
|
|
102
116
|
while not self._stop_event.is_set():
|
|
103
|
-
current_time =
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
current_time = (
|
|
118
|
+
time.monotonic()
|
|
119
|
+
) # Pobierz aktualny czas tylko raz na iterację
|
|
120
|
+
elapsed_time = (
|
|
121
|
+
current_time - start_time
|
|
122
|
+
) * 1000 # Konwersja na milisekundy
|
|
123
|
+
|
|
124
|
+
|
|
106
125
|
if elapsed_time < needed_tilt_duration:
|
|
107
126
|
tilt_progress = elapsed_time / needed_tilt_duration if needed_tilt_duration > 0 else 1.0
|
|
108
127
|
progress = 0.0
|
|
@@ -116,10 +135,8 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
116
135
|
|
|
117
136
|
# Obliczanie _tilt_position dla kierunku OPEN
|
|
118
137
|
if target_tilt_position is not None:
|
|
119
|
-
self._tilt_position = min(
|
|
120
|
-
|
|
121
|
-
)
|
|
122
|
-
else: # Fallback jeśli nie ma target_tilt_position
|
|
138
|
+
self._tilt_position = min(target_tilt_position, self._initial_tilt_position + tilt_progress * tilt_delta)
|
|
139
|
+
else: # Fallback jeśli nie ma target_tilt_position
|
|
123
140
|
self._tilt_position = min(
|
|
124
141
|
100.0, self._initial_tilt_position + tilt_progress * (100 - self._initial_tilt_position)
|
|
125
142
|
)
|
|
@@ -129,23 +146,24 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
129
146
|
|
|
130
147
|
# Obliczanie _tilt_position dla kierunku CLOSE
|
|
131
148
|
if target_tilt_position is not None:
|
|
132
|
-
self._tilt_position = max(
|
|
133
|
-
|
|
134
|
-
)
|
|
135
|
-
else: # Fallback jeśli nie ma target_tilt_position
|
|
149
|
+
self._tilt_position = max(target_tilt_position, self._initial_tilt_position - tilt_progress * tilt_delta)
|
|
150
|
+
else: # Fallback jeśli nie ma target_tilt_position
|
|
136
151
|
self._tilt_position = max(
|
|
137
152
|
0.0, self._initial_tilt_position - tilt_progress * self._initial_tilt_position
|
|
138
153
|
)
|
|
139
154
|
|
|
140
155
|
self._last_timestamp = time.time() # Wall clock for display
|
|
141
156
|
if current_time - self._last_update_time >= 1:
|
|
142
|
-
self._loop.call_soon_threadsafe(
|
|
157
|
+
self._loop.call_soon_threadsafe(
|
|
158
|
+
self.send_state, self.state, self.json_position
|
|
159
|
+
)
|
|
143
160
|
self._last_update_time = current_time
|
|
144
161
|
|
|
145
|
-
if target_tilt_position is not None and (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
162
|
+
if target_tilt_position is not None and ((
|
|
163
|
+
direction == OPEN and self._tilt_position >= target_tilt_position
|
|
164
|
+
) or (
|
|
165
|
+
direction == CLOSE and self._tilt_position <= target_tilt_position
|
|
166
|
+
)):
|
|
149
167
|
break
|
|
150
168
|
|
|
151
169
|
if target_position is not None and (
|
|
@@ -165,8 +183,12 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
165
183
|
# Send relay state to WebSocket (not MQTT - that's handled by output_type check)
|
|
166
184
|
self._loop.call_soon_threadsafe(lambda r=relay: asyncio.ensure_future(r.async_send_state()))
|
|
167
185
|
self._current_operation = IDLE
|
|
168
|
-
self._loop.call_soon_threadsafe(
|
|
169
|
-
|
|
186
|
+
self._loop.call_soon_threadsafe(
|
|
187
|
+
self.send_state_and_save, self.json_position
|
|
188
|
+
)
|
|
189
|
+
self._last_update_time = (
|
|
190
|
+
time.monotonic()
|
|
191
|
+
) # Upewnij się, że aktualizacja jest wysłana na końcu ruchu
|
|
170
192
|
|
|
171
193
|
async def set_tilt(self, tilt_position: int) -> None:
|
|
172
194
|
"""Setting tilt position."""
|
|
@@ -178,36 +200,31 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
178
200
|
|
|
179
201
|
tilt_diff = abs(self._tilt_position - tilt_position)
|
|
180
202
|
estimated_time_s = tilt_diff / 100 * self._tilt_duration / 1000
|
|
181
|
-
|
|
203
|
+
|
|
182
204
|
if tilt_position > self._tilt_position:
|
|
183
205
|
_LOGGER.info(
|
|
184
206
|
"Setting tilt %s from %d%% to %d%% (OPENING). Estimated time: %.2fs (tilt_duration=%dms)",
|
|
185
|
-
self._id,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
self._tilt_duration,
|
|
207
|
+
self._id, self._tilt_position, tilt_position, estimated_time_s, self._tilt_duration
|
|
208
|
+
)
|
|
209
|
+
await self.run_cover(
|
|
210
|
+
current_operation=OPENING, target_tilt_position=tilt_position
|
|
190
211
|
)
|
|
191
|
-
await self.run_cover(current_operation=OPENING, target_tilt_position=tilt_position)
|
|
192
212
|
elif tilt_position < self._tilt_position:
|
|
193
213
|
_LOGGER.info(
|
|
194
214
|
"Setting tilt %s from %d%% to %d%% (CLOSING). Estimated time: %.2fs (tilt_duration=%dms)",
|
|
195
|
-
self._id,
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
self._tilt_duration,
|
|
215
|
+
self._id, self._tilt_position, tilt_position, estimated_time_s, self._tilt_duration
|
|
216
|
+
)
|
|
217
|
+
await self.run_cover(
|
|
218
|
+
current_operation=CLOSING, target_tilt_position=tilt_position
|
|
200
219
|
)
|
|
201
|
-
await self.run_cover(current_operation=CLOSING, target_tilt_position=tilt_position)
|
|
202
220
|
|
|
203
221
|
@property
|
|
204
222
|
def json_position(self) -> PositionDict:
|
|
205
|
-
""
|
|
206
|
-
return {"position": self.position, "tilt": self.tilt}
|
|
223
|
+
return {"position": round(self.position, 0), "tilt": self.tilt}
|
|
207
224
|
|
|
208
225
|
@property
|
|
209
226
|
def tilt(self) -> int:
|
|
210
|
-
return round(self._tilt_position)
|
|
227
|
+
return int(round(self._tilt_position, 0))
|
|
211
228
|
|
|
212
229
|
@property
|
|
213
230
|
def tilt_position(self) -> int:
|
|
@@ -228,11 +245,6 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
228
245
|
def kind(self) -> str:
|
|
229
246
|
return "venetian"
|
|
230
247
|
|
|
231
|
-
@property
|
|
232
|
-
def saved_position(self) -> SavedPositionDict:
|
|
233
|
-
"""Raw float position for disk persistence (includes tilt)."""
|
|
234
|
-
return {"position": self._position, "tilt": self._tilt_position}
|
|
235
|
-
|
|
236
248
|
async def set_cover_tilt_position(self, position: int) -> None:
|
|
237
249
|
"""Set cover tilt position (required by BaseVenetianCoverABC)."""
|
|
238
250
|
await self.set_tilt(position)
|
|
@@ -242,10 +254,7 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
242
254
|
estimated_time_s = (100 - self._tilt_position) / 100 * self._tilt_duration / 1000
|
|
243
255
|
_LOGGER.info(
|
|
244
256
|
"Opening tilt cover %s from %d%%. Estimated time: %.2fs (tilt_duration=%dms)",
|
|
245
|
-
self._id,
|
|
246
|
-
self._tilt_position,
|
|
247
|
-
estimated_time_s,
|
|
248
|
-
self._tilt_duration,
|
|
257
|
+
self._id, self._tilt_position, estimated_time_s, self._tilt_duration
|
|
249
258
|
)
|
|
250
259
|
await self.set_tilt(tilt_position=100)
|
|
251
260
|
|
|
@@ -254,16 +263,13 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
254
263
|
estimated_time_s = self._tilt_position / 100 * self._tilt_duration / 1000
|
|
255
264
|
_LOGGER.info(
|
|
256
265
|
"Closing tilt cover %s from %d%%. Estimated time: %.2fs (tilt_duration=%dms)",
|
|
257
|
-
self._id,
|
|
258
|
-
self._tilt_position,
|
|
259
|
-
estimated_time_s,
|
|
260
|
-
self._tilt_duration,
|
|
266
|
+
self._id, self._tilt_position, estimated_time_s, self._tilt_duration
|
|
261
267
|
)
|
|
262
268
|
await self.set_tilt(tilt_position=0)
|
|
263
269
|
|
|
264
270
|
def update_config_times(self, config: dict) -> None:
|
|
265
271
|
"""Update cover timing configuration.
|
|
266
|
-
|
|
272
|
+
|
|
267
273
|
Args:
|
|
268
274
|
config: Dictionary with timing values as TimePeriod objects.
|
|
269
275
|
Keys: open_time, close_time, tilt_duration
|
|
@@ -280,12 +286,11 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
280
286
|
current_operation: str,
|
|
281
287
|
target_position: int | None = None,
|
|
282
288
|
target_tilt_position: int | None = None,
|
|
283
|
-
**kwargs,
|
|
284
289
|
) -> None:
|
|
285
290
|
if self._movement_thread and self._movement_thread.is_alive():
|
|
286
291
|
_LOGGER.warning("Cover movement is already in progress. Stopping first.")
|
|
287
292
|
await self.stop()
|
|
288
|
-
|
|
293
|
+
|
|
289
294
|
# If STOP was requested, don't start new movement
|
|
290
295
|
if current_operation == STOP:
|
|
291
296
|
await self.stop()
|
|
@@ -295,7 +300,9 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
|
|
|
295
300
|
self._initial_position = self._position
|
|
296
301
|
self._initial_tilt_position = self._tilt_position
|
|
297
302
|
self._stop_event.clear()
|
|
298
|
-
self._last_update_time =
|
|
303
|
+
self._last_update_time = (
|
|
304
|
+
time.monotonic()
|
|
305
|
+
) # Inicjalizacja czasu ostatniej aktualizacji
|
|
299
306
|
|
|
300
307
|
if current_operation == OPENING:
|
|
301
308
|
self._movement_thread = threading.Thread(
|
|
@@ -230,7 +230,7 @@ class CoverManager:
|
|
|
230
230
|
|
|
231
231
|
platform = config.get("platform", "time_based")
|
|
232
232
|
|
|
233
|
-
def state_save(value: dict[str,
|
|
233
|
+
def state_save(value: dict[str, int]):
|
|
234
234
|
if config[RESTORE_STATE]:
|
|
235
235
|
self._manager._state_manager.save_attribute(
|
|
236
236
|
attr_type=COVER,
|
|
@@ -28,7 +28,7 @@ _taken_over: bool = False # Set True when DisplayManager takes control
|
|
|
28
28
|
|
|
29
29
|
def _get_fonts() -> dict[str, Any] | None:
|
|
30
30
|
"""Lazily load fonts for OLED display.
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
Returns:
|
|
33
33
|
Dictionary with font objects keyed by size name, or None if
|
|
34
34
|
no font libraries are available (PIL/Pillow not installed).
|
|
@@ -39,7 +39,6 @@ def _get_fonts() -> dict[str, Any] | None:
|
|
|
39
39
|
|
|
40
40
|
try:
|
|
41
41
|
from boneio.core.utils.font_util import make_font
|
|
42
|
-
|
|
43
42
|
_fonts = {
|
|
44
43
|
"big": make_font("DejaVuSans.ttf", 12),
|
|
45
44
|
"small": make_font("DejaVuSans.ttf", 9),
|
|
@@ -49,7 +48,6 @@ def _get_fonts() -> dict[str, Any] | None:
|
|
|
49
48
|
except (OSError, ImportError):
|
|
50
49
|
try:
|
|
51
50
|
from PIL import ImageFont
|
|
52
|
-
|
|
53
51
|
_LOGGER.debug("TTF fonts not found, using default PIL fonts")
|
|
54
52
|
_fonts = {
|
|
55
53
|
"big": ImageFont.load_default(),
|
|
@@ -65,13 +63,13 @@ def _get_fonts() -> dict[str, Any] | None:
|
|
|
65
63
|
|
|
66
64
|
def init_early_oled() -> Any | None:
|
|
67
65
|
"""Initialize bare OLED device for startup status messages.
|
|
68
|
-
|
|
66
|
+
|
|
69
67
|
Creates the I2C connection and SH1106 device early, before the Manager
|
|
70
68
|
or even config validation. This allows displaying boot progress,
|
|
71
69
|
config errors, and crash info on the OLED screen.
|
|
72
|
-
|
|
70
|
+
|
|
73
71
|
Call this once at the very start of the application.
|
|
74
|
-
|
|
72
|
+
|
|
75
73
|
Returns:
|
|
76
74
|
sh1106 device instance or None if OLED hardware is not available.
|
|
77
75
|
"""
|
|
@@ -82,7 +80,6 @@ def init_early_oled() -> Any | None:
|
|
|
82
80
|
try:
|
|
83
81
|
from luma.core.interface.serial import i2c
|
|
84
82
|
from luma.oled.device import sh1106
|
|
85
|
-
|
|
86
83
|
serial = i2c(port=2, address=0x3C)
|
|
87
84
|
_early_device = sh1106(serial)
|
|
88
85
|
_LOGGER.debug("Early OLED device initialized for startup messages")
|
|
@@ -94,7 +91,7 @@ def init_early_oled() -> Any | None:
|
|
|
94
91
|
|
|
95
92
|
def get_early_device() -> Any | None:
|
|
96
93
|
"""Get the early-initialized OLED device singleton.
|
|
97
|
-
|
|
94
|
+
|
|
98
95
|
Returns:
|
|
99
96
|
sh1106 device instance or None if not initialized.
|
|
100
97
|
"""
|
|
@@ -103,7 +100,7 @@ def get_early_device() -> Any | None:
|
|
|
103
100
|
|
|
104
101
|
def handoff() -> None:
|
|
105
102
|
"""Signal that DisplayManager has taken over the OLED.
|
|
106
|
-
|
|
103
|
+
|
|
107
104
|
After this call, draw_status/draw_error/draw_config_error become no-ops.
|
|
108
105
|
Only draw_crash still works (safety — must always show fatal errors).
|
|
109
106
|
"""
|
|
@@ -119,9 +116,9 @@ def is_taken_over() -> bool:
|
|
|
119
116
|
|
|
120
117
|
def draw_status(message: str, device: Any | None = None) -> None:
|
|
121
118
|
"""Draw a startup/status message on the OLED display.
|
|
122
|
-
|
|
119
|
+
|
|
123
120
|
Shows the boneIO logo at the top and a status line below.
|
|
124
|
-
|
|
121
|
+
|
|
125
122
|
Args:
|
|
126
123
|
message: Status message to display (max ~20 chars for good readability).
|
|
127
124
|
device: Optional device override; uses singleton if not provided.
|
|
@@ -131,7 +128,6 @@ def draw_status(message: str, device: Any | None = None) -> None:
|
|
|
131
128
|
return
|
|
132
129
|
try:
|
|
133
130
|
from luma.core.render import canvas
|
|
134
|
-
|
|
135
131
|
fonts = _get_fonts()
|
|
136
132
|
if fonts is None:
|
|
137
133
|
return
|
|
@@ -145,10 +141,10 @@ def draw_status(message: str, device: Any | None = None) -> None:
|
|
|
145
141
|
|
|
146
142
|
def draw_error(title: str, detail: str, device: Any | None = None) -> None:
|
|
147
143
|
"""Draw an error message on the OLED display.
|
|
148
|
-
|
|
144
|
+
|
|
149
145
|
Shows a warning icon, error title, and up to 4 lines of wrapped detail.
|
|
150
146
|
The screen stays visible until manually cleared or the app restarts.
|
|
151
|
-
|
|
147
|
+
|
|
152
148
|
Args:
|
|
153
149
|
title: Short error title (e.g., "Config Error", "Runtime Error").
|
|
154
150
|
detail: Detailed error description (will be word-wrapped).
|
|
@@ -159,7 +155,6 @@ def draw_error(title: str, detail: str, device: Any | None = None) -> None:
|
|
|
159
155
|
return
|
|
160
156
|
try:
|
|
161
157
|
from luma.core.render import canvas
|
|
162
|
-
|
|
163
158
|
fonts = _get_fonts()
|
|
164
159
|
if fonts is None:
|
|
165
160
|
return
|
|
@@ -187,26 +182,26 @@ def draw_error(title: str, detail: str, device: Any | None = None) -> None:
|
|
|
187
182
|
|
|
188
183
|
def draw_config_error(error_message: str, device: Any | None = None) -> None:
|
|
189
184
|
"""Draw a configuration error on the OLED display.
|
|
190
|
-
|
|
185
|
+
|
|
191
186
|
Specialized version of draw_error for config validation failures.
|
|
192
|
-
|
|
187
|
+
|
|
193
188
|
Args:
|
|
194
189
|
error_message: The configuration error description.
|
|
195
190
|
device: Optional device override; uses singleton if not provided.
|
|
196
191
|
"""
|
|
197
192
|
draw_error(
|
|
198
193
|
title="Config Error",
|
|
199
|
-
detail=error_message,
|
|
194
|
+
detail=str(error_message),
|
|
200
195
|
device=device,
|
|
201
196
|
)
|
|
202
197
|
|
|
203
198
|
|
|
204
199
|
def draw_crash(exception: BaseException, device: Any | None = None) -> None:
|
|
205
200
|
"""Draw a crash/runtime error on the OLED display.
|
|
206
|
-
|
|
201
|
+
|
|
207
202
|
This function ALWAYS works, even after handoff() — crashes must be
|
|
208
203
|
visible to the user regardless of which component owns the screen.
|
|
209
|
-
|
|
204
|
+
|
|
210
205
|
Args:
|
|
211
206
|
exception: The exception that caused the crash.
|
|
212
207
|
device: Optional device override; uses singleton if not provided.
|
|
@@ -228,7 +223,7 @@ def draw_crash(exception: BaseException, device: Any | None = None) -> None:
|
|
|
228
223
|
|
|
229
224
|
def clear_display(device: Any | None = None) -> None:
|
|
230
225
|
"""Clear the OLED display (turn all pixels off).
|
|
231
|
-
|
|
226
|
+
|
|
232
227
|
Args:
|
|
233
228
|
device: Optional device override; uses singleton if not provided.
|
|
234
229
|
"""
|
|
@@ -237,7 +232,6 @@ def clear_display(device: Any | None = None) -> None:
|
|
|
237
232
|
return
|
|
238
233
|
try:
|
|
239
234
|
from luma.core.render import canvas
|
|
240
|
-
|
|
241
235
|
with canvas(dev) as draw:
|
|
242
236
|
draw.rectangle([0, 0, 127, 63], outline=0, fill=0)
|
|
243
237
|
except Exception as err:
|
|
@@ -277,15 +277,13 @@ class GpioBaseClass:
|
|
|
277
277
|
"""
|
|
278
278
|
return self._sequence_mode
|
|
279
279
|
|
|
280
|
-
def should_publish_sequence_to_mqtt(self, sequence_type:
|
|
280
|
+
def should_publish_sequence_to_mqtt(self, sequence_type: str) -> bool:
|
|
281
281
|
"""Check if a sequence type should be published to MQTT.
|
|
282
282
|
|
|
283
283
|
Args:
|
|
284
|
-
sequence_type: Type of sequence (e.g., 'double_then_long')
|
|
284
|
+
sequence_type: Type of sequence (e.g., 'double_then_long')
|
|
285
285
|
|
|
286
286
|
Returns:
|
|
287
287
|
True if the sequence should be published to MQTT
|
|
288
288
|
"""
|
|
289
|
-
if sequence_type is None:
|
|
290
|
-
return False
|
|
291
289
|
return self._mqtt_sequences.get(sequence_type, False)
|
|
@@ -116,17 +116,11 @@ class CoverResponse(BaseModel):
|
|
|
116
116
|
|
|
117
117
|
# Utility types
|
|
118
118
|
class PositionDict(TypedDict, total=False):
|
|
119
|
-
"""Position dictionary for covers
|
|
119
|
+
"""Position dictionary for covers."""
|
|
120
120
|
position: int
|
|
121
121
|
tilt: int
|
|
122
122
|
|
|
123
123
|
|
|
124
|
-
class SavedPositionDict(TypedDict, total=False):
|
|
125
|
-
"""Position dictionary for covers — used for disk persistence (full float precision)."""
|
|
126
|
-
position: float
|
|
127
|
-
tilt: float
|
|
128
|
-
|
|
129
|
-
|
|
130
124
|
__all__ = [
|
|
131
125
|
# State models
|
|
132
126
|
"InputState",
|
|
@@ -141,7 +135,6 @@ __all__ = [
|
|
|
141
135
|
"CoverResponse",
|
|
142
136
|
# Utility
|
|
143
137
|
"PositionDict",
|
|
144
|
-
"SavedPositionDict",
|
|
145
138
|
"ModbusDeviceState",
|
|
146
139
|
]
|
|
147
140
|
|