Multi-Room Support for Greenwave Reality (#11364)

* Multi-Room Support for Greenwave Reality

* PEP8 Line Too Long

* Update requirements_all.txt

* Shared State Object

Shared State Object added, and implemented new function of greenwavereality to abstract complex runtimes.

* Update requirements_all.txt

* Lint issues

* Rewrite method to not trigger "Method could be a function"

* Remove unnecessary arguments for update call
This commit is contained in:
David Fiel 2018-01-25 18:00:32 -05:00 committed by Pascal Vizeli
parent 94e270f828
commit caa16da5c5
2 changed files with 51 additions and 20 deletions

View File

@ -5,6 +5,7 @@ For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/light.greenwave/ https://home-assistant.io/components/light.greenwave/
""" """
import logging import logging
from datetime import timedelta
import voluptuous as vol import voluptuous as vol
@ -12,20 +13,22 @@ from homeassistant.components.light import (
ATTR_BRIGHTNESS, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, Light) ATTR_BRIGHTNESS, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, Light)
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.util import Throttle
REQUIREMENTS = ['greenwavereality==0.2.9'] REQUIREMENTS = ['greenwavereality==0.5.1']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
CONF_VERSION = 'version' CONF_VERSION = 'version'
SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS) SUPPORTED_FEATURES = SUPPORT_BRIGHTNESS
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string, vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_VERSION): cv.positive_int, vol.Required(CONF_VERSION): cv.positive_int,
}) })
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1)
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the Greenwave Reality Platform.""" """Set up the Greenwave Reality Platform."""
@ -39,29 +42,35 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
token = tokenfile.read() token = tokenfile.read()
tokenfile.close() tokenfile.close()
else: else:
token = greenwave.grab_token(host, 'hass', 'homeassistant') try:
token = greenwave.grab_token(host, 'hass', 'homeassistant')
except PermissionError:
_LOGGER.error('The Gateway Is Not In Sync Mode')
raise
tokenfile = open(tokenfile, "w+") tokenfile = open(tokenfile, "w+")
tokenfile.write(token) tokenfile.write(token)
tokenfile.close() tokenfile.close()
else: else:
token = None token = None
doc = greenwave.grab_xml(host, token) bulbs = greenwave.grab_bulbs(host, token)
add_devices(GreenwaveLight(device, host, token) for device in doc) add_devices(GreenwaveLight(device, host, token, GatewayData(host, token))
for device in bulbs.values())
class GreenwaveLight(Light): class GreenwaveLight(Light):
"""Representation of an Greenwave Reality Light.""" """Representation of an Greenwave Reality Light."""
def __init__(self, light, host, token): def __init__(self, light, host, token, gatewaydata):
"""Initialize a Greenwave Reality Light.""" """Initialize a Greenwave Reality Light."""
import greenwavereality as greenwave import greenwavereality as greenwave
self._did = light['did'] self._did = int(light['did'])
self._name = light['name'] self._name = light['name']
self._state = int(light['state']) self._state = int(light['state'])
self._brightness = greenwave.hass_brightness(light) self._brightness = greenwave.hass_brightness(light)
self._host = host self._host = host
self._online = greenwave.check_online(light) self._online = greenwave.check_online(light)
self.token = token self._token = token
self._gatewaydata = gatewaydata
@property @property
def supported_features(self): def supported_features(self):
@ -94,22 +103,44 @@ class GreenwaveLight(Light):
temp_brightness = int((kwargs.get(ATTR_BRIGHTNESS, 255) temp_brightness = int((kwargs.get(ATTR_BRIGHTNESS, 255)
/ 255) * 100) / 255) * 100)
greenwave.set_brightness(self._host, self._did, greenwave.set_brightness(self._host, self._did,
temp_brightness, self.token) temp_brightness, self._token)
greenwave.turn_on(self._host, self._did, self.token) greenwave.turn_on(self._host, self._did, self._token)
def turn_off(self, **kwargs): def turn_off(self, **kwargs):
"""Instruct the light to turn off.""" """Instruct the light to turn off."""
import greenwavereality as greenwave import greenwavereality as greenwave
greenwave.turn_off(self._host, self._did, self.token) greenwave.turn_off(self._host, self._did, self._token)
def update(self): def update(self):
"""Fetch new state data for this light.""" """Fetch new state data for this light."""
import greenwavereality as greenwave import greenwavereality as greenwave
doc = greenwave.grab_xml(self._host, self.token) self._gatewaydata.update()
bulbs = self._gatewaydata.greenwave
for device in doc: self._state = int(bulbs[self._did]['state'])
if device['did'] == self._did: self._brightness = greenwave.hass_brightness(bulbs[self._did])
self._state = int(device['state']) self._online = greenwave.check_online(bulbs[self._did])
self._brightness = greenwave.hass_brightness(device) self._name = bulbs[self._did]['name']
self._online = greenwave.check_online(device)
self._name = device['name']
class GatewayData(object):
"""Handle Gateway data and limit updates."""
def __init__(self, host, token):
"""Initialize the data object."""
import greenwavereality as greenwave
self._host = host
self._token = token
self._greenwave = greenwave.grab_bulbs(host, token)
@property
def greenwave(self):
"""Return Gateway API object."""
return self._greenwave
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self):
"""Get the latest data from the gateway."""
import greenwavereality as greenwave
self._greenwave = greenwave.grab_bulbs(self._host, self._token)
return self._greenwave

View File

@ -322,7 +322,7 @@ googlemaps==2.5.1
gps3==0.33.3 gps3==0.33.3
# homeassistant.components.light.greenwave # homeassistant.components.light.greenwave
greenwavereality==0.2.9 greenwavereality==0.5.1
# homeassistant.components.media_player.gstreamer # homeassistant.components.media_player.gstreamer
gstreamer-player==1.1.0 gstreamer-player==1.1.0