boneio 1.6.0.dev17__tar.gz → 1.6.0.dev18__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.6.0.dev17/boneio.egg-info → boneio-1.6.0.dev18}/PKG-INFO +1 -1
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/recovery.py +6 -4
- boneio-1.6.0.dev18/boneio/core/utils/logger.py +346 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/display/early_oled.py +23 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/input/manager.py +39 -5
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/bus.py +43 -2
- boneio-1.6.0.dev18/boneio/hardware/udev_wait.py +137 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/MANIFEST.sha256 +1 -0
- boneio-1.6.0.dev18/boneio/migrations/assets/journald/boneio-console.conf +11 -0
- boneio-1.6.0.dev18/boneio/migrations/plans/1.6.25.json +1 -0
- boneio-1.6.0.dev18/boneio/migrations/plans/1.6.25.sig +1 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev18/boneio/migrations/plans/manifest.sig +1 -0
- boneio-1.6.0.dev18/boneio/migrations/versions/v1_6_25_journal_to_serial_console.py +58 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/client.py +211 -22
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/coordinator.py +36 -3
- boneio-1.6.0.dev18/boneio/version.py +2 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/server.py +71 -4
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio.egg-info/SOURCES.txt +5 -0
- boneio-1.6.0.dev17/boneio/core/utils/logger.py +0 -161
- boneio-1.6.0.dev17/boneio/migrations/plans/manifest.sig +0 -1
- boneio-1.6.0.dev17/boneio/version.py +0 -2
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/LICENSE +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/README.md +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/input.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/output_cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/boards/1.1/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/input/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/components/virtual_switch.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/const.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/atomic_file.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/jwt_secret.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/models.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/auth/store.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v6_input_keys.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/migrations/v7_mqtt_password_secret.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/provenance.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/secret_masking.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/write_lock.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/containers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/manager.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/scheduler.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/security_alert.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/sun.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/manager/virtual_switches.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/net/discovery_guard.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/security/certificate.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/security/posture.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/sensor/sun.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/system_ops.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/naming.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/sun.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/actions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/apt/52boneio-periodic +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/apt/52boneio-unattended +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/helpers/boneio-migrate-v2 +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/helpers/boneio-system +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/issue.d/10-boneio.issue +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/boneio-dpkg-recover.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/apt-daily-priority.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.0.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.0.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.0.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.0.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.10.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.10.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.11.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.11.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.12.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.12.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.13.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.13.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.14.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.14.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.15.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.15.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.16.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.16.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.17.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.17.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.18.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.18.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.19.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.19.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.20.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.20.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.21.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.21.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.22.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.22.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.23.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.23.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.24.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.24.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.5.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.5.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.8.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.8.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.9.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/plans/1.6.9.sig +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/runner.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_11_drop_docker_group.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_12_console_shows_ip.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_13_custom_certificate.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_14_certificate_lifetime.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_15_web_port_reaches_caddy.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_16_release_floor_ordering.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_17_service_password.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_18_os_updates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_19_helper_apt_purge.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_20_drop_packagekit.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_21_caddy_pinned.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_22_security_autoupdates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_23_helper_fstab_options.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_24_boot_partition_nofail.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_5_trust_transition.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/migrations/versions/v1_6_9_ntp_servers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/runner.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/condition.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/schema.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/action_validation.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/app.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/bind.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/AccountsView-TbSkH9UL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/AppInitContext-BeNfj23N.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/BackupSection-EvCtwFQL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/BindingMatrix-sRRfB8jC.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/DeviceControlSection-CvFyHv7S.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/DiagnosticsView-rVS5qDH1.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/EntityGrid-Don0ym4o.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/FactoryResetSection-CWLBpFcy.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/FormInputToggle-wkyu5nWZ.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/HaDashboardWizard-Cxcr8qUY.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/HostnameSection-1i8lcR91.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/InputsView-djkHXGOO.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/LocationSection-D2CiUIwU.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/LoggerForm-Jivd_RXP.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/LongPressWrapper-CFu1CzuN.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/MigrationsSection-DEzC0mN6.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/ModbusView-CHatoXuR.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DaxpKeP6.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/NodeRedManagement-KfLTXyHL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/NodeRedView-C_0IlqZ6.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/NumericInput-DGzxoNxg.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/OutputsView-CBLnm1Rx.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/SecurityView-C12Ye4pF.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/SensorView-Cz60X005.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/Sparkline-IwpgUXqb.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/SystemState-2u8fEUcf.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/TemplatesView-8ES2KODg.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/TilePicker-ByrlXspI.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/TimezoneSection-DitamIoS.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/UISettings-D8hwUItg.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-Ch0iC5e1.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/ViewToggle-CTm9ZUC_.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/aiConfig-B7uJx9nA.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/aiWizardPrompt-abAmCO-3.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/axios-DJBeJS4R.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/bodies-CN3Xf7Dt.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/configCache-BS98BpF9.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/dialog-DUHsilMe.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/fa-Bo0hGcDa.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/formatters-Cc0QIRxb.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/gi-BEb-YkSt.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/index-CLjnGlT9.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/index-bS3WyOSw.css +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/monaco-CVsEQEbX.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/monaco-Dw6H67rn.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/rolldown-runtime-hePW80VL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/select-DCMFLjZt.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/index.html +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/sw.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/middleware/csrf.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/middleware/policy.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/rate_limit.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/app.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/static/index.html +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/static/recovery.css +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/recovery/static/recovery.js +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/accounts.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config_core.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/nodered.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/onboarding.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/os_update.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/schedule.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/security.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/sun.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/system.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/routes/update.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/security_headers.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/pyproject.toml +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/setup.cfg +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/setup.py +0 -0
- {boneio-1.6.0.dev17 → boneio-1.6.0.dev18}/tests/test_py313_compatibility.py +0 -0
|
@@ -231,10 +231,12 @@ class StartupFailures:
|
|
|
231
231
|
def allow_one_retry(self) -> None:
|
|
232
232
|
"""Let the next start run normally, but only that one.
|
|
233
233
|
|
|
234
|
-
Called when the owner leaves recovery
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
234
|
+
Called when the owner leaves recovery, and when recovery cannot run
|
|
235
|
+
at all (no ``web`` section, no account to sign in with): without a
|
|
236
|
+
panel, another normal start is the only way out of the loop.
|
|
237
|
+
Clearing the count outright would cost three more crashes - most of
|
|
238
|
+
a minute each on a BeagleBone - before the panel came back if the fix
|
|
239
|
+
did not work; one below the threshold gives the fix a single try.
|
|
238
240
|
"""
|
|
239
241
|
data = self._read()
|
|
240
242
|
if self.count >= CRASH_LOOP_THRESHOLD:
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import threading
|
|
5
|
+
from logging import Formatter
|
|
6
|
+
from typing import IO
|
|
7
|
+
from logging.handlers import RotatingFileHandler
|
|
8
|
+
|
|
9
|
+
from colorlog import ColoredFormatter
|
|
10
|
+
|
|
11
|
+
from boneio.const import PAHO, PYMODBUS
|
|
12
|
+
from boneio.version import __version__
|
|
13
|
+
|
|
14
|
+
_LOGGER = logging.getLogger(__name__)
|
|
15
|
+
_nameToLevel = {
|
|
16
|
+
"CRITICAL": logging.CRITICAL,
|
|
17
|
+
"FATAL": logging.FATAL,
|
|
18
|
+
"ERROR": logging.ERROR,
|
|
19
|
+
"WARN": logging.WARNING,
|
|
20
|
+
"WARNING": logging.WARNING,
|
|
21
|
+
"INFO": logging.INFO,
|
|
22
|
+
"DEBUG": logging.DEBUG,
|
|
23
|
+
"NOTSET": logging.NOTSET,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#: The one logger pymodbus 3.x writes through (its ``Log`` class).
|
|
28
|
+
PYMODBUS_INTERNAL_LOGGER = "pymodbus.logging"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class _PymodbusNoResponseFilter(logging.Filter):
|
|
32
|
+
"""Drop pymodbus's own report of a device that did not answer.
|
|
33
|
+
|
|
34
|
+
pymodbus logs "No response received after N retries" at ERROR and then
|
|
35
|
+
raises ModbusIOException, which boneio.modbus.client catches and reports
|
|
36
|
+
itself — with the device and register, and rate-limited, WARNING once and
|
|
37
|
+
INFO after. Without this the same timeout is logged twice per poll and the
|
|
38
|
+
pymodbus copy stays at ERROR forever. Everything else pymodbus logs is
|
|
39
|
+
left alone.
|
|
40
|
+
|
|
41
|
+
pymodbus replaces the second identical message in a row with
|
|
42
|
+
"Repeating....", so that is dropped too, but only straight after a dropped
|
|
43
|
+
no-response line; after anything else it is the only trace of a repeat.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self) -> None:
|
|
47
|
+
"""Initialize the filter."""
|
|
48
|
+
super().__init__()
|
|
49
|
+
self._dropped_last = False
|
|
50
|
+
|
|
51
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
52
|
+
"""Return False for the duplicated no-response message."""
|
|
53
|
+
msg = str(record.msg)
|
|
54
|
+
if msg.startswith("No response received after"):
|
|
55
|
+
self._dropped_last = True
|
|
56
|
+
return False
|
|
57
|
+
# pymodbus appends the last frames it sent to an error, so the marker
|
|
58
|
+
# is a prefix, not the whole message.
|
|
59
|
+
if msg.startswith("Repeating....") and self._dropped_last:
|
|
60
|
+
return False
|
|
61
|
+
self._dropped_last = False
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
_PYMODBUS_NO_RESPONSE_FILTER = _PymodbusNoResponseFilter()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _configure_pymodbus_filter(log_config: dict, debug: int) -> None:
|
|
69
|
+
"""Install the no-response filter unless the operator asked for pymodbus.
|
|
70
|
+
|
|
71
|
+
An explicit ``logger.logs`` entry for pymodbus, or ``-dd``, means somebody
|
|
72
|
+
wants to see what pymodbus says, so the filter stays off. Removed first
|
|
73
|
+
because this runs again on every config reload.
|
|
74
|
+
"""
|
|
75
|
+
internal = logging.getLogger(PYMODBUS_INTERNAL_LOGGER)
|
|
76
|
+
internal.removeFilter(_PYMODBUS_NO_RESPONSE_FILTER)
|
|
77
|
+
configured = (log_config or {}).get("logs") or {}
|
|
78
|
+
explicit = any(
|
|
79
|
+
name == PYMODBUS or name.startswith(PYMODBUS + ".") for name in configured
|
|
80
|
+
)
|
|
81
|
+
if not explicit and debug <= 1:
|
|
82
|
+
internal.addFilter(_PYMODBUS_NO_RESPONSE_FILTER)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def configure_logger(log_config: dict, debug: int) -> None:
|
|
86
|
+
"""Configure logger based on config yaml."""
|
|
87
|
+
_configure_pymodbus_filter(log_config, debug)
|
|
88
|
+
|
|
89
|
+
def debug_logger():
|
|
90
|
+
# Always suppress hypercorn access logs (they spam INFO level)
|
|
91
|
+
logging.getLogger("hypercorn.access").setLevel(logging.WARNING)
|
|
92
|
+
|
|
93
|
+
if debug == 0:
|
|
94
|
+
logging.getLogger().setLevel(logging.INFO)
|
|
95
|
+
if debug > 0:
|
|
96
|
+
logging.getLogger().setLevel(logging.DEBUG)
|
|
97
|
+
logging.getLogger(PAHO).setLevel(logging.WARN)
|
|
98
|
+
logging.getLogger(PYMODBUS).setLevel(logging.WARN)
|
|
99
|
+
logging.getLogger("pymodbus.client").setLevel(logging.WARN)
|
|
100
|
+
_LOGGER.info("Debug mode active")
|
|
101
|
+
_LOGGER.debug(f"Lib version is {__version__}")
|
|
102
|
+
if debug > 1:
|
|
103
|
+
logging.getLogger(PAHO).setLevel(logging.DEBUG)
|
|
104
|
+
logging.getLogger(PYMODBUS).setLevel(logging.DEBUG)
|
|
105
|
+
logging.getLogger("pymodbus.client").setLevel(logging.DEBUG)
|
|
106
|
+
logging.getLogger("hypercorn.error").setLevel(logging.DEBUG)
|
|
107
|
+
|
|
108
|
+
if not log_config:
|
|
109
|
+
debug_logger()
|
|
110
|
+
return
|
|
111
|
+
default = log_config.get("default", "").upper()
|
|
112
|
+
if default in _nameToLevel:
|
|
113
|
+
_LOGGER.info("Setting default log level to %s", default)
|
|
114
|
+
logging.getLogger().setLevel(_nameToLevel[default])
|
|
115
|
+
if debug == 0:
|
|
116
|
+
debug = -1
|
|
117
|
+
for k, v in log_config.get("logs", {}).items():
|
|
118
|
+
logger = logging.getLogger(k)
|
|
119
|
+
val = v.upper()
|
|
120
|
+
if val in _nameToLevel and logger:
|
|
121
|
+
_LOGGER.info("Setting %s log level to %s", k, val)
|
|
122
|
+
logger.setLevel(_nameToLevel[val])
|
|
123
|
+
debug_logger()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
"""Shared logging configuration for BoneIO."""
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
_nameToLevel = {
|
|
130
|
+
"CRITICAL": logging.CRITICAL,
|
|
131
|
+
"FATAL": logging.FATAL,
|
|
132
|
+
"ERROR": logging.ERROR,
|
|
133
|
+
"WARN": logging.WARNING,
|
|
134
|
+
"WARNING": logging.WARNING,
|
|
135
|
+
"INFO": logging.INFO,
|
|
136
|
+
"DEBUG": logging.DEBUG,
|
|
137
|
+
"NOTSET": logging.NOTSET,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
def get_log_level(level_name: str) -> int:
|
|
141
|
+
"""Convert string log level to logging constant."""
|
|
142
|
+
return _nameToLevel.get(level_name.upper(), logging.INFO)
|
|
143
|
+
|
|
144
|
+
def is_running_under_systemd():
|
|
145
|
+
"""Check if the process is running under systemd."""
|
|
146
|
+
return os.getenv('JOURNAL_STREAM') is not None
|
|
147
|
+
|
|
148
|
+
def is_journal_stream(stream: IO | None) -> bool:
|
|
149
|
+
"""Whether ``stream`` is the one systemd connected to the journal.
|
|
150
|
+
|
|
151
|
+
systemd sets JOURNAL_STREAM to "device:inode" of the socket it gave the
|
|
152
|
+
service as stdout/stderr (systemd.exec(5)). The variable alone is not
|
|
153
|
+
enough: a child of boneIO inherits it with its stderr piped elsewhere, and
|
|
154
|
+
there a level prefix would be noise in somebody else's output.
|
|
155
|
+
"""
|
|
156
|
+
value = os.environ.get("JOURNAL_STREAM")
|
|
157
|
+
if not value or stream is None:
|
|
158
|
+
return False
|
|
159
|
+
try:
|
|
160
|
+
device, inode = (int(part) for part in value.split(":"))
|
|
161
|
+
st = os.fstat(stream.fileno())
|
|
162
|
+
except (ValueError, OSError, AttributeError):
|
|
163
|
+
# io.UnsupportedOperation (no real fd, e.g. pytest's capture) is
|
|
164
|
+
# both an OSError and a ValueError.
|
|
165
|
+
return False
|
|
166
|
+
return (st.st_dev, st.st_ino) == (device, inode)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def syslog_priority(levelno: int) -> int:
|
|
170
|
+
"""Map a logging level to the syslog priority journald files it under."""
|
|
171
|
+
if levelno >= logging.CRITICAL:
|
|
172
|
+
return 2
|
|
173
|
+
if levelno >= logging.ERROR:
|
|
174
|
+
return 3
|
|
175
|
+
if levelno >= logging.WARNING:
|
|
176
|
+
return 4
|
|
177
|
+
if levelno >= logging.INFO:
|
|
178
|
+
return 6
|
|
179
|
+
return 7
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class JournalLevelFormatter(Formatter):
|
|
183
|
+
"""Prefix every line of a record with its level for journald.
|
|
184
|
+
|
|
185
|
+
journald reads what a service writes to stdout/stderr line by line and
|
|
186
|
+
files each line at PRIORITY=6 unless it starts with "<N>" (the sd-daemon
|
|
187
|
+
prefix; SyslogLevelPrefix= is on by default). boneIO wrote plain text, so
|
|
188
|
+
its warnings, errors and tracebacks were all "info" to the journal - and
|
|
189
|
+
never reached the serial console, which since 1.6.25 shows warning and
|
|
190
|
+
above. A traceback is one record but many lines, and journald makes each
|
|
191
|
+
line a separate entry, so every line gets the prefix, not just the first.
|
|
192
|
+
journald strips it again; the stored message is unchanged.
|
|
193
|
+
|
|
194
|
+
Only the formatted text is prefixed. The record, including the traceback
|
|
195
|
+
text the base class caches on it, is left alone for the other handlers.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
def __init__(self, inner: Formatter) -> None:
|
|
199
|
+
"""Wrap ``inner``, which does the actual formatting."""
|
|
200
|
+
super().__init__()
|
|
201
|
+
self._inner = inner
|
|
202
|
+
|
|
203
|
+
def format(self, record: logging.LogRecord) -> str:
|
|
204
|
+
"""Format with the inner formatter and prefix each line."""
|
|
205
|
+
prefix = f"<{syslog_priority(record.levelno)}>"
|
|
206
|
+
text = self._inner.format(record)
|
|
207
|
+
return "\n".join(prefix + line for line in text.split("\n"))
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def get_log_formatter(color: bool = True, stream: IO | None = None) -> Formatter:
|
|
211
|
+
"""Get log formatter with optional color support.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
color: Colour the output by level.
|
|
215
|
+
stream: Stream the handler writes to. When it is the journal, the
|
|
216
|
+
formatter tells journald each line's level and drops the colours:
|
|
217
|
+
journald keeps a message with escape codes as a byte array rather
|
|
218
|
+
than text, the level now travels in PRIORITY (journalctl colours
|
|
219
|
+
by it), and the prefix has to be the first thing on the line.
|
|
220
|
+
"""
|
|
221
|
+
if is_journal_stream(stream):
|
|
222
|
+
return JournalLevelFormatter(
|
|
223
|
+
Formatter("%(levelname)s (%(threadName)s) [%(name)s] %(message)s")
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# When running under systemd, omit timestamp since journald adds it
|
|
227
|
+
if is_running_under_systemd():
|
|
228
|
+
log_format = "%(levelname)s (%(threadName)s) [%(name)s] %(message)s"
|
|
229
|
+
else:
|
|
230
|
+
log_format = "%(asctime)s %(levelname)s (%(threadName)s) [%(name)s] %(message)s"
|
|
231
|
+
|
|
232
|
+
date_format = "%Y-%m-%d %H:%M:%S"
|
|
233
|
+
|
|
234
|
+
if color:
|
|
235
|
+
colored_format = "%(log_color)s" + log_format + "%(reset)s"
|
|
236
|
+
return ColoredFormatter(
|
|
237
|
+
fmt=colored_format,
|
|
238
|
+
datefmt=date_format,
|
|
239
|
+
reset=True,
|
|
240
|
+
log_colors={
|
|
241
|
+
"DEBUG": "cyan",
|
|
242
|
+
"INFO": "green",
|
|
243
|
+
"WARNING": "yellow",
|
|
244
|
+
"ERROR": "red",
|
|
245
|
+
"CRITICAL": "red",
|
|
246
|
+
},
|
|
247
|
+
)
|
|
248
|
+
return Formatter(log_format, datefmt=date_format)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def install_excepthooks() -> None:
|
|
252
|
+
"""Send exceptions nobody caught through logging instead of bare stderr.
|
|
253
|
+
|
|
254
|
+
Python prints an uncaught exception straight to stderr, which under
|
|
255
|
+
systemd means one journal entry per traceback line, all at "info" - so
|
|
256
|
+
the one message that explains why boneIO died never reached the serial
|
|
257
|
+
console. Through logging it gets the level prefix like everything else.
|
|
258
|
+
An exception in the main thread ends the process and is CRITICAL; one
|
|
259
|
+
that ends another thread is ERROR, since boneIO carries on without it.
|
|
260
|
+
Ctrl+C keeps Python's usual short output, and a thread ending with
|
|
261
|
+
SystemExit stays silent, as it is by default.
|
|
262
|
+
"""
|
|
263
|
+
logger = logging.getLogger("boneio")
|
|
264
|
+
|
|
265
|
+
def _log_uncaught(exc_type, exc_value, exc_traceback) -> None:
|
|
266
|
+
if issubclass(exc_type, KeyboardInterrupt):
|
|
267
|
+
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
268
|
+
return
|
|
269
|
+
try:
|
|
270
|
+
logger.critical(
|
|
271
|
+
"Uncaught exception, boneIO is exiting",
|
|
272
|
+
exc_info=(exc_type, exc_value, exc_traceback),
|
|
273
|
+
)
|
|
274
|
+
except Exception: # noqa: BLE001 - the traceback must come out somehow
|
|
275
|
+
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
276
|
+
|
|
277
|
+
def _log_uncaught_in_thread(args: threading.ExceptHookArgs) -> None:
|
|
278
|
+
if args.exc_type is SystemExit:
|
|
279
|
+
return
|
|
280
|
+
try:
|
|
281
|
+
logger.error(
|
|
282
|
+
"Uncaught exception in thread %s",
|
|
283
|
+
args.thread.name if args.thread is not None else "unknown",
|
|
284
|
+
exc_info=(args.exc_type, args.exc_value, args.exc_traceback),
|
|
285
|
+
)
|
|
286
|
+
except Exception: # noqa: BLE001
|
|
287
|
+
threading.__excepthook__(args)
|
|
288
|
+
|
|
289
|
+
sys.excepthook = _log_uncaught
|
|
290
|
+
threading.excepthook = _log_uncaught_in_thread
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def setup_logging(debug_level: int = 0) -> None:
|
|
294
|
+
"""Setup logging configuration."""
|
|
295
|
+
log_format = "%(asctime)s %(levelname)s (%(threadName)s) [%(name)s] %(message)s"
|
|
296
|
+
date_format = "%Y-%m-%d %H:%M:%S"
|
|
297
|
+
|
|
298
|
+
# Set up basic configuration for console output
|
|
299
|
+
logging.basicConfig(
|
|
300
|
+
level=logging.INFO if debug_level == 0 else logging.DEBUG,
|
|
301
|
+
format=log_format,
|
|
302
|
+
datefmt=date_format
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Create console handler
|
|
306
|
+
console_handler = logging.StreamHandler()
|
|
307
|
+
console_handler.setLevel(logging.INFO if debug_level == 0 else logging.DEBUG)
|
|
308
|
+
|
|
309
|
+
# Create formatter for console handler. basicConfig's handler writes to
|
|
310
|
+
# stderr; the formatter needs to know whether that is the journal.
|
|
311
|
+
root_handler = logging.getLogger().handlers[0]
|
|
312
|
+
console_formatter = get_log_formatter(
|
|
313
|
+
color=True, stream=getattr(root_handler, "stream", None)
|
|
314
|
+
)
|
|
315
|
+
console_handler.setFormatter(console_formatter)
|
|
316
|
+
|
|
317
|
+
# Add console handler to root logger
|
|
318
|
+
root_handler.setFormatter(console_formatter)
|
|
319
|
+
install_excepthooks()
|
|
320
|
+
|
|
321
|
+
# If debug level > 1, also log to file with rotation
|
|
322
|
+
if debug_level > 1:
|
|
323
|
+
# Get the config directory path
|
|
324
|
+
# config_dir = os.path.dirname(os.path.abspath(os.environ.get("BONEIO_CONFIG", "/tmp")))
|
|
325
|
+
new_config_dir = "/tmp"
|
|
326
|
+
log_file = os.path.join(new_config_dir, "boneio.log")
|
|
327
|
+
|
|
328
|
+
# Create rotating file handler (10MB max size, keep 3 backup files)
|
|
329
|
+
file_handler = RotatingFileHandler(
|
|
330
|
+
log_file,
|
|
331
|
+
maxBytes=10 * 1024 * 1024, # 10MB
|
|
332
|
+
backupCount=3,
|
|
333
|
+
encoding='utf-8'
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
# Set formatter for file handler
|
|
337
|
+
formatter = logging.Formatter(log_format, date_format)
|
|
338
|
+
file_handler.setFormatter(formatter)
|
|
339
|
+
|
|
340
|
+
# Set level for file handler
|
|
341
|
+
file_handler.setLevel(logging.DEBUG)
|
|
342
|
+
|
|
343
|
+
# Add handler to root logger
|
|
344
|
+
logging.getLogger().addHandler(file_handler)
|
|
345
|
+
|
|
346
|
+
logging.info("File logging enabled at: %s", log_file)
|
|
@@ -208,6 +208,11 @@ def draw_crash(exception: BaseException, device: Any | None = None) -> None:
|
|
|
208
208
|
This function ALWAYS works, even after handoff() — crashes must be
|
|
209
209
|
visible to the user regardless of which component owns the screen.
|
|
210
210
|
|
|
211
|
+
It also marks the display to survive the exit. Every caller returns 1
|
|
212
|
+
straight after drawing, and luma's atexit hook would otherwise blank
|
|
213
|
+
the panel a moment later - the message was up for about a second, then
|
|
214
|
+
the cabinet showed a black screen until systemd's next start.
|
|
215
|
+
|
|
211
216
|
Args:
|
|
212
217
|
exception: The exception that caused the crash.
|
|
213
218
|
device: Optional device override; uses singleton if not provided.
|
|
@@ -223,6 +228,7 @@ def draw_crash(exception: BaseException, device: Any | None = None) -> None:
|
|
|
223
228
|
detail=exc_msg,
|
|
224
229
|
device=device,
|
|
225
230
|
)
|
|
231
|
+
keep_on_exit(device)
|
|
226
232
|
finally:
|
|
227
233
|
_taken_over = was_taken_over
|
|
228
234
|
|
|
@@ -274,6 +280,23 @@ def draw_recovery(title: str, message: str, url: str | None = None, device: Any
|
|
|
274
280
|
_LOGGER.debug("Failed to draw recovery notice on OLED: %s", err)
|
|
275
281
|
|
|
276
282
|
|
|
283
|
+
def keep_on_exit(device: Any | None = None) -> None:
|
|
284
|
+
"""Leave whatever is on the display there when the process exits.
|
|
285
|
+
|
|
286
|
+
luma registers an atexit hook that switches the panel off and clears it
|
|
287
|
+
unless the device is marked ``persist``. Right for a clean shutdown, but
|
|
288
|
+
a message drawn just before a deliberate exit - one systemd will follow
|
|
289
|
+
with another start - would otherwise vanish with the process and leave
|
|
290
|
+
the cabinet with a black screen instead of the reason.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
device: Optional device override; uses singleton if not provided.
|
|
294
|
+
"""
|
|
295
|
+
dev = device or _early_device
|
|
296
|
+
if dev is not None:
|
|
297
|
+
dev.persist = True
|
|
298
|
+
|
|
299
|
+
|
|
277
300
|
def clear_display(device: Any | None = None) -> None:
|
|
278
301
|
"""Clear the OLED display (turn all pixels off).
|
|
279
302
|
|
|
@@ -14,6 +14,7 @@ from gpiod import LineSettings
|
|
|
14
14
|
from gpiod.line import Bias, Direction, Edge
|
|
15
15
|
|
|
16
16
|
from boneio.const import PINS
|
|
17
|
+
from boneio.hardware.udev_wait import RETRY_SECONDS, NodeWait, is_not_ready
|
|
17
18
|
|
|
18
19
|
if TYPE_CHECKING:
|
|
19
20
|
from boneio.components.input.detectors import BinarySensorDetector, MultiClickDetector
|
|
@@ -52,6 +53,8 @@ class GpioManager:
|
|
|
52
53
|
if debounce_ms > self.MAX_DEBOUNCE_MS:
|
|
53
54
|
raise ValueError(f"debounce_ms={debounce_ms} exceeds BeagleBone hardware limit of {self.MAX_DEBOUNCE_MS}ms")
|
|
54
55
|
self._loop = loop
|
|
56
|
+
# Awaited between attempts to open a chip; a test swaps in a fake clock.
|
|
57
|
+
self._sleep = asyncio.sleep
|
|
55
58
|
self._debounce_ms = debounce_ms
|
|
56
59
|
self._inputs: list[GpioInputDefinition] = []
|
|
57
60
|
self._requests: dict[int, gpiod.LineRequest] = {}
|
|
@@ -176,6 +179,41 @@ class GpioManager:
|
|
|
176
179
|
|
|
177
180
|
return successful_lines, failed_lines
|
|
178
181
|
|
|
182
|
+
async def _request_lines_when_ready(
|
|
183
|
+
self, chip: int, consumer: str, config: dict[tuple[int, ...], LineSettings]
|
|
184
|
+
) -> gpiod.LineRequest:
|
|
185
|
+
"""Request the chip's lines, waiting for udev if it has to.
|
|
186
|
+
|
|
187
|
+
On the first boot of a fresh image boneIO can get here before udev
|
|
188
|
+
has handed /dev/gpiochip* to the gpio group. One attempt used to be
|
|
189
|
+
all there was: the chip was logged as failed and skipped, and its
|
|
190
|
+
inputs stayed dead until someone restarted boneIO by hand. Now a
|
|
191
|
+
missing or not yet accessible chip is retried once a second within
|
|
192
|
+
the startup budget shared with the I2C bus
|
|
193
|
+
(:mod:`boneio.hardware.udev_wait`). The sleep is awaited, so the event
|
|
194
|
+
loop keeps running. When the budget runs out, or on any other error,
|
|
195
|
+
the original error is raised and start() reports and skips the chip
|
|
196
|
+
as before.
|
|
197
|
+
"""
|
|
198
|
+
path = f"/dev/gpiochip{chip}"
|
|
199
|
+
node = NodeWait(path, _LOGGER)
|
|
200
|
+
while True:
|
|
201
|
+
try:
|
|
202
|
+
request = gpiod.request_lines(
|
|
203
|
+
path,
|
|
204
|
+
consumer=consumer,
|
|
205
|
+
config=config, # type: ignore[arg-type]
|
|
206
|
+
)
|
|
207
|
+
except OSError as err:
|
|
208
|
+
if node.retry(err):
|
|
209
|
+
await self._sleep(RETRY_SECONDS)
|
|
210
|
+
continue
|
|
211
|
+
if node.waiting and is_not_ready(err):
|
|
212
|
+
_LOGGER.error("%s still not accessible after %.0f s", path, node.elapsed)
|
|
213
|
+
raise
|
|
214
|
+
node.opened()
|
|
215
|
+
return request
|
|
216
|
+
|
|
179
217
|
async def start(self, debug_mode: bool = False) -> None:
|
|
180
218
|
"""Start monitoring GPIO inputs.
|
|
181
219
|
|
|
@@ -250,11 +288,7 @@ class GpioManager:
|
|
|
250
288
|
|
|
251
289
|
# Request all lines at once (fast mode or after debug validation)
|
|
252
290
|
try:
|
|
253
|
-
request =
|
|
254
|
-
f"/dev/gpiochip{chip}",
|
|
255
|
-
consumer=consumer,
|
|
256
|
-
config=config, # type: ignore[arg-type]
|
|
257
|
-
)
|
|
291
|
+
request = await self._request_lines_when_ready(chip, consumer, config)
|
|
258
292
|
self._requests[chip] = request
|
|
259
293
|
_LOGGER.info("✓ Successfully configured chip %d with %d lines", chip, len(config))
|
|
260
294
|
except OSError as err:
|
|
@@ -8,11 +8,14 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import logging
|
|
10
10
|
import threading
|
|
11
|
+
import time
|
|
11
12
|
from contextlib import suppress
|
|
12
13
|
from typing import Optional
|
|
13
14
|
|
|
14
15
|
from smbus2 import SMBus, i2c_msg
|
|
15
16
|
|
|
17
|
+
from boneio.hardware.udev_wait import RETRY_SECONDS, STARTUP_WAIT_SECONDS, NodeWait, is_not_ready
|
|
18
|
+
|
|
16
19
|
_LOGGER = logging.getLogger(__name__)
|
|
17
20
|
|
|
18
21
|
|
|
@@ -29,18 +32,56 @@ class SMBus2I2C:
|
|
|
29
32
|
bus_number: I2C bus number (typically 2 for BeagleBone Black)
|
|
30
33
|
"""
|
|
31
34
|
|
|
32
|
-
def __init__(self, bus_number: int = 2):
|
|
35
|
+
def __init__(self, bus_number: int = 2, startup_wait: float = STARTUP_WAIT_SECONDS):
|
|
33
36
|
"""Initialize I2C bus wrapper.
|
|
34
37
|
|
|
35
38
|
Args:
|
|
36
39
|
bus_number: I2C bus number (default 2 for BBB I2C-2)
|
|
40
|
+
startup_wait: Seconds to keep retrying while the device node is
|
|
41
|
+
missing or not accessible yet, within the startup budget it
|
|
42
|
+
shares with the GPIO chips, see
|
|
43
|
+
:data:`boneio.hardware.udev_wait.STARTUP_WAIT_SECONDS`.
|
|
37
44
|
"""
|
|
38
45
|
self._bus_number = bus_number
|
|
39
46
|
self._bus: SMBus | None = None
|
|
40
47
|
self._lock = threading.RLock() # Reentrant lock for thread safety
|
|
41
|
-
self.
|
|
48
|
+
self._open_bus_when_ready(startup_wait)
|
|
42
49
|
_LOGGER.info("Initialized I2C wrapper on bus %d (smbus2)", bus_number)
|
|
43
50
|
|
|
51
|
+
def _open_bus_when_ready(self, wait: float) -> None:
|
|
52
|
+
"""Open the bus for the first time, waiting for udev if it has to.
|
|
53
|
+
|
|
54
|
+
Only construction waits. A reopen later on (``__enter__``,
|
|
55
|
+
``try_lock``) runs on the event loop, where blocking for a minute
|
|
56
|
+
would stall everything else; there the device node has long been set
|
|
57
|
+
up, so a failure is a real one.
|
|
58
|
+
|
|
59
|
+
Only "not there" and "not ours yet" are waited out - the two states
|
|
60
|
+
udev leaves the node in before its rule has run. Anything else fails
|
|
61
|
+
at once, as before, and so does the last attempt: the original error
|
|
62
|
+
is re-raised, so the crash reads the same as it always did.
|
|
63
|
+
"""
|
|
64
|
+
path = f"/dev/i2c-{self._bus_number}"
|
|
65
|
+
# The clock is looked up here, not in NodeWait, so a test that swaps
|
|
66
|
+
# this module's ``time`` moves the deadline and the sleep together.
|
|
67
|
+
node = NodeWait(path, _LOGGER, wait=wait, clock=time.monotonic)
|
|
68
|
+
while True:
|
|
69
|
+
try:
|
|
70
|
+
# Not _open_bus(): that logs an ERROR per failure, and a wait
|
|
71
|
+
# would fill the journal with them.
|
|
72
|
+
self._bus = SMBus(self._bus_number)
|
|
73
|
+
break
|
|
74
|
+
except OSError as err:
|
|
75
|
+
if node.retry(err):
|
|
76
|
+
time.sleep(RETRY_SECONDS)
|
|
77
|
+
continue
|
|
78
|
+
if node.waiting and is_not_ready(err):
|
|
79
|
+
_LOGGER.error("%s still not accessible after %.0f s: %s", path, node.elapsed, err)
|
|
80
|
+
else:
|
|
81
|
+
_LOGGER.error(f"Failed to open I2C bus {self._bus_number}: {err}")
|
|
82
|
+
raise
|
|
83
|
+
node.opened()
|
|
84
|
+
|
|
44
85
|
def _open_bus(self) -> None:
|
|
45
86
|
"""Open I2C bus if not already open."""
|
|
46
87
|
if self._bus is None:
|