diff --git a/.coveragerc b/.coveragerc index 1cd4c1774e489335713e019e54ad906f5d740088..378dba5ef2a34165e703fe8c292e7d6c7096de7d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -112,7 +112,7 @@ omit = homeassistant/components/*/evohome.py homeassistant/components/fritzbox.py - homeassistant/components/switch/fritzbox.py + homeassistant/components/*/fritzbox.py homeassistant/components/ecovacs.py homeassistant/components/*/ecovacs.py diff --git a/homeassistant/components/binary_sensor/fritzbox.py b/homeassistant/components/binary_sensor/fritzbox.py new file mode 100644 index 0000000000000000000000000000000000000000..ab58e6e84bc62b8d65a39adda78ce603386924d0 --- /dev/null +++ b/homeassistant/components/binary_sensor/fritzbox.py @@ -0,0 +1,64 @@ +""" +Support for Fritzbox binary sensors. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.fritzbox/ +""" +import logging + +import requests + +from homeassistant.components.binary_sensor import BinarySensorDevice +from homeassistant.components.fritzbox import DOMAIN as FRITZBOX_DOMAIN + +DEPENDENCIES = ['fritzbox'] + +_LOGGER = logging.getLogger(__name__) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up the Fritzbox binary sensor platform.""" + devices = [] + fritz_list = hass.data[FRITZBOX_DOMAIN] + + for fritz in fritz_list: + device_list = fritz.get_devices() + for device in device_list: + if device.has_alarm: + devices.append(FritzboxBinarySensor(device, fritz)) + + add_entities(devices, True) + + +class FritzboxBinarySensor(BinarySensorDevice): + """Representation of a binary Fritzbox device.""" + + def __init__(self, device, fritz): + """Initialize the Fritzbox binary sensor.""" + self._device = device + self._fritz = fritz + + @property + def name(self): + """Return the name of the entity.""" + return self._device.name + + @property + def device_class(self): + """Return the class of this sensor.""" + return 'window' + + @property + def is_on(self): + """Return true if sensor is on.""" + if not self._device.present: + return False + return self._device.alert_state + + def update(self): + """Get latest data from the Fritzbox.""" + try: + self._device.update() + except requests.exceptions.HTTPError as ex: + _LOGGER.warning("Connection error: %s", ex) + self._fritz.login() diff --git a/homeassistant/components/fritzbox.py b/homeassistant/components/fritzbox.py index 49bc4c8f6e6af454db214faac326641353ed1f7a..e6f121799df3a92f2c6d8a3e1c4f99d81f27c781 100644 --- a/homeassistant/components/fritzbox.py +++ b/homeassistant/components/fritzbox.py @@ -18,7 +18,7 @@ _LOGGER = logging.getLogger(__name__) REQUIREMENTS = ['pyfritzhome==0.4.0'] -SUPPORTED_DOMAINS = ['climate', 'switch'] +SUPPORTED_DOMAINS = ['binary_sensor', 'climate', 'switch'] DOMAIN = 'fritzbox'