diff --git a/.coveragerc b/.coveragerc index 449883265f6f2708b28bbb145d54a069c57a76cc..0c4a1f7d569fe53c13a0718dec3c9987301acc3f 100644 --- a/.coveragerc +++ b/.coveragerc @@ -790,6 +790,7 @@ omit = homeassistant/components/switch/rest.py homeassistant/components/switch/rpi_rf.py homeassistant/components/switch/snmp.py + homeassistant/components/switch/switchmate.py homeassistant/components/switch/telnet.py homeassistant/components/switch/tplink.py homeassistant/components/switch/transmission.py diff --git a/homeassistant/components/switch/switchmate.py b/homeassistant/components/switch/switchmate.py new file mode 100644 index 0000000000000000000000000000000000000000..6ce4421ebc8586be847844eeb680053f402218f3 --- /dev/null +++ b/homeassistant/components/switch/switchmate.py @@ -0,0 +1,83 @@ +""" +Support for Switchmate. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/switch.switchmate/ +""" +import logging +from datetime import timedelta + +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 +from homeassistant.exceptions import PlatformNotReady + +REQUIREMENTS = ['bluepy==1.1.4'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = 'Switchmate' +HANDLE = 0x2e +ON_KEY = b'\x00' +OFF_KEY = b'\x01' + +SCAN_INTERVAL = timedelta(minutes=30) + +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_devices, discovery_info=None) -> None: + """Perform the setup for Switchmate devices.""" + name = config.get(CONF_NAME) + mac_addr = config.get(CONF_MAC) + add_devices([Switchmate(mac_addr, name)], True) + + +class Switchmate(SwitchDevice): + """Representation of a Switchmate.""" + + def __init__(self, mac, name) -> None: + """Initialize the Switchmate.""" + # pylint: disable=import-error + import bluepy + self._state = False + self._name = name + self._mac = mac + try: + self._device = bluepy.btle.Peripheral(self._mac, + bluepy.btle.ADDR_TYPE_RANDOM) + except bluepy.btle.BTLEException: + _LOGGER.error("Failed to set up switchmate") + raise PlatformNotReady() + + @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 + + def update(self) -> None: + """Synchronize state with switch.""" + self._state = self._device.readCharacteristic(HANDLE) == ON_KEY + + @property + def is_on(self) -> bool: + """Return true if it is on.""" + return self._state + + def turn_on(self, **kwargs) -> None: + """Turn the switch on.""" + self._device.writeCharacteristic(HANDLE, ON_KEY, True) + + def turn_off(self, **kwargs) -> None: + """Turn the switch off.""" + self._device.writeCharacteristic(HANDLE, OFF_KEY, True) diff --git a/requirements_all.txt b/requirements_all.txt index 5868e6df5adfcec3e864ced1f62006f254a85d07..16c670167809a0b89486cec06bdd2cf56271e8ec 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -186,6 +186,7 @@ blinkstick==1.1.8 blockchain==1.4.4 # homeassistant.components.light.decora +# homeassistant.components.switch.switchmate # bluepy==1.1.4 # homeassistant.components.sensor.bme680