Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make MyQ platform async #18489

Merged
merged 4 commits into from
Nov 18, 2018
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 42 additions & 51 deletions homeassistant/components/cover/myq.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@
from homeassistant.const import (
CONF_PASSWORD, CONF_TYPE, CONF_USERNAME, STATE_CLOSED, STATE_CLOSING,
STATE_OPEN, STATE_OPENING)
import homeassistant.helpers.config_validation as cv

REQUIREMENTS = ['pymyq==0.0.15']
from homeassistant.helpers import aiohttp_client, config_validation as cv

REQUIREMENTS = ['pymyq==1.0.0']
_LOGGER = logging.getLogger(__name__)

DEFAULT_NAME = 'myq'
bachya marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -28,55 +27,47 @@
'opening': STATE_OPENING
}

NOTIFICATION_ID = 'myq_notification'
NOTIFICATION_TITLE = 'MyQ Cover Setup'

COVER_SCHEMA = vol.Schema({
bachya marked this conversation as resolved.
Show resolved Hide resolved
vol.Required(CONF_TYPE): cv.string,
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string
})


def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the MyQ component."""
from pymyq import MyQAPI as pymyq
async def async_setup_platform(
hass, config, async_add_entities, discovery_info=None):
"""Set up the platform."""
from pymyq import login
from pymyq.errors import MyQError, UnsupportedBrandError

username = config.get(CONF_USERNAME)
password = config.get(CONF_PASSWORD)
brand = config.get(CONF_TYPE)
myq = pymyq(username, password, brand)
websession = aiohttp_client.async_get_clientsession(hass)

username = config[CONF_USERNAME]
password = config[CONF_PASSWORD]
brand = config[CONF_TYPE]

try:
if not myq.is_supported_brand():
raise ValueError("Unsupported type. See documentation")
myq = await login(username, password, brand, websession)
except UnsupportedBrandError:
_LOGGER.error('Unsupported brand: %s', brand)
return
except MyQError as err:
_LOGGER.error('There was an error while logging in: %s', err)
return

if not myq.is_login_valid():
raise ValueError("Username or Password is incorrect")
devices = await myq.get_devices()
async_add_entities([MyQDevice(device) for device in devices], True)

add_entities(MyQDevice(myq, door) for door in myq.get_garage_doors())
return True

except (TypeError, KeyError, NameError, ValueError) as ex:
_LOGGER.error("%s", ex)
hass.components.persistent_notification.create(
'Error: {}<br />'
'You will need to restart hass after fixing.'
''.format(ex),
title=NOTIFICATION_TITLE,
notification_id=NOTIFICATION_ID)
return False
return True
bachya marked this conversation as resolved.
Show resolved Hide resolved


class MyQDevice(CoverDevice):
"""Representation of a MyQ cover."""

def __init__(self, myq, device):
def __init__(self, device):
"""Initialize with API object, device id."""
self.myq = myq
self.device_id = device['deviceid']
self._name = device['name']
self._status = None
self._device = device
self._state = None

@property
def device_class(self):
Expand All @@ -91,32 +82,22 @@ def should_poll(self):
@property
def name(self):
"""Return the name of the garage door if any."""
return self._name if self._name else DEFAULT_NAME
return self._device.name

@property
def is_closed(self):
"""Return true if cover is closed, else False."""
if self._status in [None, False]:
return None
return MYQ_TO_HASS.get(self._status) == STATE_CLOSED
return MYQ_TO_HASS.get(self._device.state) == STATE_CLOSED

@property
def is_closing(self):
"""Return if the cover is closing or not."""
return MYQ_TO_HASS.get(self._status) == STATE_CLOSING
return MYQ_TO_HASS.get(self._device.state) == STATE_CLOSING

@property
def is_opening(self):
"""Return if the cover is opening or not."""
return MYQ_TO_HASS.get(self._status) == STATE_OPENING

def close_cover(self, **kwargs):
"""Issue close command to cover."""
self.myq.close_device(self.device_id)

def open_cover(self, **kwargs):
"""Issue open command to cover."""
self.myq.open_device(self.device_id)
return MYQ_TO_HASS.get(self._device.state) == STATE_OPENING

@property
def supported_features(self):
Expand All @@ -126,8 +107,18 @@ def supported_features(self):
@property
def unique_id(self):
"""Return a unique, HASS-friendly identifier for this entity."""
return self.device_id
return self._device.device_id

async def async_close_cover(self, **kwargs):
"""Issue close command to cover."""
await self._device.close()

def update(self):
async def async_open_cover(self, **kwargs):
"""Issue open command to cover."""
await self._device.open()

async def async_update(self):
"""Update status of cover."""
self._status = self.myq.get_status(self.device_id)
await self._device.update()

self._state = self._device.state
bachya marked this conversation as resolved.
Show resolved Hide resolved
2 changes: 1 addition & 1 deletion requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1044,7 +1044,7 @@ pymonoprice==0.3
pymusiccast==0.1.6

# homeassistant.components.cover.myq
pymyq==0.0.15
pymyq==1.0.0

# homeassistant.components.mysensors
pymysensors==0.18.0
Expand Down