diff --git a/.coveragerc b/.coveragerc index bd531e62f72..c1a0d0d967c 100644 --- a/.coveragerc +++ b/.coveragerc @@ -793,6 +793,7 @@ omit = homeassistant/components/switch/rest.py homeassistant/components/switch/rpi_rf.py homeassistant/components/switch/snmp.py + homeassistant/components/switch/switchbot.py homeassistant/components/switch/switchmate.py homeassistant/components/switch/telnet.py homeassistant/components/switch/tplink.py diff --git a/homeassistant/components/switch/switchbot.py b/homeassistant/components/switch/switchbot.py new file mode 100644 index 00000000000..53f987c8b46 --- /dev/null +++ b/homeassistant/components/switch/switchbot.py @@ -0,0 +1,73 @@ +""" +Support for Switchbot. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/switch.switchbot +""" +import logging + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.switch import SwitchDevice, PLATFORM_SCHEMA +from homeassistant.const import CONF_NAME, CONF_MAC + +REQUIREMENTS = ['PySwitchbot==0.3'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = 'Switchbot' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_MAC): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, +}) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Perform the setup for Switchbot devices.""" + name = config.get(CONF_NAME) + mac_addr = config[CONF_MAC] + add_entities([SwitchBot(mac_addr, name)]) + + +class SwitchBot(SwitchDevice): + """Representation of a Switchbot.""" + + def __init__(self, mac, name) -> None: + """Initialize the Switchbot.""" + import switchbot + self._state = False + self._name = name + self._mac = mac + self._device = switchbot.Switchbot(mac=mac) + + def turn_on(self, **kwargs) -> None: + """Turn device on.""" + if self._device.turn_on(): + self._state = True + + def turn_off(self, **kwargs) -> None: + """Turn device off.""" + if self._device.turn_off(): + self._state = False + + @property + def assumed_state(self) -> bool: + """Return true if unable to access real state of entity.""" + return True + + @property + def is_on(self) -> bool: + """Return true if device is on.""" + return self._state + + @property + def unique_id(self) -> str: + """Return a unique, HASS-friendly identifier for this entity.""" + return self._mac.replace(':', '') + + @property + def name(self) -> str: + """Return the name of the switch.""" + return self._name diff --git a/requirements_all.txt b/requirements_all.txt index 98f1ee570d6..8a84410b223 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -53,6 +53,9 @@ PyQRCode==1.2.1 # homeassistant.components.sensor.rmvtransport PyRMVtransport==0.0.7 +# homeassistant.components.switch.switchbot +PySwitchbot==0.3 + # homeassistant.components.xiaomi_aqara PyXiaomiGateway==0.9.5