96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
"""AVM FRITZ!Box connectivity sensor."""
|
|
import logging
|
|
|
|
from fritzconnection.core.exceptions import FritzConnectionException
|
|
|
|
from homeassistant.components.binary_sensor import (
|
|
DEVICE_CLASS_CONNECTIVITY,
|
|
BinarySensorEntity,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .common import FritzBoxBaseEntity, FritzBoxTools
|
|
from .const import DOMAIN
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
) -> None:
|
|
"""Set up entry."""
|
|
_LOGGER.debug("Setting up FRITZ!Box binary sensors")
|
|
fritzbox_tools: FritzBoxTools = hass.data[DOMAIN][entry.entry_id]
|
|
|
|
if fritzbox_tools.connection and "WANIPConn1" in fritzbox_tools.connection.services:
|
|
# Only routers are supported at the moment
|
|
async_add_entities(
|
|
[FritzBoxConnectivitySensor(fritzbox_tools, entry.title)], True
|
|
)
|
|
|
|
|
|
class FritzBoxConnectivitySensor(FritzBoxBaseEntity, BinarySensorEntity):
|
|
"""Define FRITZ!Box connectivity class."""
|
|
|
|
def __init__(
|
|
self, fritzbox_tools: FritzBoxTools, device_friendly_name: str
|
|
) -> None:
|
|
"""Init FRITZ!Box connectivity class."""
|
|
self._unique_id = f"{fritzbox_tools.unique_id}-connectivity"
|
|
self._name = f"{device_friendly_name} Connectivity"
|
|
self._is_on = True
|
|
self._is_available = True
|
|
super().__init__(fritzbox_tools, device_friendly_name)
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
"""Return name."""
|
|
return self._name
|
|
|
|
@property
|
|
def device_class(self) -> str:
|
|
"""Return device class."""
|
|
return DEVICE_CLASS_CONNECTIVITY
|
|
|
|
@property
|
|
def is_on(self) -> bool:
|
|
"""Return status."""
|
|
return self._is_on
|
|
|
|
@property
|
|
def unique_id(self) -> str:
|
|
"""Return unique id."""
|
|
return self._unique_id
|
|
|
|
@property
|
|
def available(self) -> bool:
|
|
"""Return availability."""
|
|
return self._is_available
|
|
|
|
def update(self) -> None:
|
|
"""Update data."""
|
|
_LOGGER.debug("Updating FRITZ!Box binary sensors")
|
|
self._is_on = True
|
|
try:
|
|
if (
|
|
self._fritzbox_tools.connection
|
|
and "WANCommonInterfaceConfig1"
|
|
in self._fritzbox_tools.connection.services
|
|
):
|
|
link_props = self._fritzbox_tools.connection.call_action(
|
|
"WANCommonInterfaceConfig1", "GetCommonLinkProperties"
|
|
)
|
|
is_up = link_props["NewPhysicalLinkStatus"]
|
|
self._is_on = is_up == "Up"
|
|
else:
|
|
if self._fritzbox_tools.fritz_status:
|
|
self._is_on = self._fritzbox_tools.fritz_status.is_connected
|
|
|
|
self._is_available = True
|
|
|
|
except FritzConnectionException:
|
|
_LOGGER.error("Error getting the state from the FRITZ!Box", exc_info=True)
|
|
self._is_available = False
|