2022-10-21 11:13:00 +02:00

92 lines
2.9 KiB
Python

import logging
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, get_scenes
from .plejd_device import PlejdDevice, PlejdScene
from .const import PLEJD_SERVICE
_LOGGER = logging.getLogger(__name__)
class PlejdManager:
def __init__(self, credentials):
self.credentials = credentials
self.mesh = PlejdMesh()
self.mesh.statecallback = self._update_device
self.devices = { }
self.scenes = []
self.credentials = credentials
def add_mesh_device(self, device):
_LOGGER.debug("Adding plejd %s", device)
# for d in self.devices.values():
# addr = device.address.replace(":","").replace("-","").upper()
# if d.BLE_address.upper() == addr or addr in device.name:
return self.mesh.add_mesh_node(device)
# _LOGGER.debug("Device was not expected in current mesh")
async def close_stale(self, device):
_LOGGER.debug("Closing stale connections for %s", device)
await close_stale_connections(device)
@property
def connected(self):
return self.mesh is not None and self.mesh.connected
async def get_site_data(self):
return await get_site_data(**self.credentials)
async def get_devices(self):
devices = await get_devices(**self.credentials)
self.devices = {k: PlejdDevice(self, **v) for (k,v) in devices.items()}
_LOGGER.debug("Devices")
_LOGGER.debug(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.debug("Scenes")
_LOGGER.debug(self.scenes)
return self.scenes
async def _update_device(self, deviceState):
address = deviceState["address"]
if address in self.devices:
await self.devices[address].new_state(deviceState["state"], deviceState["dim"])
@property
def keepalive_interval(self):
if self.mesh.pollonWrite:
return timedelta(seconds=10)
else:
return timedelta(minutes=10)
async def keepalive(self):
if self.mesh.crypto_key is None:
self.mesh.set_crypto_key(await get_cryptokey(**self.credentials))
if not self.mesh.connected:
if not await self.mesh.connect():
return False
retval = await self.mesh.ping()
if retval and self.mesh.pollonWrite:
await self.mesh.poll()
return retval
async def disconnect(self):
_LOGGER.debug("DISCONNECT")
await self.mesh.disconnect()
async def poll(self):
await self.mesh.poll()
async def ping(self):
retval = await self.mesh.ping()
if self.mesh.pollonWrite:
await self.poll()
return retval