88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
"""
|
|
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.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.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)
|
|
|
|
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
|
|
elif status[1] == 401:
|
|
_LOGGER.error("Authorization rejected by DoorBird at %s", device_ip)
|
|
return False
|
|
else:
|
|
_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."""
|
|
|
|
requires_auth = False
|
|
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'
|