Tidy up various Huawei LTE sensor values for display (#159728)

This commit is contained in:
Ville Skyttä
2025-12-25 14:15:06 +02:00
committed by GitHub
parent be966f1196
commit 5359a8bf26

View File

@@ -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,
),