@@ -100,100 +100,6 @@ def __init__(
100100 self .filters = filters
101101
102102
103- class ConnectionHistory :
104- """Connection history."""
105-
106- __slots__ = ("_connecting" , "_failures" )
107-
108- def __init__ (self ) -> None :
109- """Init connection history."""
110- self ._failures : dict [BaseHaScanner , dict [str , int ]] = {}
111- self ._connecting : dict [BaseHaScanner , dict [str , int ]] = {}
112-
113- def clear (self , scanner : BaseHaScanner ) -> None :
114- """Clear the connection history for a scanner."""
115- self ._failures .pop (scanner , None )
116- self ._connecting .pop (scanner , None )
117-
118- def finished_connecting (
119- self , scanner : BaseHaScanner , address : str , connected : bool
120- ) -> None :
121- """Finished connecting."""
122- self ._remove_connecting (scanner , address )
123- if connected :
124- self ._clear_connect_failure (scanner , address )
125- else :
126- self ._add_connect_failure (scanner , address )
127-
128- def _increase_ref_count (self , target : dict [str , int ], address : str ) -> None :
129- """Increase the reference count."""
130- if address in target :
131- target [address ] += 1
132- else :
133- target [address ] = 1
134-
135- def _add_connect_failure (self , scanner : BaseHaScanner , address : str ) -> None :
136- """Add a connect failure."""
137- self ._increase_ref_count (self ._failures .setdefault (scanner , {}), address )
138-
139- def add_connecting (self , scanner : BaseHaScanner , address : str ) -> None :
140- """Add a connecting."""
141- self ._increase_ref_count (self ._connecting .setdefault (scanner , {}), address )
142-
143- def _remove_connecting (self , scanner : BaseHaScanner , address : str ) -> None :
144- """Remove a connecting."""
145- if scanner not in self ._connecting or address not in self ._connecting [scanner ]:
146- _LOGGER .warning (
147- "Removing a non-existing connecting %s %s" , scanner , address
148- )
149- return
150- self ._connecting [scanner ][address ] -= 1
151- if not self ._connecting [scanner ][address ]:
152- del self ._connecting [scanner ][address ]
153- if not self ._connecting [scanner ]:
154- del self ._connecting [scanner ]
155-
156- def _clear_connect_failure (self , scanner : BaseHaScanner , address : str ) -> None :
157- """Clear a connect failure."""
158- if scanner not in self ._failures or address not in self ._failures [scanner ]:
159- return
160- del self ._failures [scanner ][address ]
161- if not self ._failures [scanner ]:
162- del self ._failures [scanner ]
163-
164- def score_connection_paths (
165- self , rssi_diff : _int , scanner_device : BluetoothScannerDevice
166- ) -> float :
167- """Score the connection paths."""
168- scanner = scanner_device .scanner
169- address = scanner_device .ble_device .address
170- score = scanner_device .advertisement .rssi or NO_RSSI_VALUE
171- scanner_connections_in_progress = len (self ._connecting .get (scanner , ()))
172- previous_failures = self ._failures .get (scanner , {}).get (address , 0 )
173- if scanner_connections_in_progress :
174- # Very large penalty for multiple connections in progress
175- # to avoid overloading the adapter
176- score -= rssi_diff * scanner_connections_in_progress * 1.01
177- if previous_failures :
178- score -= rssi_diff * previous_failures * 0.51
179- return score
180-
181- def in_progress (self , scanner : BaseHaScanner ) -> int :
182- """Return if the connection is in progress."""
183- if scanner not in self ._connecting :
184- return 0
185- in_progress = 0
186- for count in self ._connecting [scanner ].values ():
187- in_progress += count
188- return in_progress
189-
190- def failures (self , scanner : BaseHaScanner , address : str ) -> int :
191- """Return the number of failures."""
192- if scanner not in self ._failures or address not in self ._failures [scanner ]:
193- return 0
194- return self ._failures [scanner ][address ]
195-
196-
197103class BluetoothManager :
198104 """Manage Bluetooth."""
199105
@@ -258,7 +164,6 @@ def __init__(
258164 self ._sources : dict [str , BaseHaScanner ] = {}
259165 self ._bluetooth_adapters = bluetooth_adapters or get_adapters ()
260166 self .slot_manager = slot_manager or BleakSlotManager ()
261- self ._connection_history = ConnectionHistory ()
262167 self ._cancel_allocation_callbacks = (
263168 self .slot_manager .register_allocation_callback (
264169 self ._async_slot_manager_changed
@@ -843,7 +748,7 @@ def _async_unregister_scanner_internal(
843748 _LOGGER .debug ("Unregistering scanner %s" , scanner .name )
844749 self ._advertisement_tracker .async_remove_source (scanner .source )
845750 scanners .remove (scanner )
846- self . _connection_history . clear ( scanner )
751+ scanner . _clear_connection_history ( )
847752 del self ._sources [scanner .source ]
848753 del self ._adapter_sources [scanner .adapter ]
849754 self ._allocations .pop (scanner .source , None )
@@ -866,7 +771,7 @@ def async_register_scanner(
866771 source = scanner .source , slots = 0 , free = 0 , allocated = []
867772 )
868773 scanners .add (scanner )
869- self . _connection_history . clear ( scanner )
774+ scanner . _clear_connection_history ( )
870775 self ._sources [scanner .source ] = scanner
871776 self ._adapter_sources [scanner .adapter ] = scanner .source
872777 if connection_slots :
0 commit comments