"""Support for powering relays in a DoorBird video doorbell.""" import datetime import logging from homeassistant.components.switch import SwitchDevice import homeassistant.util.dt as dt_util from . import DOMAIN as DOORBIRD_DOMAIN _LOGGER = logging.getLogger(__name__) IR_RELAY = "__ir_light__" def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the DoorBird switch platform.""" switches = [] for doorstation in hass.data[DOORBIRD_DOMAIN]: relays = doorstation.device.info()["RELAYS"] relays.append(IR_RELAY) for relay in relays: switch = DoorBirdSwitch(doorstation, relay) switches.append(switch) add_entities(switches) class DoorBirdSwitch(SwitchDevice): """A relay in a DoorBird device.""" def __init__(self, doorstation, relay): """Initialize a relay in a DoorBird device.""" self._doorstation = doorstation self._relay = relay self._state = False self._assume_off = datetime.datetime.min if relay == IR_RELAY: self._time = datetime.timedelta(minutes=5) else: self._time = datetime.timedelta(seconds=5) @property def name(self): """Return the name of the switch.""" if self._relay == IR_RELAY: return f"{self._doorstation.name} IR" return f"{self._doorstation.name} Relay {self._relay}" @property def icon(self): """Return the icon to display.""" return "mdi:lightbulb" if self._relay == IR_RELAY else "mdi:dip-switch" @property def is_on(self): """Get the assumed state of the relay.""" return self._state def turn_on(self, **kwargs): """Power the relay.""" if self._relay == IR_RELAY: self._state = self._doorstation.device.turn_light_on() else: self._state = self._doorstation.device.energize_relay(self._relay) now = dt_util.utcnow() self._assume_off = now + self._time def turn_off(self, **kwargs): """Turn off the relays is not needed. They are time-based.""" raise NotImplementedError("DoorBird relays cannot be manually turned off.") def update(self): """Wait for the correct amount of assumed time to pass.""" if self._state and self._assume_off <= dt_util.utcnow(): self._state = False self._assume_off = datetime.datetime.min