diff --git a/homeassistant/components/binary_sensor/doorbird.py b/homeassistant/components/binary_sensor/doorbird.py deleted file mode 100644 index 9a13687fc54..00000000000 --- a/homeassistant/components/binary_sensor/doorbird.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Support for reading binary states from a DoorBird video doorbell.""" -from datetime import timedelta -import logging - -from homeassistant.components.binary_sensor import BinarySensorDevice -from homeassistant.components.doorbird import DOMAIN as DOORBIRD_DOMAIN -from homeassistant.util import Throttle - -DEPENDENCIES = ['doorbird'] - -_LOGGER = logging.getLogger(__name__) -_MIN_UPDATE_INTERVAL = timedelta(milliseconds=250) - -SENSOR_TYPES = { - "doorbell": { - "name": "Doorbell Ringing", - "icon": { - True: "bell-ring", - False: "bell", - None: "bell-outline" - } - } -} - - -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up the DoorBird binary sensor component.""" - device = hass.data.get(DOORBIRD_DOMAIN) - add_devices([DoorBirdBinarySensor(device, "doorbell")], True) - - -class DoorBirdBinarySensor(BinarySensorDevice): - """A binary sensor of a DoorBird device.""" - - def __init__(self, device, sensor_type): - """Initialize a binary sensor on a DoorBird device.""" - self._device = device - self._sensor_type = sensor_type - self._state = None - - @property - def name(self): - """Get the name of the sensor.""" - return SENSOR_TYPES[self._sensor_type]["name"] - - @property - def icon(self): - """Get an icon to display.""" - state_icon = SENSOR_TYPES[self._sensor_type]["icon"][self._state] - return "mdi:{}".format(state_icon) - - @property - def is_on(self): - """Get the state of the binary sensor.""" - return self._state - - @Throttle(_MIN_UPDATE_INTERVAL) - def update(self): - """Pull the latest value from the device.""" - self._state = self._device.doorbell_state() diff --git a/homeassistant/components/camera/doorbird.py b/homeassistant/components/camera/doorbird.py index cf6b6b2871f..2ca962a8450 100644 --- a/homeassistant/components/camera/doorbird.py +++ b/homeassistant/components/camera/doorbird.py @@ -1,51 +1,40 @@ -"""Support for viewing the camera feed from a DoorBird video doorbell.""" +""" +Support for viewing the camera feed from a DoorBird video doorbell. +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/camera.doorbird/ +""" import asyncio import datetime import logging -import voluptuous as vol import aiohttp import async_timeout -from homeassistant.components.camera import PLATFORM_SCHEMA, Camera +from homeassistant.components.camera import Camera from homeassistant.components.doorbird import DOMAIN as DOORBIRD_DOMAIN -from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession DEPENDENCIES = ['doorbird'] -_CAMERA_LIVE = "DoorBird Live" _CAMERA_LAST_VISITOR = "DoorBird Last Ring" -_LIVE_INTERVAL = datetime.timedelta(seconds=1) +_CAMERA_LIVE = "DoorBird Live" _LAST_VISITOR_INTERVAL = datetime.timedelta(minutes=1) +_LIVE_INTERVAL = datetime.timedelta(seconds=1) _LOGGER = logging.getLogger(__name__) _TIMEOUT = 10 # seconds -CONF_SHOW_LAST_VISITOR = 'last_visitor' - -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Optional(CONF_SHOW_LAST_VISITOR, default=False): cv.boolean -}) - @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the DoorBird camera platform.""" device = hass.data.get(DOORBIRD_DOMAIN) - - _LOGGER.debug("Adding DoorBird camera %s", _CAMERA_LIVE) - entities = [DoorBirdCamera(device.live_image_url, _CAMERA_LIVE, - _LIVE_INTERVAL)] - - if config.get(CONF_SHOW_LAST_VISITOR): - _LOGGER.debug("Adding DoorBird camera %s", _CAMERA_LAST_VISITOR) - entities.append(DoorBirdCamera(device.history_image_url(1), - _CAMERA_LAST_VISITOR, - _LAST_VISITOR_INTERVAL)) - - async_add_devices(entities) - _LOGGER.info("Added DoorBird camera(s)") + async_add_devices([ + DoorBirdCamera(device.live_image_url, _CAMERA_LIVE, _LIVE_INTERVAL), + DoorBirdCamera( + device.history_image_url(1, 'doorbell'), _CAMERA_LAST_VISITOR, + _LAST_VISITOR_INTERVAL), + ]) class DoorBirdCamera(Camera): @@ -75,7 +64,6 @@ class DoorBirdCamera(Camera): try: websession = async_get_clientsession(self.hass) - with async_timeout.timeout(_TIMEOUT, loop=self.hass.loop): response = yield from websession.get(self._url) diff --git a/homeassistant/components/doorbird.py b/homeassistant/components/doorbird.py index dcf99fe2933..56933d198f2 100644 --- a/homeassistant/components/doorbird.py +++ b/homeassistant/components/doorbird.py @@ -1,40 +1,54 @@ -"""Support for a DoorBird video doorbell.""" +""" +Support for DoorBird device. +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/doorbird/ +""" +import asyncio import logging + import voluptuous as vol from homeassistant.const import CONF_HOST, CONF_USERNAME, CONF_PASSWORD +from homeassistant.components.http import HomeAssistantView import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['DoorBirdPy==0.1.0'] +REQUIREMENTS = ['DoorBirdPy==0.1.2'] _LOGGER = logging.getLogger(__name__) DOMAIN = 'doorbird' +API_URL = '/api/{}'.format(DOMAIN) + +CONF_DOORBELL_EVENTS = 'doorbell_events' + CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Required(CONF_HOST): cv.string, vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string + vol.Required(CONF_PASSWORD): cv.string, + vol.Optional(CONF_DOORBELL_EVENTS): cv.boolean, }) }, extra=vol.ALLOW_EXTRA) +SENSOR_DOORBELL = 'doorbell' + def setup(hass, config): """Set up the DoorBird component.""" + from doorbirdpy import DoorBird + device_ip = config[DOMAIN].get(CONF_HOST) username = config[DOMAIN].get(CONF_USERNAME) password = config[DOMAIN].get(CONF_PASSWORD) - from doorbirdpy import DoorBird device = DoorBird(device_ip, username, password) status = device.ready() if status[0]: _LOGGER.info("Connected to DoorBird at %s as %s", device_ip, username) hass.data[DOMAIN] = device - return True elif status[1] == 401: _LOGGER.error("Authorization rejected by DoorBird at %s", device_ip) return False @@ -42,3 +56,31 @@ def setup(hass, config): _LOGGER.error("Could not connect to DoorBird at %s: Error %s", device_ip, str(status[1])) return False + + if config[DOMAIN].get(CONF_DOORBELL_EVENTS): + # Provide an endpoint for the device to call to trigger events + hass.http.register_view(DoorbirdRequestView()) + + # This will make HA the only service that gets doorbell events + url = '{}{}/{}'.format( + hass.config.api.base_url, API_URL, SENSOR_DOORBELL) + device.reset_notifications() + device.subscribe_notification(SENSOR_DOORBELL, url) + + return True + + +class DoorbirdRequestView(HomeAssistantView): + """Provide a page for the device to call.""" + + url = API_URL + name = API_URL[1:].replace('/', ':') + extra_urls = [API_URL + '/{sensor}'] + + # pylint: disable=no-self-use + @asyncio.coroutine + def get(self, request, sensor): + """Respond to requests from the device.""" + hass = request.app['hass'] + hass.bus.async_fire('{}_{}'.format(DOMAIN, sensor)) + return 'OK' diff --git a/requirements_all.txt b/requirements_all.txt index f3807d2e656..ece92a73cca 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -20,7 +20,7 @@ certifi>=2017.4.17 # Adafruit_BBIO==1.0.0 # homeassistant.components.doorbird -DoorBirdPy==0.1.0 +DoorBirdPy==0.1.2 # homeassistant.components.isy994 PyISY==1.1.0