mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Huawei LTE sensor updates (#59374)
* Add human readable name for eNodeB ID * Mark various config and diagnostic sensors' entity category as such * Add uptime sensor
This commit is contained in:
parent
1ea092a54f
commit
4273e5b507
@ -21,6 +21,8 @@ from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import (
|
||||
DATA_BYTES,
|
||||
DATA_RATE_BYTES_PER_SECOND,
|
||||
ENTITY_CATEGORY_CONFIG,
|
||||
ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
FREQUENCY_MEGAHERTZ,
|
||||
PERCENTAGE,
|
||||
STATE_UNKNOWN,
|
||||
@ -58,6 +60,7 @@ class SensorMeta(NamedTuple):
|
||||
unit: str | None = None
|
||||
state_class: str | None = None
|
||||
enabled_default: bool = False
|
||||
entity_category: str | None = None
|
||||
include: re.Pattern[str] | None = None
|
||||
exclude: re.Pattern[str] | None = None
|
||||
formatter: Callable[[str], tuple[StateType, str | None]] | None = None
|
||||
@ -65,19 +68,38 @@ class SensorMeta(NamedTuple):
|
||||
|
||||
SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
KEY_DEVICE_INFORMATION: SensorMeta(
|
||||
include=re.compile(r"^WanIP.*Address$", re.IGNORECASE)
|
||||
include=re.compile(r"^(WanIP.*Address|uptime)$", re.IGNORECASE)
|
||||
),
|
||||
(KEY_DEVICE_INFORMATION, "WanIPAddress"): SensorMeta(
|
||||
name="WAN IP address", icon="mdi:ip", enabled_default=True
|
||||
name="WAN IP address",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
enabled_default=True,
|
||||
),
|
||||
(KEY_DEVICE_INFORMATION, "WanIPv6Address"): SensorMeta(
|
||||
name="WAN IPv6 address", icon="mdi:ip"
|
||||
name="WAN IPv6 address",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_INFORMATION, "uptime"): SensorMeta(
|
||||
name="Uptime",
|
||||
icon="mdi:timer-outline",
|
||||
unit=TIME_SECONDS,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "band"): SensorMeta(
|
||||
name="Band",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "band"): SensorMeta(name="Band"),
|
||||
(KEY_DEVICE_SIGNAL, "cell_id"): SensorMeta(
|
||||
name="Cell ID", icon="mdi:transmission-tower"
|
||||
name="Cell ID",
|
||||
icon="mdi:transmission-tower",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "dl_mcs"): SensorMeta(
|
||||
name="Downlink MCS",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "dl_mcs"): SensorMeta(name="Downlink MCS"),
|
||||
(KEY_DEVICE_SIGNAL, "dlbandwidth"): SensorMeta(
|
||||
name="Downlink bandwidth",
|
||||
icon=lambda x: (
|
||||
@ -85,19 +107,48 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:speedometer-medium",
|
||||
"mdi:speedometer",
|
||||
)[bisect((8, 15), x if x is not None else -1000)],
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "earfcn"): SensorMeta(
|
||||
name="EARFCN",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "lac"): SensorMeta(
|
||||
name="LAC",
|
||||
icon="mdi:map-marker",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "plmn"): SensorMeta(
|
||||
name="PLMN",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "rac"): SensorMeta(
|
||||
name="RAC",
|
||||
icon="mdi:map-marker",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "rrc_status"): SensorMeta(
|
||||
name="RRC status",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "tac"): SensorMeta(
|
||||
name="TAC",
|
||||
icon="mdi:map-marker",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "tdd"): SensorMeta(
|
||||
name="TDD",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "earfcn"): SensorMeta(name="EARFCN"),
|
||||
(KEY_DEVICE_SIGNAL, "lac"): SensorMeta(name="LAC", icon="mdi:map-marker"),
|
||||
(KEY_DEVICE_SIGNAL, "plmn"): SensorMeta(name="PLMN"),
|
||||
(KEY_DEVICE_SIGNAL, "rac"): SensorMeta(name="RAC", icon="mdi:map-marker"),
|
||||
(KEY_DEVICE_SIGNAL, "rrc_status"): SensorMeta(name="RRC status"),
|
||||
(KEY_DEVICE_SIGNAL, "tac"): SensorMeta(name="TAC", icon="mdi:map-marker"),
|
||||
(KEY_DEVICE_SIGNAL, "tdd"): SensorMeta(name="TDD"),
|
||||
(KEY_DEVICE_SIGNAL, "txpower"): SensorMeta(
|
||||
name="Transmit power",
|
||||
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "ul_mcs"): SensorMeta(
|
||||
name="Uplink MCS",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "ul_mcs"): SensorMeta(name="Uplink MCS"),
|
||||
(KEY_DEVICE_SIGNAL, "ulbandwidth"): SensorMeta(
|
||||
name="Uplink bandwidth",
|
||||
icon=lambda x: (
|
||||
@ -105,6 +156,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:speedometer-medium",
|
||||
"mdi:speedometer",
|
||||
)[bisect((8, 15), x if x is not None else -1000)],
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "mode"): SensorMeta(
|
||||
name="Mode",
|
||||
@ -114,8 +166,13 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
str(x), "mdi:signal"
|
||||
)
|
||||
),
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "pci"): SensorMeta(
|
||||
name="PCI",
|
||||
icon="mdi:transmission-tower",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "pci"): SensorMeta(name="PCI", icon="mdi:transmission-tower"),
|
||||
(KEY_DEVICE_SIGNAL, "rsrq"): SensorMeta(
|
||||
name="RSRQ",
|
||||
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
|
||||
@ -127,6 +184,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((-11, -8, -5), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
enabled_default=True,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "rsrp"): SensorMeta(
|
||||
@ -140,6 +198,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((-110, -95, -80), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
enabled_default=True,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "rssi"): SensorMeta(
|
||||
@ -153,6 +212,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((-80, -70, -60), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
enabled_default=True,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "sinr"): SensorMeta(
|
||||
@ -166,6 +226,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((0, 5, 10), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
enabled_default=True,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "rscp"): SensorMeta(
|
||||
@ -179,6 +240,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((-95, -85, -75), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "ecio"): SensorMeta(
|
||||
name="EC/IO",
|
||||
@ -191,22 +253,32 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
"mdi:signal-cellular-3",
|
||||
)[bisect((-20, -10, -6), x if x is not None else -1000)],
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "transmode"): SensorMeta(
|
||||
name="Transmission mode",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "transmode"): SensorMeta(name="Transmission mode"),
|
||||
(KEY_DEVICE_SIGNAL, "cqi0"): SensorMeta(
|
||||
name="CQI 0",
|
||||
icon="mdi:speedometer",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "cqi1"): SensorMeta(
|
||||
name="CQI 1",
|
||||
icon="mdi:speedometer",
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "enodeb_id"): SensorMeta(
|
||||
name="eNodeB ID",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "ltedlfreq"): SensorMeta(
|
||||
name="Downlink frequency",
|
||||
formatter=lambda x: (
|
||||
round(int(x) / 10) if x is not None else None,
|
||||
FREQUENCY_MEGAHERTZ,
|
||||
),
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_DEVICE_SIGNAL, "lteulfreq"): SensorMeta(
|
||||
name="Uplink frequency",
|
||||
@ -214,6 +286,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
round(int(x) / 10) if x is not None else None,
|
||||
FREQUENCY_MEGAHERTZ,
|
||||
),
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
KEY_MONITORING_CHECK_NOTIFICATIONS: SensorMeta(
|
||||
exclude=re.compile(
|
||||
@ -250,23 +323,33 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
device_class=DEVICE_CLASS_BATTERY,
|
||||
unit=PERCENTAGE,
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_MONITORING_STATUS, "CurrentWifiUser"): SensorMeta(
|
||||
name="WiFi clients connected",
|
||||
icon="mdi:wifi",
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_MONITORING_STATUS, "PrimaryDns"): SensorMeta(
|
||||
name="Primary DNS server", icon="mdi:ip"
|
||||
name="Primary DNS server",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_MONITORING_STATUS, "SecondaryDns"): SensorMeta(
|
||||
name="Secondary DNS server", icon="mdi:ip"
|
||||
name="Secondary DNS server",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_MONITORING_STATUS, "PrimaryIPv6Dns"): SensorMeta(
|
||||
name="Primary IPv6 DNS server", icon="mdi:ip"
|
||||
name="Primary IPv6 DNS server",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_MONITORING_STATUS, "SecondaryIPv6Dns"): SensorMeta(
|
||||
name="Secondary IPv6 DNS server", icon="mdi:ip"
|
||||
name="Secondary IPv6 DNS server",
|
||||
icon="mdi:ip",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
KEY_MONITORING_TRAFFIC_STATISTICS: SensorMeta(
|
||||
exclude=re.compile(r"^showtraffic$", re.IGNORECASE)
|
||||
@ -322,12 +405,15 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
(KEY_NET_CURRENT_PLMN, "State"): SensorMeta(
|
||||
name="Operator search mode",
|
||||
formatter=lambda x: ({"0": "Auto", "1": "Manual"}.get(x, "Unknown"), None),
|
||||
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||
),
|
||||
(KEY_NET_CURRENT_PLMN, "FullName"): SensorMeta(
|
||||
name="Operator name",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
(KEY_NET_CURRENT_PLMN, "Numeric"): SensorMeta(
|
||||
name="Operator code",
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
),
|
||||
KEY_NET_NET_MODE: SensorMeta(include=re.compile(r"^NetworkMode$", re.IGNORECASE)),
|
||||
(KEY_NET_NET_MODE, "NetworkMode"): SensorMeta(
|
||||
@ -344,6 +430,7 @@ SENSOR_META: dict[str | tuple[str, str], SensorMeta] = {
|
||||
}.get(x, "Unknown"),
|
||||
None,
|
||||
),
|
||||
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||
),
|
||||
(KEY_SMS_SMS_COUNT, "LocalDeleted"): SensorMeta(
|
||||
name="SMS deleted (device)",
|
||||
@ -514,3 +601,8 @@ class HuaweiLteSensor(HuaweiLteBaseEntity, SensorEntity):
|
||||
|
||||
self._state, self._unit = formatter(value)
|
||||
self._available = value is not None
|
||||
|
||||
@property
|
||||
def entity_category(self) -> str | None:
|
||||
"""Return category of entity, if any."""
|
||||
return self.meta.entity_category
|
||||
|
Loading…
x
Reference in New Issue
Block a user