1 """Bluetooth support for Ruuvi Gateway."""
3 from __future__
import annotations
9 FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS,
12 async_register_scanner,
17 from .coordinator
import RuuviGatewayUpdateCoordinator
19 _LOGGER = logging.getLogger(__name__)
23 """Scanner for Ruuvi Gateway."""
30 coordinator: RuuviGatewayUpdateCoordinator,
32 """Initialize the scanner, using the given update coordinator as data source."""
46 data_age_seconds = now - tag_data.timestamp
47 if data_age_seconds > FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS:
50 anno = tag_data.parse_announcement()
51 self._async_on_advertisement(
54 local_name=anno.local_name,
55 service_data=anno.service_data,
56 service_uuids=anno.service_uuids,
57 manufacturer_data=anno.manufacturer_data,
58 tx_power=anno.tx_power,
60 advertisement_monotonic_time=monotonic_now - data_age_seconds,
65 """Start polling; return a callback to stop polling."""
72 coordinator: RuuviGatewayUpdateCoordinator,
73 ) -> tuple[RuuviGatewayScanner, CALLBACK_TYPE]:
74 """Connect scanner and start polling."""
75 assert entry.unique_id
is not None
76 source =
str(entry.unique_id)
78 "%s [%s]: Connecting scanner",
85 coordinator=coordinator,
89 scanner.async_setup(),
90 scanner.start_polling(),
95 for unloader
in unload_callbacks:
98 return (scanner, _async_unload)
None __init__(self, str scanner_id, str name, *RuuviGatewayUpdateCoordinator coordinator)
None _async_handle_new_data(self)
CALLBACK_TYPE start_polling(self)
CALLBACK_TYPE async_register_scanner(HomeAssistant hass, BaseHaScanner scanner, int|None connection_slots=None)
None _async_unload(list[CALLBACK_TYPE] unload_callbacks)
None async_add_listener(HomeAssistant hass, Callable[[], None] listener)
tuple[RuuviGatewayScanner, CALLBACK_TYPE] async_connect_scanner(HomeAssistant hass, ConfigEntry entry, RuuviGatewayUpdateCoordinator coordinator)