Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Vodafone Station sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from datetime import datetime
8 from typing import Final
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfDataRate
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from .const import _LOGGER, DOMAIN, LINE_TYPES
22 from .coordinator import VodafoneStationRouter
23 
24 NOT_AVAILABLE: list = ["", "N/A", "0.0.0.0"]
25 UPTIME_DEVIATION = 60
26 
27 
28 @dataclass(frozen=True, kw_only=True)
30  """Vodafone Station entity description."""
31 
32  value: Callable[
33  [VodafoneStationRouter, str | datetime | float | None, str],
34  str | datetime | float | None,
35  ] = lambda coordinator, last_value, key: coordinator.data.sensors[key]
36  is_suitable: Callable[[dict], bool] = lambda val: True
37 
38 
40  coordinator: VodafoneStationRouter,
41  last_value: str | datetime | float | None,
42  key: str,
43 ) -> datetime:
44  """Calculate device uptime."""
45 
46  delta_uptime = coordinator.api.convert_uptime(coordinator.data.sensors[key])
47 
48  if (
49  not isinstance(last_value, datetime)
50  or abs((delta_uptime - last_value).total_seconds()) > UPTIME_DEVIATION
51  ):
52  return delta_uptime
53 
54  return last_value
55 
56 
58  coordinator: VodafoneStationRouter,
59  last_value: str | datetime | float | None,
60  key: str,
61 ) -> str | None:
62  """Identify line type."""
63 
64  value = coordinator.data.sensors
65  internet_ip = value[key]
66  dsl_ip = value.get("dsl_ipaddr")
67  fiber_ip = value.get("fiber_ipaddr")
68  internet_key_ip = value.get("vf_internet_key_ip_addr")
69 
70  if internet_ip == dsl_ip:
71  return LINE_TYPES[0]
72 
73  if internet_ip == fiber_ip:
74  return LINE_TYPES[1]
75 
76  if internet_ip == internet_key_ip:
77  return LINE_TYPES[2]
78 
79  return None
80 
81 
82 SENSOR_TYPES: Final = (
84  key="wan_ip4_addr",
85  translation_key="external_ipv4",
86  is_suitable=lambda info: info["wan_ip4_addr"] not in NOT_AVAILABLE,
87  ),
89  key="wan_ip6_addr",
90  translation_key="external_ipv6",
91  is_suitable=lambda info: info["wan_ip6_addr"] not in NOT_AVAILABLE,
92  ),
94  key="vf_internet_key_ip_addr",
95  translation_key="external_ip_key",
96  is_suitable=lambda info: info["vf_internet_key_ip_addr"] not in NOT_AVAILABLE,
97  ),
99  key="inter_ip_address",
100  translation_key="active_connection",
101  device_class=SensorDeviceClass.ENUM,
102  options=LINE_TYPES,
103  value=_line_connection,
104  ),
106  key="down_str",
107  translation_key="down_stream",
108  device_class=SensorDeviceClass.DATA_RATE,
109  native_unit_of_measurement=UnitOfDataRate.KILOBYTES_PER_SECOND,
110  entity_category=EntityCategory.DIAGNOSTIC,
111  ),
113  key="up_str",
114  translation_key="up_stream",
115  device_class=SensorDeviceClass.DATA_RATE,
116  native_unit_of_measurement=UnitOfDataRate.KILOBYTES_PER_SECOND,
117  entity_category=EntityCategory.DIAGNOSTIC,
118  ),
120  key="fw_version",
121  translation_key="fw_version",
122  entity_category=EntityCategory.DIAGNOSTIC,
123  ),
125  key="phone_num1",
126  translation_key="phone_num1",
127  is_suitable=lambda info: info["phone_num1"] != "",
128  ),
130  key="phone_num2",
131  translation_key="phone_num2",
132  is_suitable=lambda info: info["phone_num2"] != "",
133  ),
135  key="sys_uptime",
136  translation_key="sys_uptime",
137  device_class=SensorDeviceClass.TIMESTAMP,
138  entity_category=EntityCategory.DIAGNOSTIC,
139  value=_calculate_uptime,
140  ),
142  key="sys_cpu_usage",
143  translation_key="sys_cpu_usage",
144  native_unit_of_measurement=PERCENTAGE,
145  entity_category=EntityCategory.DIAGNOSTIC,
146  value=lambda coordinator, last_value, key: float(
147  coordinator.data.sensors[key][:-1]
148  ),
149  ),
151  key="sys_memory_usage",
152  translation_key="sys_memory_usage",
153  native_unit_of_measurement=PERCENTAGE,
154  entity_category=EntityCategory.DIAGNOSTIC,
155  value=lambda coordinator, last_value, key: float(
156  coordinator.data.sensors[key][:-1]
157  ),
158  ),
160  key="sys_reboot_cause",
161  translation_key="sys_reboot_cause",
162  entity_category=EntityCategory.DIAGNOSTIC,
163  ),
164 )
165 
166 
168  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
169 ) -> None:
170  """Set up entry."""
171  _LOGGER.debug("Setting up Vodafone Station sensors")
172 
173  coordinator: VodafoneStationRouter = hass.data[DOMAIN][entry.entry_id]
174 
175  sensors_data = coordinator.data.sensors
176 
178  VodafoneStationSensorEntity(coordinator, sensor_descr)
179  for sensor_descr in SENSOR_TYPES
180  if sensor_descr.key in sensors_data and sensor_descr.is_suitable(sensors_data)
181  )
182 
183 
185  CoordinatorEntity[VodafoneStationRouter], SensorEntity
186 ):
187  """Representation of a Vodafone Station sensor."""
188 
189  _attr_has_entity_name = True
190  entity_description: VodafoneStationEntityDescription
191 
192  def __init__(
193  self,
194  coordinator: VodafoneStationRouter,
195  description: VodafoneStationEntityDescription,
196  ) -> None:
197  """Initialize a Vodafone Station sensor."""
198  super().__init__(coordinator)
199  self.entity_descriptionentity_description = description
200  self._attr_device_info_attr_device_info = coordinator.device_info
201  self._attr_unique_id_attr_unique_id = f"{coordinator.serial_number}_{description.key}"
202  self._old_state_old_state: str | datetime | float | None = None
203 
204  @property
205  def native_value(self) -> str | datetime | float | None:
206  """Sensor value."""
207  self._old_state_old_state = self.entity_descriptionentity_description.value(
208  self.coordinator, self._old_state_old_state, self.entity_descriptionentity_description.key
209  )
210  return self._old_state_old_state
None __init__(self, VodafoneStationRouter coordinator, VodafoneStationEntityDescription description)
Definition: sensor.py:196
str|None _line_connection(VodafoneStationRouter coordinator, str|datetime|float|None last_value, str key)
Definition: sensor.py:61
datetime _calculate_uptime(VodafoneStationRouter coordinator, str|datetime|float|None last_value, str key)
Definition: sensor.py:43
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:169