diff --git a/homeassistant/components/bluetooth/base_scanner.py b/homeassistant/components/bluetooth/base_scanner.py index e8de285138e..455619182ab 100644 --- a/homeassistant/components/bluetooth/base_scanner.py +++ b/homeassistant/components/bluetooth/base_scanner.py @@ -303,7 +303,19 @@ class BaseHaRemoteScanner(BaseHaScanner): ) -> None: """Call the registered callback.""" self._last_detection = advertisement_monotonic_time - if prev_discovery := self._discovered_device_advertisement_datas.get(address): + try: + prev_discovery = self._discovered_device_advertisement_datas[address] + except KeyError: + # We expect this is the rare case and since py3.11+ has + # near zero cost try on success, and we can avoid .get() + # which is slower than [] we use the try/except pattern. + device = BLEDevice( + address=address, + name=local_name, + details=self._details | details, + rssi=rssi, # deprecated, will be removed in newer bleak + ) + else: # Merge the new data with the old data # to function the same as BlueZ which # merges the dicts on PropertiesChanged @@ -344,13 +356,6 @@ class BaseHaRemoteScanner(BaseHaScanner): device.details = self._details | details # pylint: disable-next=protected-access device._rssi = rssi # deprecated, will be removed in newer bleak - else: - device = BLEDevice( - address=address, - name=local_name, - details=self._details | details, - rssi=rssi, # deprecated, will be removed in newer bleak - ) advertisement_data = AdvertisementData( local_name=None if local_name == "" else local_name,