import asyncio
from aioesphomeapi import APIClient, BluetoothLEAdvertisement

API_KEY = "wPa6YH6Wp5qFkOz9vO1f+Xp8jJcT7KbLrM2xqU7nNjc="

found_devices = {}

def on_ble_device(adv: BluetoothLEAdvertisement):
    addr = adv.address
    name = adv.name or "<unnamed>"
    addr_str = ":".join(f"{(addr >> (i*8)) & 0xff:02x}" for i in range(5,-1,-1))
    if addr_str not in found_devices:
        found_devices[addr_str] = name
        print(f"BLE: {addr_str}  RSSI:{adv.rssi:4d}  Name: {name}", flush=True)
        if any(x in name.upper() for x in ["AP_", "SOLARMAN", "SOLAR", "DEYE", "SOLIS"]):
            print(f"  *** POTENTIAL INVERTER: {addr_str} name={name} ***", flush=True)
        if addr_str.lower() == "24:19:72:61:9d:60":
            print(f"  *** EXACT MATCH - INVERTER FOUND! ***", flush=True)

async def main():
    cli = APIClient("192.168.40.90", 6053, "", noise_psk=API_KEY)
    await cli.connect(login=True)
    print("Connected to ESP32-S3, starting BLE scan...", flush=True)
    unsub = cli.subscribe_bluetooth_le_advertisements(on_ble_device)
    await asyncio.sleep(90)
    unsub()
    print(f"\nTotal unique devices: {len(found_devices)}", flush=True)
    for addr, name in found_devices.items():
        print(f"  {addr}: {name}")
    await cli.disconnect()

asyncio.run(main())
