2019-09-11 17:26:50 +00:00
|
|
|
"""Support for Obihai Sensors."""
|
2022-01-03 18:10:57 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
import datetime
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
from requests.exceptions import RequestException
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-05-26 06:41:21 +00:00
|
|
|
from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
2022-01-03 18:10:57 +00:00
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-02-27 16:22:15 +00:00
|
|
|
from .connectivity import ObihaiConnection
|
2023-06-28 18:12:09 +00:00
|
|
|
from .const import DOMAIN, LOGGER, OBIHAI
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
SCAN_INTERVAL = datetime.timedelta(seconds=5)
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-02-27 16:22:15 +00:00
|
|
|
|
|
|
|
async def async_setup_entry(
|
|
|
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
|
|
) -> None:
|
|
|
|
"""Set up the Obihai sensor entries."""
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
requester: ObihaiConnection = hass.data[DOMAIN][entry.entry_id]
|
2019-09-11 17:26:50 +00:00
|
|
|
|
|
|
|
sensors = []
|
2023-02-27 16:22:15 +00:00
|
|
|
for key in requester.services:
|
2023-06-28 18:12:09 +00:00
|
|
|
sensors.append(ObihaiServiceSensors(requester, key))
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-02-27 16:22:15 +00:00
|
|
|
if requester.line_services is not None:
|
|
|
|
for key in requester.line_services:
|
2023-06-28 18:12:09 +00:00
|
|
|
sensors.append(ObihaiServiceSensors(requester, key))
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-02-27 16:22:15 +00:00
|
|
|
for key in requester.call_direction:
|
2023-06-28 18:12:09 +00:00
|
|
|
sensors.append(ObihaiServiceSensors(requester, key))
|
2019-09-26 08:53:31 +00:00
|
|
|
|
2023-02-27 16:22:15 +00:00
|
|
|
async_add_entities(sensors, update_before_add=True)
|
2019-09-11 17:26:50 +00:00
|
|
|
|
|
|
|
|
2021-03-22 18:46:46 +00:00
|
|
|
class ObihaiServiceSensors(SensorEntity):
|
2019-09-11 17:26:50 +00:00
|
|
|
"""Get the status of each Obihai Lines."""
|
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
def __init__(self, requester: ObihaiConnection, service_name: str) -> None:
|
2019-09-11 17:26:50 +00:00
|
|
|
"""Initialize monitor sensor."""
|
2023-06-28 18:12:09 +00:00
|
|
|
|
|
|
|
self.requester = requester
|
2019-09-11 17:26:50 +00:00
|
|
|
self._service_name = service_name
|
2023-05-30 06:35:47 +00:00
|
|
|
self._attr_name = f"{OBIHAI} {self._service_name}"
|
2023-06-28 18:12:09 +00:00
|
|
|
self._pyobihai = requester.pyobihai
|
|
|
|
self._attr_unique_id = f"{requester.serial}-{self._service_name}"
|
2019-09-11 17:26:50 +00:00
|
|
|
if self._service_name == "Last Reboot":
|
2023-05-30 06:35:47 +00:00
|
|
|
self._attr_device_class = SensorDeviceClass.TIMESTAMP
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2019-10-01 00:42:06 +00:00
|
|
|
@property
|
2023-05-30 06:35:47 +00:00
|
|
|
def icon(self) -> str:
|
2019-10-01 00:42:06 +00:00
|
|
|
"""Return an icon."""
|
2023-06-28 18:12:09 +00:00
|
|
|
|
2019-10-01 00:42:06 +00:00
|
|
|
if self._service_name == "Call Direction":
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "No Active Calls":
|
2019-10-01 00:42:06 +00:00
|
|
|
return "mdi:phone-off"
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "Inbound Call":
|
2019-10-01 00:42:06 +00:00
|
|
|
return "mdi:phone-incoming"
|
|
|
|
return "mdi:phone-outgoing"
|
|
|
|
if "Caller Info" in self._service_name:
|
|
|
|
return "mdi:phone-log"
|
|
|
|
if "Port" in self._service_name:
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "Ringing":
|
2019-10-01 00:42:06 +00:00
|
|
|
return "mdi:phone-ring"
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "Off Hook":
|
2019-10-01 00:42:06 +00:00
|
|
|
return "mdi:phone-in-talk"
|
|
|
|
return "mdi:phone-hangup"
|
2020-11-08 03:00:21 +00:00
|
|
|
if "Service Status" in self._service_name:
|
|
|
|
if "OBiTALK Service Status" in self._service_name:
|
|
|
|
return "mdi:phone-check"
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "0":
|
2020-11-08 03:00:21 +00:00
|
|
|
return "mdi:phone-hangup"
|
|
|
|
return "mdi:phone-in-talk"
|
|
|
|
if "Reboot Required" in self._service_name:
|
2023-05-30 06:35:47 +00:00
|
|
|
if self._attr_native_value == "false":
|
2020-11-08 03:00:21 +00:00
|
|
|
return "mdi:restart-off"
|
|
|
|
return "mdi:restart-alert"
|
2019-10-01 00:42:06 +00:00
|
|
|
return "mdi:phone"
|
|
|
|
|
2022-09-06 08:25:35 +00:00
|
|
|
def update(self) -> None:
|
2019-09-11 17:26:50 +00:00
|
|
|
"""Update the sensor."""
|
2023-02-27 16:22:15 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
LOGGER.debug("Running update on %s", self._service_name)
|
|
|
|
try:
|
|
|
|
# port connection, and last caller info
|
|
|
|
if "Caller Info" in self._service_name or "Port" in self._service_name:
|
|
|
|
services = self._pyobihai.get_line_state()
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
if services is not None and self._service_name in services:
|
|
|
|
self._attr_native_value = services.get(self._service_name)
|
|
|
|
elif self._service_name == "Call Direction":
|
|
|
|
call_direction = self._pyobihai.get_call_direction()
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
if self._service_name in call_direction:
|
|
|
|
self._attr_native_value = call_direction.get(self._service_name)
|
|
|
|
else: # SIP Profile service sensors, phone sensor, and last reboot
|
|
|
|
services = self._pyobihai.get_state()
|
2019-09-11 17:26:50 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
if self._service_name in services:
|
|
|
|
self._attr_native_value = services.get(self._service_name)
|
2019-09-25 18:26:15 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
if not self.requester.available:
|
|
|
|
self.requester.available = True
|
|
|
|
LOGGER.info("Connection restored")
|
|
|
|
self._attr_available = True
|
|
|
|
|
|
|
|
return
|
2019-09-25 18:26:15 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
except RequestException as exc:
|
|
|
|
if self.requester.available:
|
|
|
|
LOGGER.warning("Connection failed, Obihai offline? %s", exc)
|
|
|
|
except IndexError as exc:
|
|
|
|
if self.requester.available:
|
|
|
|
LOGGER.warning("Connection failed, bad response: %s", exc)
|
2023-05-30 06:35:47 +00:00
|
|
|
|
2023-06-28 18:12:09 +00:00
|
|
|
self._attr_native_value = None
|
|
|
|
self._attr_available = False
|
|
|
|
self.requester.available = False
|