diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 4479f3835248e80b12f3a166df54c6b098a57136..57963046cbc732188133a8944756fee884d7e658 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -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