-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgreenwave.py
144 lines (117 loc) · 4.58 KB
/
greenwave.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""
Support for Greenwave Reality (TCP Connected) lights.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/light.greenwave/
"""
import logging
from datetime import timedelta
import voluptuous as vol
from homeassistant.components.light import (
ATTR_BRIGHTNESS, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, Light)
from homeassistant.const import CONF_HOST
import homeassistant.helpers.config_validation as cv
from homeassistant.util import Throttle
REQUIREMENTS = ['greenwavereality==0.5.1']
_LOGGER = logging.getLogger(__name__)
CONF_VERSION = 'version'
SUPPORTED_FEATURES = SUPPORT_BRIGHTNESS
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_VERSION): cv.positive_int,
})
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=5)
def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the Greenwave Reality Platform."""
import greenwavereality as greenwave
import os
host = str(config.get(CONF_HOST))
tokenfile = hass.config.path('.greenwave')
if config.get(CONF_VERSION) == 3:
if os.path.exists(tokenfile):
with open(tokenfile) as tokenfile:
token = tokenfile.read()
else:
try:
token = greenwave.grab_token(host, 'hass', 'homeassistant')
except PermissionError:
_LOGGER.error('The Gateway Is Not In Sync Mode')
raise
with open(tokenfile, "w+") as tokenfile:
tokenfile.write(token)
else:
token = None
bulbs = greenwave.grab_bulbs(host, token)
add_devices(GreenwaveLight(device, host, token, GatewayData(host, token))
for device in bulbs.values())
class GreenwaveLight(Light):
"""Representation of an Greenwave Reality Light."""
def __init__(self, light, host, token, gatewaydata):
"""Initialize a Greenwave Reality Light."""
import greenwavereality as greenwave
self._did = int(light['did'])
self._name = light['name']
self._state = int(light['state'])
self._brightness = greenwave.hass_brightness(light)
self._host = str(host)
self._online = greenwave.check_online(light)
self._token = str(token)
self._gatewaydata = gatewaydata
@property
def supported_features(self):
"""Flag supported features."""
return SUPPORTED_FEATURES
@property
def available(self):
"""Return True if entity is available."""
return self._online
@property
def name(self):
"""Return the display name of this light."""
return self._name
@property
def brightness(self):
"""Return the brightness of the light."""
return self._brightness
@property
def is_on(self):
"""Return true if light is on."""
return self._state
def turn_on(self, **kwargs):
"""Instruct the light to turn on."""
import greenwavereality as greenwave
temp_brightness = int((kwargs.get(ATTR_BRIGHTNESS, 255)
/ 255) * 100)
greenwave.set_brightness(self._host, str(self._did),
temp_brightness, self._token)
greenwave.turn_on(self._host, str(self._did), self._token)
def turn_off(self, **kwargs):
"""Instruct the light to turn off."""
import greenwavereality as greenwave
greenwave.turn_off(self._host, str(self._did), self._token)
def update(self):
"""Fetch new state data for this light."""
import greenwavereality as greenwave
self._gatewaydata.update()
bulbs = self._gatewaydata.greenwave
self._state = int(bulbs[self._did]['state'])
self._brightness = greenwave.hass_brightness(bulbs[self._did])
self._online = greenwave.check_online(bulbs[self._did])
self._name = bulbs[self._did]['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