134 lines
3.5 KiB
Python
134 lines
3.5 KiB
Python
|
|
from builtins import property
|
|
from collections import namedtuple
|
|
import logging
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
Device = namedtuple("Device", ["model", "type", "dimmable"])
|
|
|
|
LIGHT = "light"
|
|
SENSOR = "sensor"
|
|
SWITCH = "switch"
|
|
UNKNOWN = "unknown"
|
|
|
|
HARDWARE_TYPES = {
|
|
"0": Device("-unknown-", UNKNOWN, False),
|
|
"1": Device("DIM-01", LIGHT, True),
|
|
"2": Device("DIM-02", LIGHT, True),
|
|
"3": Device("CTR-01", LIGHT, False),
|
|
"4": Device("GWY-01", SENSOR, False),
|
|
"5": Device("LED-10", LIGHT, True),
|
|
"6": Device("WPH-01", SWITCH, False),
|
|
"7": Device("REL-01", SWITCH, False),
|
|
"8": Device("SPR-01", SWITCH, False),
|
|
"10": Device("WRT-01", SWITCH, False),
|
|
"11": Device("DIM-01-2P", LIGHT, True),
|
|
"13": Device("Generic", LIGHT, False),
|
|
"14": Device("DIM-01-LC", LIGHT, True),
|
|
"15": Device("DIM-02-LC", LIGHT, True),
|
|
"17": Device("REL-01-2P", SWITCH, False),
|
|
"18": Device("REL-02", SWITCH, False),
|
|
"20": Device("SPR-01", SWITCH, False),
|
|
"36": Device("LED-75", LIGHT, True),
|
|
}
|
|
|
|
class PlejdDevice:
|
|
|
|
def __init__(self, manager, address, BLE_address, data):
|
|
self.manager = manager
|
|
self.address = address
|
|
self._BLE_address = BLE_address
|
|
self.data = data #{name, hardwareId, dimmable, room, firmware}
|
|
|
|
self.updateCallback = None
|
|
|
|
self._state = None
|
|
self._dim = None
|
|
|
|
def __repr__(self):
|
|
return f"<PlejdDevice(<manager>, {self.address}, {self.BLE_address}, {self.data}>"
|
|
|
|
@property
|
|
def available(self):
|
|
return self._state is not None
|
|
|
|
@property
|
|
def state(self):
|
|
return self._state if self.available else False
|
|
|
|
@property
|
|
def dim(self):
|
|
return self._dim/255 if self._dim else 0
|
|
|
|
@property
|
|
def BLE_address(self):
|
|
return self._BLE_address
|
|
|
|
@property
|
|
def name(self):
|
|
return self.data["name"]
|
|
@property
|
|
def room(self):
|
|
return self.data["room"]
|
|
@property
|
|
def firmware(self):
|
|
return self.data["firmware"]
|
|
@property
|
|
def hardwareId(self):
|
|
return self.data["hardwareId"]
|
|
|
|
@property
|
|
def type(self):
|
|
return self.hardware_data.type
|
|
@property
|
|
def model(self):
|
|
return self.hardware_data.model
|
|
@property
|
|
def dimmable(self):
|
|
return self.hardware_data.dimmable and self.data["dimmable"] != False
|
|
|
|
@property
|
|
def hardware_data(self):
|
|
deviceType = HARDWARE_TYPES.get(self.data["hardwareId"], HARDWARE_TYPES["0"])
|
|
return deviceType
|
|
|
|
async def new_state(self, state, dim):
|
|
update = False
|
|
if state != self._state:
|
|
update = True
|
|
self._state = state
|
|
if dim != self._dim:
|
|
update = True
|
|
self._dim = dim
|
|
if update:
|
|
if self.updateCallback:
|
|
self.updateCallback({"state": self._state, "dim": self._dim})
|
|
|
|
async def turn_on(self, dim=0):
|
|
await self.manager.mesh.set_state(self.address, True, dim)
|
|
|
|
async def turn_off(self):
|
|
await self.manager.mesh.set_state(self.address, False)
|
|
|
|
class PlejdScene:
|
|
|
|
def __init__(self, manager, index, title):
|
|
self._manager = manager
|
|
self._index = index
|
|
self._title = title
|
|
|
|
def __repr__(self):
|
|
return f"<PlejdScene(<manager>, {self._index}, '{self._title}'>"
|
|
|
|
@property
|
|
def name(self):
|
|
return self._title
|
|
|
|
@property
|
|
def index(self):
|
|
return self._index
|
|
|
|
async def activate(self):
|
|
await self._manager.mesh.activate_scene(self._index)
|