Bump py-opendisplay to 7.15.0 (#177405)

This commit is contained in:
g4bri3lDev
2026-08-03 23:01:11 +02:00
committed by GitHub
parent 206227238c
commit b5890bb497
8 changed files with 88 additions and 38 deletions
@@ -142,7 +142,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: OpenDisplayConfigEntry)
connections={(CONNECTION_BLUETOOTH, address)},
manufacturer=manufacturer.manufacturer_name,
model=f"{size} {color_scheme}",
sw_version=f"{fw['major']}.{fw['minor']}",
sw_version=f"{fw['major']}.{fw['minor']}.{fw['patch']}",
hw_version=(
f"{manufacturer.board_type_name or manufacturer.board_type}"
f" rev. {manufacturer.board_revision}"
@@ -8,7 +8,19 @@ from homeassistant.core import HomeAssistant
from . import OpenDisplayConfigEntry
TO_REDACT = {"ssid", "password", "server_url"}
TO_REDACT = {
"ssid",
"password",
"server_url",
"serial_number",
"friendly_name",
"device_location",
"device_id",
"custom_string_1",
"custom_string_2",
"custom_string_3",
"encryption_key",
}
def _asdict(obj: Any) -> Any:
@@ -33,6 +45,7 @@ async def async_get_config_entry_diagnostics(
"firmware": {
"major": fw["major"],
"minor": fw["minor"],
"patch": fw["patch"],
"sha": fw["sha"],
},
"is_flex": runtime.is_flex,
@@ -15,5 +15,5 @@
"iot_class": "local_push",
"loggers": ["opendisplay"],
"quality_scale": "silver",
"requirements": ["py-opendisplay==7.2.3"]
"requirements": ["py-opendisplay==7.15.0"]
}
+1 -1
View File
@@ -1956,7 +1956,7 @@ py-nightscout==1.2.2
py-nymta==0.4.0
# homeassistant.components.opendisplay
py-opendisplay==7.2.3
py-opendisplay==7.15.0
# homeassistant.components.schluter
py-schluter==0.1.7
+30 -4
View File
@@ -7,10 +7,12 @@ from opendisplay import (
BinaryInputs,
BoardManufacturer,
ColorScheme,
DataExtended,
DisplayConfig,
GlobalConfig,
ManufacturerData,
PowerOption,
SecurityConfig,
SystemConfig,
)
@@ -28,8 +30,8 @@ TEST_ADDRESS = "AA:BB:CC:DD:EE:FF"
TEST_TITLE = "OpenDisplay 1234"
ENCRYPTION_KEY = "aabbccddee112233aabbccddee112233" # 32 hex chars = 16 bytes
# Firmware version response: major=1, minor=2, sha="abc123"
FIRMWARE_VERSION = {"major": 1, "minor": 2, "sha": "abc123"}
# Firmware version response: major=1, minor=2, patch=3, sha="abc123"
FIRMWARE_VERSION = {"major": 1, "minor": 2, "patch": 3, "sha": "abc123"}
DEVICE_CONFIG = GlobalConfig(
system=SystemConfig(
@@ -43,7 +45,7 @@ DEVICE_CONFIG = GlobalConfig(
manufacturer_id=BoardManufacturer.SEEED,
board_type=1,
board_revision=0,
reserved=b"\x00" * 18,
reserved=b"\x00" * 6,
),
power=PowerOption(
power_mode=0,
@@ -58,7 +60,12 @@ DEVICE_CONFIG = GlobalConfig(
voltage_scaling_factor=0,
deep_sleep_current_ua=0,
deep_sleep_time_seconds=0,
reserved=b"\x00" * 12,
charge_enable_pin=0xFF,
charge_state_pin=0xFF,
charger_flags=0,
min_wake_time_seconds=0,
screen_timeout_seconds=0,
reserved=b"\x00" * 4,
),
displays=[
DisplayConfig(
@@ -85,6 +92,25 @@ DEVICE_CONFIG = GlobalConfig(
reserved=b"\x00" * 33,
)
],
security_config=SecurityConfig(
encryption_enabled=1,
encryption_key=bytes.fromhex(ENCRYPTION_KEY),
session_timeout_seconds=0,
flags=0,
reset_pin=0xFF,
reserved=b"\x00" * 43,
),
data_extended=DataExtended.from_strings(
manufacturer_name="Seeed Studio",
model_name="XIAO EN04(NRF52840)",
serial_number="SN-0123456789",
friendly_name="Living Room Tag",
device_location="Living Room",
device_id="device-1234",
custom_string_1="custom one",
custom_string_2="custom two",
custom_string_3="custom three",
),
)
@@ -8,6 +8,17 @@
]),
'data_buses': list([
]),
'data_extended': dict({
'custom_string_1': '**REDACTED**',
'custom_string_2': '**REDACTED**',
'custom_string_3': '**REDACTED**',
'device_id': '**REDACTED**',
'device_location': '**REDACTED**',
'friendly_name': '**REDACTED**',
'manufacturer_name': '53656565642053747564696f0000000000000000000000000000000000000000',
'model_name': '5849414f20454e3034284e524635323834302900000000000000000000000000',
'serial_number': '**REDACTED**',
}),
'displays': list([
dict({
'active_height_mm': 29,
@@ -33,6 +44,8 @@
'transmission_modes': 1,
}),
]),
'flash_configs': list([
]),
'leds': list([
]),
'loaded': False,
@@ -40,25 +53,43 @@
'board_revision': 0,
'board_type': 1,
'manufacturer_id': 1,
'reserved': '000000000000000000000000000000000000',
'reserved': '000000000000',
'simple_config_configured_at': 0,
'simple_config_display_index': 0,
'simple_config_driver_index': 0,
'simple_config_power_index': 0,
}),
'minor_version': 0,
'nfc_configs': list([
]),
'power': dict({
'battery_capacity_mah': '000000',
'battery_sense_enable_pin': 255,
'battery_sense_flags': 0,
'battery_sense_pin': 255,
'capacity_estimator': 0,
'charge_enable_pin': 255,
'charge_state_pin': 255,
'charger_flags': 0,
'deep_sleep_current_ua': 0,
'deep_sleep_time_seconds': 0,
'min_wake_time_seconds': 0,
'power_mode': 0,
'reserved': '000000000000000000000000',
'reserved': '00000000',
'screen_timeout_seconds': 0,
'sleep_flags': 0,
'sleep_timeout_ms': 0,
'tx_power': 0,
'voltage_scaling_factor': 0,
}),
'security_config': None,
'security_config': dict({
'encryption_enabled': 1,
'encryption_key': '**REDACTED**',
'flags': 0,
'reserved': '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'reset_pin': 255,
'session_timeout_seconds': 0,
}),
'sensors': list([
]),
'system': dict({
@@ -78,6 +109,7 @@
'firmware': dict({
'major': 1,
'minor': 2,
'patch': 3,
'sha': 'abc123',
}),
'is_flex': True,
@@ -145,6 +145,7 @@ async def test_setup_device_registry_fields(
)
assert len(devices) == 1
device = devices[0]
assert device.sw_version == "1.2.3"
assert (device.hw_version is not None) == expect_hw_version
assert (device.configuration_url is not None) == expect_config_url
+5 -27
View File
@@ -2,13 +2,13 @@
from collections.abc import Awaitable, Callable
from copy import deepcopy
from dataclasses import replace
from datetime import timedelta
import time
from unittest.mock import MagicMock
from habluetooth import CONNECTABLE_FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS
from opendisplay import voltage_to_percent
from opendisplay.models.config import PowerOption
from opendisplay.models.enums import CapacityEstimator, PowerMode
import pytest
from syrupy.assertion import SnapshotAssertion
@@ -78,21 +78,10 @@ async def test_sensor_entities_battery_device(
) -> None:
"""Test sensor entities for a battery-powered Flex device with LI_ION chemistry."""
device_config = deepcopy(DEVICE_CONFIG)
power = device_config.power
device_config.power = PowerOption(
device_config.power = replace(
device_config.power,
power_mode=PowerMode.BATTERY,
battery_capacity_mah=power.battery_capacity_mah,
sleep_timeout_ms=power.sleep_timeout_ms,
tx_power=power.tx_power,
sleep_flags=power.sleep_flags,
battery_sense_pin=power.battery_sense_pin,
battery_sense_enable_pin=power.battery_sense_enable_pin,
battery_sense_flags=power.battery_sense_flags,
capacity_estimator=1, # LI_ION
voltage_scaling_factor=power.voltage_scaling_factor,
deep_sleep_current_ua=power.deep_sleep_current_ua,
deep_sleep_time_seconds=power.deep_sleep_time_seconds,
reserved=power.reserved,
)
mock_opendisplay_device.config = device_config
@@ -199,21 +188,10 @@ async def test_battery_sensor_defaults_to_liion_when_capacity_estimator_unset(
) -> None:
"""Test battery % uses LI_ION when capacity_estimator is 0."""
device_config = deepcopy(DEVICE_CONFIG)
power = device_config.power
device_config.power = PowerOption(
device_config.power = replace(
device_config.power,
power_mode=PowerMode.BATTERY,
battery_capacity_mah=power.battery_capacity_mah,
sleep_timeout_ms=power.sleep_timeout_ms,
tx_power=power.tx_power,
sleep_flags=power.sleep_flags,
battery_sense_pin=power.battery_sense_pin,
battery_sense_enable_pin=power.battery_sense_enable_pin,
battery_sense_flags=power.battery_sense_flags,
capacity_estimator=0, # not configured — defaults to LI_ION in sensor.py
voltage_scaling_factor=power.voltage_scaling_factor,
deep_sleep_current_ua=power.deep_sleep_current_ua,
deep_sleep_time_seconds=power.deep_sleep_time_seconds,
reserved=power.reserved,
)
mock_opendisplay_device.config = device_config