diff --git a/homeassistant/components/bluetooth/scanner.py b/homeassistant/components/bluetooth/scanner.py index a80386c25ef..911862a4221 100644 --- a/homeassistant/components/bluetooth/scanner.py +++ b/homeassistant/components/bluetooth/scanner.py @@ -91,12 +91,16 @@ def create_bleak_scanner( "detection_callback": detection_callback, "scanning_mode": SCANNING_MODE_TO_BLEAK[scanning_mode], } - if platform.system() == "Linux": + system = platform.system() + if system == "Linux": # Only Linux supports multiple adapters if adapter: scanner_kwargs["adapter"] = adapter if scanning_mode == BluetoothScanningMode.PASSIVE: scanner_kwargs["bluez"] = PASSIVE_SCANNER_ARGS + elif system == "Darwin": + # We want mac address on macOS + scanner_kwargs["cb"] = {"use_bdaddr": True} _LOGGER.debug("Initializing bluetooth scanner with %s", scanner_kwargs) try: diff --git a/tests/components/bluetooth/test_scanner.py b/tests/components/bluetooth/test_scanner.py index 81f9765de03..fcff8c15d58 100644 --- a/tests/components/bluetooth/test_scanner.py +++ b/tests/components/bluetooth/test_scanner.py @@ -2,7 +2,7 @@ import asyncio from datetime import timedelta import time -from unittest.mock import MagicMock, patch +from unittest.mock import ANY, MagicMock, patch from bleak import BleakError from bleak.backends.scanner import AdvertisementDataCallback @@ -18,6 +18,7 @@ from homeassistant.components.bluetooth.scanner import NEED_RESET_ERRORS from homeassistant.config_entries import ConfigEntryState from homeassistant.const import EVENT_HOMEASSISTANT_STARTED, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant +from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util from . import ( @@ -27,7 +28,7 @@ from . import ( generate_ble_device, ) -from tests.common import async_fire_time_changed +from tests.common import MockConfigEntry, async_fire_time_changed async def test_config_entry_can_be_reloaded_when_stop_raises( @@ -580,3 +581,50 @@ async def test_restart_takes_longer_than_watchdog_time( await hass.async_block_till_done() assert "already restarting" in caplog.text + + +async def test_setup_and_stop_macos( + hass: HomeAssistant, mock_bleak_scanner_start: MagicMock, macos_adapter: None +) -> None: + """Test we enable use_bdaddr on MacOS.""" + entry = MockConfigEntry( + domain=bluetooth.DOMAIN, + data={}, + unique_id="00:00:00:00:00:00", + ) + entry.add_to_hass(hass) + init_kwargs = None + + class MockBleakScanner: + def __init__(self, *args, **kwargs): + """Init the scanner.""" + nonlocal init_kwargs + init_kwargs = kwargs + + async def start(self, *args, **kwargs): + """Start the scanner.""" + + async def stop(self, *args, **kwargs): + """Stop the scanner.""" + + def register_detection_callback(self, *args, **kwargs): + """Register a callback.""" + + with patch( + "homeassistant.components.bluetooth.scanner.OriginalBleakScanner", + MockBleakScanner, + ): + assert await async_setup_component( + hass, bluetooth.DOMAIN, {bluetooth.DOMAIN: {}} + ) + hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED) + await hass.async_block_till_done() + + hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) + await hass.async_block_till_done() + + assert init_kwargs == { + "detection_callback": ANY, + "scanning_mode": "active", + "cb": {"use_bdaddr": True}, + }