From ee45fa097df675b0452adba132ac99bc7c237d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 17 Oct 2022 19:57:26 +0200 Subject: [PATCH] Cleaner logs. Only connect to devices in site --- custom_components/plejd/__init__.py | 57 ++++++++++--------- custom_components/plejd/pyplejd/__init__.py | 9 ++- .../plejd/pyplejd/plejd_device.py | 6 +- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/custom_components/plejd/__init__.py b/custom_components/plejd/__init__.py index 683eb1c..4f61d70 100644 --- a/custom_components/plejd/__init__.py +++ b/custom_components/plejd/__init__.py @@ -15,7 +15,6 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "plejd" async def async_setup(hass, config): - _LOGGER.error("Setting up plejd") if not hass.config_entries.async_entries("plejd"): hass.async_create_task( hass.config_entries.flow.async_init( @@ -32,6 +31,7 @@ async def async_setup_entry(hass, config_entry): devices = await plejdManager.get_devices() + # Add a service entry if there are no devices - just so the user can get diagnostics data if sum(d.type in ["light", "switch"] for d in devices.values()) == 0: site_data = await plejdManager.get_site_data() @@ -44,13 +44,6 @@ async def async_setup_entry(hass, config_entry): entry_type=dr.DeviceEntryType.SERVICE, ) - for dev in devices.values(): - ble_device = bluetooth.async_ble_device_from_address( - hass, dev.BLE_address, True - ) - if ble_device: - await plejdManager.close_stale(ble_device) - hass.data.setdefault(DOMAIN, {}).update( { "stopping": False, @@ -59,8 +52,36 @@ async def async_setup_entry(hass, config_entry): } ) + # Close any stale connections that may be open + for dev in devices.values(): + ble_device = bluetooth.async_ble_device_from_address( + hass, dev.BLE_address, True + ) + if ble_device: + await plejdManager.close_stale(ble_device) + + # Search for devices in the mesh + def _discovered_plejd(service_info, *_): + plejdManager.add_mesh_device(service_info.device) + bluetooth.async_register_callback( + hass, + _discovered_plejd, + BluetoothCallbackMatcher( + connectable=True, + service_uuid=pyplejd.const.PLEJD_SERVICE.lower() + ), + bluetooth.BluetoothScanningMode.PASSIVE + ) + + # Run through already discovered devices and add plejds to the mesh + for service_info in bluetooth.async_discovered_service_info(hass, True): + if pyplejd.PLEJD_SERVICE.lower() in service_info.advertisement.service_uuids: + plejdManager.add_mesh_device(service_info.device) + + await hass.config_entries.async_forward_entry_setups(config_entry, ["light", "switch"]) + # Ping mesh intermittently to keep the connection alive async def _ping(now=None): if hass.data[DOMAIN]["stopping"]: return if not await plejdManager.keepalive(): @@ -72,17 +93,7 @@ async def async_setup_entry(hass, config_entry): ) hass.async_create_task(_ping()) - bluetooth.async_register_callback( - hass, - plejdManager.discover_plejd, - BluetoothCallbackMatcher( - connectable=True, - service_uuid=pyplejd.const.PLEJD_SERVICE.lower() - ), - bluetooth.BluetoothScanningMode.PASSIVE - ) - - + # Cleanup when Home Assistant stops async def _stop(ev): hass.data[DOMAIN]["stopping"] = True if "ping_timer" in hass.data[DOMAIN]: @@ -91,13 +102,5 @@ async def async_setup_entry(hass, config_entry): config_entry.async_on_unload( hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _stop) ) - - for service_info in bluetooth.async_discovered_service_info(hass, True): - if pyplejd.PLEJD_SERVICE.lower() in service_info.advertisement.service_uuids: - plejdManager.discover_plejd(service_info) - return True - - - diff --git a/custom_components/plejd/pyplejd/__init__.py b/custom_components/plejd/pyplejd/__init__.py index 92fb5b9..336e3b9 100644 --- a/custom_components/plejd/pyplejd/__init__.py +++ b/custom_components/plejd/pyplejd/__init__.py @@ -20,9 +20,12 @@ class PlejdManager: self.devices = { } self.credentials = credentials - def discover_plejd(self, service_info, *_): - _LOGGER.debug("Adding plejd %s", service_info) - self.mesh.add_mesh_node(service_info.device) + def add_mesh_device(self, device): + _LOGGER.debug("Adding plejd %s", device) + for d in self.devices.items(): + if d.BLE_address.upper() == device.address.replace(":","").replace("-","").upper(): + return self.mesh.add_mesh_node(device) + _LOGGER.debug("Device was not expected in current mesh") async def close_stale(self, device): _LOGGER.info("Closing stale connections for %s", device) diff --git a/custom_components/plejd/pyplejd/plejd_device.py b/custom_components/plejd/pyplejd/plejd_device.py index bb656e2..ebe06b6 100644 --- a/custom_components/plejd/pyplejd/plejd_device.py +++ b/custom_components/plejd/pyplejd/plejd_device.py @@ -43,6 +43,10 @@ class PlejdDevice: self._state = None self._dim = None + def __repr__(self): + return f"" + pass + @property def available(self): return self._state is not None @@ -104,5 +108,3 @@ class PlejdDevice: async def turn_off(self): await self.manager.mesh.set_state(self.address, False) - -