discoverBridges static method

Future<List<DiscoveredBridge>> discoverBridges({
  1. BridgeDiscoveryMethod method = BridgeDiscoveryMethod.endpoint,
  2. List<Bridge> savedBridges = const [],
})

Searches the network for Philips Hue bridges.

Returns a list of DiscoveredBridge objects. These contain the IP address of the bridge and a partial ID of the bridge.

method The method used to discover bridges. The default is endpoint. The mDNS method has some bugs on iOS. The endpoint method might not work immediately after starting a new bridge, or plugging in an old one. The bridge needs to be connected to the network for a few minutes before it can be discovered using the endpoint method. This is an edge case, and endpoint is still the recommended method.

If savedBridges is provided, the bridges that are already saved to the device will be removed from the search results.

Implementation

static Future<List<DiscoveredBridge>> discoverBridges({
  BridgeDiscoveryMethod method = BridgeDiscoveryMethod.endpoint,
  List<Bridge> savedBridges = const [],
}) async {
  /// Bridges found using MDNS.
  List<DiscoveredBridge> bridgesFromMdns;
  if (MiscTools.isWeb) {
    // mDNS does not work on web.
    bridgesFromMdns = [];
  } else {
    if (identical(method, BridgeDiscoveryMethod.mdns) ||
        identical(method, BridgeDiscoveryMethod.both)) {
      bridgesFromMdns = await BridgeDiscoveryService.discoverBridgesMdns();
    } else {
      bridgesFromMdns = [];
    }
  }

  /// Bridges found using the endpoint method.
  List<DiscoveredBridge> bridgesFromEndpoint;
  if (identical(method, BridgeDiscoveryMethod.endpoint) ||
      identical(method, BridgeDiscoveryMethod.both)) {
    bridgesFromEndpoint =
        await BridgeDiscoveryService.discoverBridgesEndpoint();
  } else {
    bridgesFromEndpoint = [];
  }

  // Remove duplicates from the two search methods.
  Set<DiscoveredBridge> uniqueValues = {};
  for (final DiscoveredBridge bridgeFromMdns in bridgesFromMdns) {
    for (final DiscoveredBridge bridgeFromEndpoint in bridgesFromEndpoint) {
      if (bridgeFromMdns.ipAddress == bridgeFromEndpoint.ipAddress) {
        bridgeFromMdns.rawIdFromEndpoint =
            bridgeFromEndpoint.rawIdFromEndpoint;
        bridgesFromEndpoint.remove(bridgeFromEndpoint);
        break;
      }
    }
    uniqueValues.add(bridgeFromMdns);
  }
  uniqueValues.addAll(bridgesFromEndpoint);

  if (savedBridges.isEmpty) return uniqueValues.toList();

  List<DiscoveredBridge> newBridges = [];

  // Remove the bridges that are already saved to the device from the search
  // results.
  for (final DiscoveredBridge discoveredBridge in uniqueValues) {
    bool isSaved = false;

    for (Bridge bridge in savedBridges) {
      if (bridge.ipAddress != null &&
          bridge.ipAddress == discoveredBridge.ipAddress) {
        isSaved = true;
        break;
      }
    }

    if (!isSaved) {
      newBridges.add(discoveredBridge);
    }
  }

  return newBridges;
}