@@ -350,19 +350,29 @@ async def _ensure_connected(self) -> None:
350
350
self ._reset_disconnect_timer ()
351
351
return
352
352
_LOGGER .debug ("%s: Connecting; RSSI: %s" , self .name , self .rssi )
353
- client = await establish_connection (
354
- BleakClientWithServiceCache ,
355
- self ._ble_device ,
356
- self .name ,
357
- self ._disconnected ,
358
- use_services_cache = True ,
359
- ble_device_callback = lambda : self ._ble_device ,
360
- )
361
- _LOGGER .debug ("%s: Connected; RSSI: %s" , self .name , self .rssi )
362
- resolved = self ._resolve_characteristics (client .services )
363
- if not resolved :
364
- # Try to handle services failing to load
365
- resolved = self ._resolve_characteristics (await client .get_services ())
353
+ for attempt in range (2 ):
354
+ client = await establish_connection (
355
+ BleakClientWithServiceCache ,
356
+ self ._ble_device ,
357
+ self .name ,
358
+ self ._disconnected ,
359
+ use_services_cache = True ,
360
+ ble_device_callback = lambda : self ._ble_device ,
361
+ )
362
+ _LOGGER .debug ("%s: Connected; RSSI: %s" , self .name , self .rssi )
363
+ if self ._resolve_characteristics (client .services ):
364
+ # Supported characteristics found
365
+ break
366
+ else :
367
+ if attempt == 0 :
368
+ # Try to handle services failing to load
369
+ await client .clear_cache ()
370
+ await client .disconnect ()
371
+ continue
372
+ await client .disconnect ()
373
+ raise CharacteristicMissingError (
374
+ "Failed to find supported characteristics, device may not be supported"
375
+ )
366
376
367
377
self ._client = client
368
378
self ._reset_disconnect_timer ()
0 commit comments