Add scene support

This commit is contained in:
2022-10-20 17:27:31 +02:00
parent bdd6ab840c
commit 071aa7a9ac
8 changed files with 107 additions and 19 deletions

View File

@@ -4,8 +4,8 @@ from datetime import timedelta
from bleak_retry_connector import close_stale_connections
from .mesh import PlejdMesh
from .api import get_cryptokey, get_devices, get_site_data
from .plejd_device import PlejdDevice
from .api import get_cryptokey, get_devices, get_site_data, get_scenes
from .plejd_device import PlejdDevice, PlejdScene
from .const import PLEJD_SERVICE
@@ -18,6 +18,7 @@ class PlejdManager:
self.mesh = PlejdMesh()
self.mesh.statecallback = self._update_device
self.devices = { }
self.scenes = []
self.credentials = credentials
def add_mesh_device(self, device):
@@ -46,6 +47,13 @@ class PlejdManager:
_LOGGER.info(self.devices)
return self.devices
async def get_scenes(self):
scenes = await get_scenes(**self.credentials)
self.scenes = [PlejdScene(self, **s) for s in scenes]
_LOGGER.info("Scenes")
_LOGGER.info(self.scenes)
return self.scenes
async def _update_device(self, deviceState):
address = deviceState["address"]
if address in self.devices:

View File

@@ -103,3 +103,18 @@ async def get_devices(**credentials):
}
return retval
async def get_scenes(**credentials):
site_data = await get_site_data(**credentials)
retval = []
for scene in site_data["scenes"]:
if scene["hiddenFromSceneList"]: continue
sceneId = scene["sceneId"]
index = site_data["sceneIndex"].get(sceneId)
retval.append({
"index": index,
"title": scene["title"],
})
return retval

View File

@@ -136,6 +136,13 @@ class PlejdMesh():
await self.poll()
return retval
async def activate_scene(self, index):
payload = binascii.a2b_hex(f"0201100021{index:02x}")
retval = await self.write(payload)
if self.pollonWrite:
await self.poll()
return retval
async def ping(self):
if self.client is None:
return False

View File

@@ -48,7 +48,6 @@ class PlejdDevice:
def __repr__(self):
return f"<PlejdDevice(<manager>, {self.address}, {self.BLE_address}, {self.data}>"
pass
@property
def available(self):
@@ -111,3 +110,24 @@ class PlejdDevice:
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)