From 5359a8bf26dcf2ad7fc85d1d02f3900e56f90cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Thu, 25 Dec 2025 14:15:06 +0200 Subject: [PATCH] Tidy up various Huawei LTE sensor values for display (#159728) --- homeassistant/components/huawei_lte/sensor.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 8f31ffd593b..ae63b67596c 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -6,6 +6,7 @@ from bisect import bisect from collections.abc import Callable, Sequence from dataclasses import dataclass from datetime import datetime, timedelta +import ipaddress import logging import re @@ -85,6 +86,17 @@ def format_last_reset_elapsed_seconds(value: str | None) -> datetime | None: return last_reset +def format_ipv6(value: StateType) -> tuple[StateType, str | None]: + """Format an IPv6 address for tidy display. + + Raw values from the device may contain uppercase and redundant segments. + """ + try: + return str(ipaddress.IPv6Address(str(value))), None + except ValueError: + return value, None + + def signal_icon(limits: Sequence[int], value: StateType) -> str: """Get signal icon.""" return ( @@ -139,6 +151,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { key="uptime", translation_key="uptime", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -151,6 +164,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { "WanIPv6Address": HuaweiSensorEntityDescription( key="WanIPv6Address", translation_key="wan_ipv6_address", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), }, @@ -200,11 +214,13 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { translation_key="downlink_bandwidth", # https://en.wikipedia.org/wiki/LTE_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((8, 15), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "dlfrequency": HuaweiSensorEntityDescription( key="dlfrequency", translation_key="downlink_frequency", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -317,6 +333,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSRP_and_RSRQ icon_fn=lambda x: signal_icon((-100, -90, -80), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -337,6 +354,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/SINR icon_fn=lambda x: signal_icon((0, 13, 20), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -360,6 +378,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { translation_key="nrulbandwidth", # https://en.wikipedia.org/wiki/5G_NR_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((33, 66), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "nrulmcs": HuaweiSensorEntityDescription( @@ -402,6 +421,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSRP_and_RSRQ icon_fn=lambda x: signal_icon((-100, -90, -80), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -422,6 +442,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/RSSI icon_fn=lambda x: signal_icon((-95, -85, -75), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -443,6 +464,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { device_class=SensorDeviceClass.SIGNAL_STRENGTH, # https://wiki.teltonika-networks.com/view/SINR icon_fn=lambda x: signal_icon((0, 13, 20), x), + suggested_display_precision=0, state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=True, @@ -486,17 +508,20 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { translation_key="uplink_bandwidth", # https://en.wikipedia.org/wiki/LTE_frequency_bands, arbitrary icon_fn=lambda x: bandwidth_icon((8, 15), x), + suggested_display_precision=0, entity_category=EntityCategory.DIAGNOSTIC, ), "ulfrequency": HuaweiSensorEntityDescription( key="ulfrequency", translation_key="uplink_frequency", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), "wdlfreq": HuaweiSensorEntityDescription( key="wdlfreq", translation_key="wdlfreq", + suggested_display_precision=0, device_class=SensorDeviceClass.FREQUENCY, entity_category=EntityCategory.DIAGNOSTIC, ), @@ -583,6 +608,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { "PrimaryIPv6Dns": HuaweiSensorEntityDescription( key="PrimaryIPv6Dns", translation_key="primary_ipv6_dns_server", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), "SecondaryDns": HuaweiSensorEntityDescription( @@ -593,6 +619,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { "SecondaryIPv6Dns": HuaweiSensorEntityDescription( key="SecondaryIPv6Dns", translation_key="secondary_ipv6_dns_server", + format_fn=format_ipv6, entity_category=EntityCategory.DIAGNOSTIC, ), }, @@ -604,6 +631,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { key="CurrentConnectTime", translation_key="current_connection_duration", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, ), "CurrentDownload": HuaweiSensorEntityDescription( @@ -652,6 +680,7 @@ SENSOR_META: dict[str, HuaweiSensorGroup] = { key="TotalConnectTime", translation_key="total_connected_duration", native_unit_of_measurement=UnitOfTime.SECONDS, + suggested_display_precision=0, device_class=SensorDeviceClass.DURATION, state_class=SensorStateClass.TOTAL_INCREASING, ),