From b5890bb4978484a040b666afe869fb76f1b06a24 Mon Sep 17 00:00:00 2001 From: g4bri3lDev Date: Mon, 3 Aug 2026 23:01:11 +0200 Subject: [PATCH] Bump py-opendisplay to 7.15.0 (#177405) --- .../components/opendisplay/__init__.py | 2 +- .../components/opendisplay/diagnostics.py | 15 +++++++- .../components/opendisplay/manifest.json | 2 +- requirements_all.txt | 2 +- tests/components/opendisplay/__init__.py | 34 +++++++++++++++-- .../snapshots/test_diagnostics.ambr | 38 +++++++++++++++++-- tests/components/opendisplay/test_init.py | 1 + tests/components/opendisplay/test_sensor.py | 32 +++------------- 8 files changed, 88 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/opendisplay/__init__.py b/homeassistant/components/opendisplay/__init__.py index 3d31947aac64..54b8001a7d99 100644 --- a/homeassistant/components/opendisplay/__init__.py +++ b/homeassistant/components/opendisplay/__init__.py @@ -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}" diff --git a/homeassistant/components/opendisplay/diagnostics.py b/homeassistant/components/opendisplay/diagnostics.py index 0fd89c3c73ad..0b8c54ba4a56 100644 --- a/homeassistant/components/opendisplay/diagnostics.py +++ b/homeassistant/components/opendisplay/diagnostics.py @@ -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, diff --git a/homeassistant/components/opendisplay/manifest.json b/homeassistant/components/opendisplay/manifest.json index d4335689e53c..1aa0ec871d2c 100644 --- a/homeassistant/components/opendisplay/manifest.json +++ b/homeassistant/components/opendisplay/manifest.json @@ -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"] } diff --git a/requirements_all.txt b/requirements_all.txt index 90b70f8be763..860229c36c01 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 diff --git a/tests/components/opendisplay/__init__.py b/tests/components/opendisplay/__init__.py index 9edd808be405..e664db999069 100644 --- a/tests/components/opendisplay/__init__.py +++ b/tests/components/opendisplay/__init__.py @@ -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", + ), ) diff --git a/tests/components/opendisplay/snapshots/test_diagnostics.ambr b/tests/components/opendisplay/snapshots/test_diagnostics.ambr index d3f1f2b23dc0..d49308cebb2c 100644 --- a/tests/components/opendisplay/snapshots/test_diagnostics.ambr +++ b/tests/components/opendisplay/snapshots/test_diagnostics.ambr @@ -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, diff --git a/tests/components/opendisplay/test_init.py b/tests/components/opendisplay/test_init.py index fe4548a88fa1..7a285a4f51b3 100644 --- a/tests/components/opendisplay/test_init.py +++ b/tests/components/opendisplay/test_init.py @@ -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 diff --git a/tests/components/opendisplay/test_sensor.py b/tests/components/opendisplay/test_sensor.py index 0307eb2a4e2a..e8e652268794 100644 --- a/tests/components/opendisplay/test_sensor.py +++ b/tests/components/opendisplay/test_sensor.py @@ -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