1 """Vodafone Station sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime
8 from typing
import Final
13 SensorEntityDescription,
21 from .const
import _LOGGER, DOMAIN, LINE_TYPES
22 from .coordinator
import VodafoneStationRouter
24 NOT_AVAILABLE: list = [
"",
"N/A",
"0.0.0.0"]
28 @dataclass(frozen=True, kw_only=True)
30 """Vodafone Station entity description."""
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
40 coordinator: VodafoneStationRouter,
41 last_value: str | datetime | float |
None,
44 """Calculate device uptime."""
46 delta_uptime = coordinator.api.convert_uptime(coordinator.data.sensors[key])
49 not isinstance(last_value, datetime)
50 or abs((delta_uptime - last_value).total_seconds()) > UPTIME_DEVIATION
58 coordinator: VodafoneStationRouter,
59 last_value: str | datetime | float |
None,
62 """Identify line type."""
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")
70 if internet_ip == dsl_ip:
73 if internet_ip == fiber_ip:
76 if internet_ip == internet_key_ip:
82 SENSOR_TYPES: Final = (
85 translation_key=
"external_ipv4",
86 is_suitable=
lambda info: info[
"wan_ip4_addr"]
not in NOT_AVAILABLE,
90 translation_key=
"external_ipv6",
91 is_suitable=
lambda info: info[
"wan_ip6_addr"]
not in NOT_AVAILABLE,
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,
99 key=
"inter_ip_address",
100 translation_key=
"active_connection",
101 device_class=SensorDeviceClass.ENUM,
103 value=_line_connection,
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,
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,
121 translation_key=
"fw_version",
122 entity_category=EntityCategory.DIAGNOSTIC,
126 translation_key=
"phone_num1",
127 is_suitable=
lambda info: info[
"phone_num1"] !=
"",
131 translation_key=
"phone_num2",
132 is_suitable=
lambda info: info[
"phone_num2"] !=
"",
136 translation_key=
"sys_uptime",
137 device_class=SensorDeviceClass.TIMESTAMP,
138 entity_category=EntityCategory.DIAGNOSTIC,
139 value=_calculate_uptime,
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]
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]
160 key=
"sys_reboot_cause",
161 translation_key=
"sys_reboot_cause",
162 entity_category=EntityCategory.DIAGNOSTIC,
168 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
171 _LOGGER.debug(
"Setting up Vodafone Station sensors")
173 coordinator: VodafoneStationRouter = hass.data[DOMAIN][entry.entry_id]
175 sensors_data = coordinator.data.sensors
179 for sensor_descr
in SENSOR_TYPES
180 if sensor_descr.key
in sensors_data
and sensor_descr.is_suitable(sensors_data)
185 CoordinatorEntity[VodafoneStationRouter], SensorEntity
187 """Representation of a Vodafone Station sensor."""
189 _attr_has_entity_name =
True
190 entity_description: VodafoneStationEntityDescription
194 coordinator: VodafoneStationRouter,
195 description: VodafoneStationEntityDescription,
197 """Initialize a Vodafone Station sensor."""
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
str|datetime|float|None native_value(self)
None __init__(self, VodafoneStationRouter coordinator, VodafoneStationEntityDescription description)
str|None _line_connection(VodafoneStationRouter coordinator, str|datetime|float|None last_value, str key)
datetime _calculate_uptime(VodafoneStationRouter coordinator, str|datetime|float|None last_value, str key)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)