From 4b124e4c251dece478f00bda3a4b1765c960ffa8 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Mon, 17 Dec 2018 20:50:56 +0100 Subject: [PATCH] Add native ESPHome API switch (#19376) * Add esphomelib native API switch * Update * :ambulance: Lint --- homeassistant/components/esphome/__init__.py | 1 + homeassistant/components/switch/esphome.py | 63 ++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 homeassistant/components/switch/esphome.py diff --git a/homeassistant/components/esphome/__init__.py b/homeassistant/components/esphome/__init__.py index 5c162914946..6655b187483 100644 --- a/homeassistant/components/esphome/__init__.py +++ b/homeassistant/components/esphome/__init__.py @@ -37,6 +37,7 @@ HA_COMPONENTS = [ 'cover', 'fan', 'light', + 'switch', ] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/switch/esphome.py b/homeassistant/components/switch/esphome.py new file mode 100644 index 00000000000..cfa11db9437 --- /dev/null +++ b/homeassistant/components/switch/esphome.py @@ -0,0 +1,63 @@ +"""Support for ESPHome switches.""" +import logging + +from typing import TYPE_CHECKING, Optional + +from homeassistant.components.esphome import EsphomeEntity, \ + platform_async_setup_entry +from homeassistant.components.switch import SwitchDevice +from homeassistant.config_entries import ConfigEntry +from homeassistant.helpers.typing import HomeAssistantType + +if TYPE_CHECKING: + # pylint: disable=unused-import + from aioesphomeapi import SwitchInfo, SwitchState # noqa + +DEPENDENCIES = ['esphome'] +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry(hass: HomeAssistantType, + entry: ConfigEntry, async_add_entities) -> None: + """Set up ESPHome switches based on a config entry.""" + # pylint: disable=redefined-outer-name + from aioesphomeapi import SwitchInfo, SwitchState # noqa + + await platform_async_setup_entry( + hass, entry, async_add_entities, + component_key='switch', + info_type=SwitchInfo, entity_type=EsphomeSwitch, + state_type=SwitchState + ) + + +class EsphomeSwitch(EsphomeEntity, SwitchDevice): + """A switch implementation for ESPHome.""" + + @property + def _static_info(self) -> 'SwitchInfo': + return super()._static_info + + @property + def _state(self) -> Optional['SwitchState']: + return super()._state + + @property + def icon(self) -> str: + """Return the icon.""" + return self._static_info.icon + + @property + def is_on(self): + """Return true if the switch is on.""" + if self._state is None: + return None + return self._state.state + + async def async_turn_on(self, **kwargs): + """Turn the entity on.""" + await self._client.switch_command(self._static_info.key, True) + + async def async_turn_off(self, **kwargs): + """Turn the entity off.""" + await self._client.switch_command(self._static_info.key, False)