Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Obihai Sensors."""
2 
3 from __future__ import annotations
4 
5 import datetime
6 
7 from requests.exceptions import RequestException
8 
9 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from .connectivity import ObihaiConnection
15 from .const import DOMAIN, LOGGER, OBIHAI
16 
17 SCAN_INTERVAL = datetime.timedelta(seconds=5)
18 
19 
21  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
22 ) -> None:
23  """Set up the Obihai sensor entries."""
24 
25  requester: ObihaiConnection = hass.data[DOMAIN][entry.entry_id]
26 
27  sensors = [ObihaiServiceSensors(requester, key) for key in requester.services]
28 
29  sensors.extend(
30  ObihaiServiceSensors(requester, key) for key in requester.call_direction
31  )
32 
33  if requester.line_services is not None:
34  sensors.extend(
35  ObihaiServiceSensors(requester, key) for key in requester.line_services
36  )
37 
38  async_add_entities(sensors, update_before_add=True)
39 
40 
42  """Get the status of each Obihai Lines."""
43 
44  def __init__(self, requester: ObihaiConnection, service_name: str) -> None:
45  """Initialize monitor sensor."""
46 
47  self.requesterrequester = requester
48  self._service_name_service_name = service_name
49  self._attr_name_attr_name = f"{OBIHAI} {self._service_name}"
50  self._pyobihai_pyobihai = requester.pyobihai
51  self._attr_unique_id_attr_unique_id = f"{requester.serial}-{self._service_name}"
52  if self._service_name_service_name == "Last Reboot":
53  self._attr_device_class_attr_device_class = SensorDeviceClass.TIMESTAMP
54 
55  @property
56  def icon(self) -> str:
57  """Return an icon."""
58 
59  if self._service_name_service_name == "Call Direction":
60  if self._attr_native_value_attr_native_value == "No Active Calls":
61  return "mdi:phone-off"
62  if self._attr_native_value_attr_native_value == "Inbound Call":
63  return "mdi:phone-incoming"
64  return "mdi:phone-outgoing"
65  if "Caller Info" in self._service_name_service_name:
66  return "mdi:phone-log"
67  if "Port" in self._service_name_service_name:
68  if self._attr_native_value_attr_native_value == "Ringing":
69  return "mdi:phone-ring"
70  if self._attr_native_value_attr_native_value == "Off Hook":
71  return "mdi:phone-in-talk"
72  return "mdi:phone-hangup"
73  if "Service Status" in self._service_name_service_name:
74  if "OBiTALK Service Status" in self._service_name_service_name:
75  return "mdi:phone-check"
76  if self._attr_native_value_attr_native_value == "0":
77  return "mdi:phone-hangup"
78  return "mdi:phone-in-talk"
79  if "Reboot Required" in self._service_name_service_name:
80  if self._attr_native_value_attr_native_value == "false":
81  return "mdi:restart-off"
82  return "mdi:restart-alert"
83  return "mdi:phone"
84 
85  def update(self) -> None:
86  """Update the sensor."""
87 
88  LOGGER.debug("Running update on %s", self._service_name_service_name)
89  try:
90  # port connection, and last caller info
91  if "Caller Info" in self._service_name_service_name or "Port" in self._service_name_service_name:
92  services = self._pyobihai_pyobihai.get_line_state()
93 
94  if services is not None and self._service_name_service_name in services:
95  self._attr_native_value_attr_native_value = services.get(self._service_name_service_name)
96  elif self._service_name_service_name == "Call Direction":
97  call_direction = self._pyobihai_pyobihai.get_call_direction()
98 
99  if self._service_name_service_name in call_direction:
100  self._attr_native_value_attr_native_value = call_direction.get(self._service_name_service_name)
101  else: # SIP Profile service sensors, phone sensor, and last reboot
102  services = self._pyobihai_pyobihai.get_state()
103 
104  if self._service_name_service_name in services:
105  self._attr_native_value_attr_native_value = services.get(self._service_name_service_name)
106 
107  if not self.requesterrequester.available:
108  self.requesterrequester.available = True
109  LOGGER.warning("Connection restored")
110  self._attr_available_attr_available = True
111 
112  except RequestException as exc:
113  if self.requesterrequester.available:
114  LOGGER.warning("Connection failed, Obihai offline? %s", exc)
115  self._attr_native_value_attr_native_value = None
116  self._attr_available_attr_available = False
117  self.requesterrequester.available = False
118  except IndexError as exc:
119  if self.requesterrequester.available:
120  LOGGER.warning("Connection failed, bad response: %s", exc)
121  self._attr_native_value_attr_native_value = None
122  self._attr_available_attr_available = False
123  self.requesterrequester.available = False
None __init__(self, ObihaiConnection requester, str service_name)
Definition: sensor.py:44
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:22
str get_state(int upload, int download)
Definition: sensor.py:182