108 lines
2.9 KiB
Python

from builtins import property
from collections import namedtuple
Device = namedtuple("Device", ["model", "type", "dimmable"])
LIGHT = "light"
SENSOR = "sensor"
SWITCH = "switch"
HARDWARE_TYPES = {
"0": Device("-unknown-", LIGHT, 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),
"9": Device("-unknown-", LIGHT, False),
"10": Device("WRT-01", SWITCH, False),
"11": Device("DIM-01", LIGHT, True),
"12": Device("-unknown-", LIGHT, False),
"13": Device("Generic", LIGHT, False),
"14": Device("DIM-01", LIGHT, True),
"15": Device("-unknown-", LIGHT, False),
"16": Device("-unknown-", LIGHT, False),
"17": Device("REL-01", SWITCH, False),
"18": Device("REL-02", SWITCH, False),
"19": Device("-unknown-", LIGHT, False),
"20": Device("SPR-01", SWITCH, False),
}
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
@property
def state(self):
return self._state
@property
def dim(self):
return self._dim/255
@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:
await 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)