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:
Ville Skyttä 2021-11-10 08:49:50 +02:00 committed by GitHub
parent 1ea092a54f
commit 4273e5b507
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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