Add scene support
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user