Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Entity classes for the QNAP QSW integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from enum import StrEnum
7 from typing import Any
8 
9 from aioqsw.const import (
10  QSD_FIRMWARE,
11  QSD_FIRMWARE_INFO,
12  QSD_LACP_PORTS,
13  QSD_MAC,
14  QSD_PORTS,
15  QSD_PRODUCT,
16  QSD_SYSTEM_BOARD,
17 )
18 
19 from homeassistant.config_entries import ConfigEntry
20 from homeassistant.const import CONF_URL
21 from homeassistant.core import callback
22 from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, DeviceInfo
23 from homeassistant.helpers.entity import EntityDescription
24 from homeassistant.helpers.update_coordinator import CoordinatorEntity
25 
26 from .const import MANUFACTURER
27 from .coordinator import QswDataCoordinator, QswFirmwareCoordinator
28 
29 
30 class QswEntityType(StrEnum):
31  """QNAP QSW Entity Type."""
32 
33  LACP_PORT = QSD_LACP_PORTS
34  PORT = QSD_PORTS
35 
36 
37 class QswDataEntity(CoordinatorEntity[QswDataCoordinator]):
38  """Define an QNAP QSW entity."""
39 
40  def __init__(
41  self,
42  coordinator: QswDataCoordinator,
43  entry: ConfigEntry,
44  type_id: int | None = None,
45  ) -> None:
46  """Initialize."""
47  super().__init__(coordinator)
48 
49  self.type_idtype_id = type_id
50  self.productproduct = self.get_device_valueget_device_value(QSD_SYSTEM_BOARD, QSD_PRODUCT)
51  self._attr_device_info_attr_device_info = DeviceInfo(
52  configuration_url=entry.data[CONF_URL],
53  connections={
54  (
55  CONNECTION_NETWORK_MAC,
56  self.get_device_valueget_device_value(QSD_SYSTEM_BOARD, QSD_MAC),
57  )
58  },
59  manufacturer=MANUFACTURER,
60  model=self.productproduct,
61  name=self.productproduct,
62  sw_version=self.get_device_valueget_device_value(QSD_FIRMWARE_INFO, QSD_FIRMWARE),
63  )
64 
66  self,
67  key: str,
68  subkey: str,
69  qsw_type: QswEntityType | None = None,
70  ) -> Any:
71  """Return device value by key."""
72  value = None
73  if key in self.coordinator.data:
74  data = self.coordinator.data[key]
75  if qsw_type is not None and self.type_idtype_id is not None:
76  if (
77  qsw_type in data
78  and self.type_idtype_id in data[qsw_type]
79  and subkey in data[qsw_type][self.type_idtype_id]
80  ):
81  value = data[qsw_type][self.type_idtype_id][subkey]
82  elif subkey in data:
83  value = data[subkey]
84  return value
85 
86 
87 @dataclass(frozen=True)
89  """Mixin to describe a QSW entity."""
90 
91  subkey: str
92 
93 
94 @dataclass(frozen=True)
96  """Class to describe a QSW entity."""
97 
98  attributes: dict[str, list[str]] | None = None
99 
100 
102  """Base class for QSW sensor entities."""
103 
104  entity_description: QswEntityDescription
105 
106  @callback
107  def _handle_coordinator_update(self) -> None:
108  """Update attributes when the coordinator updates."""
109  self._async_update_attrs_async_update_attrs()
111 
112  @callback
113  def _async_update_attrs(self) -> None:
114  """Update attributes."""
115  if self.entity_description.attributes:
116  self._attr_extra_state_attributes_attr_extra_state_attributes = {
117  key: self.get_device_valueget_device_value(val[0], val[1])
118  for key, val in self.entity_description.attributes.items()
119  }
120 
121 
122 class QswFirmwareEntity(CoordinatorEntity[QswFirmwareCoordinator]):
123  """Define a QNAP QSW firmware entity."""
124 
125  _attr_has_entity_name = True
126 
127  def __init__(
128  self,
129  coordinator: QswFirmwareCoordinator,
130  entry: ConfigEntry,
131  ) -> None:
132  """Initialize."""
133  super().__init__(coordinator)
134 
135  self._attr_device_info_attr_device_info = DeviceInfo(
136  configuration_url=entry.data[CONF_URL],
137  connections={
138  (
139  CONNECTION_NETWORK_MAC,
140  self.get_device_valueget_device_value(QSD_SYSTEM_BOARD, QSD_MAC),
141  )
142  },
143  manufacturer=MANUFACTURER,
144  model=self.get_device_valueget_device_value(QSD_SYSTEM_BOARD, QSD_PRODUCT),
145  name=self.get_device_valueget_device_value(QSD_SYSTEM_BOARD, QSD_PRODUCT),
146  sw_version=self.get_device_valueget_device_value(QSD_FIRMWARE_INFO, QSD_FIRMWARE),
147  )
148 
149  def get_device_value(self, key: str, subkey: str) -> Any:
150  """Return device value by key."""
151  value = None
152  if self.coordinator.data is not None and key in self.coordinator.data:
153  data = self.coordinator.data[key]
154  if subkey in data:
155  value = data[subkey]
156  return value
None __init__(self, QswDataCoordinator coordinator, ConfigEntry entry, int|None type_id=None)
Definition: entity.py:45
Any get_device_value(self, str key, str subkey, QswEntityType|None qsw_type=None)
Definition: entity.py:70
Any get_device_value(self, str key, str subkey)
Definition: entity.py:149
None __init__(self, QswFirmwareCoordinator coordinator, ConfigEntry entry)
Definition: entity.py:131