@Override
  public void onDeviceMessageReceived(ThingUID bridge, RFXComMessage message) {
    logger.trace("Received: bridge: {} message: {}", bridge, message);

    try {
      RFXComBaseMessage msg = (RFXComBaseMessage) message;
      String id = message.getDeviceId();
      ThingTypeUID uid = RFXComBindingConstants.packetTypeThingMap.get(msg.packetType);
      ThingUID thingUID =
          new ThingUID(uid, bridge, id.replace(RFXComBaseMessage.ID_DELIMITER, "_"));
      if (thingUID != null) {
        logger.trace("Adding new RFXCOM {} with id '{}' to smarthome inbox", thingUID, id);
        String subType = msg.convertSubType(String.valueOf(msg.subType)).toString();
        String label = msg.packetType + "-" + id;
        DiscoveryResult discoveryResult =
            DiscoveryResultBuilder.create(thingUID)
                .withLabel(label)
                .withProperty(RFXComBindingConstants.DEVICE_ID, id)
                .withProperty(RFXComBindingConstants.SUB_TYPE, subType)
                .withBridge(bridge)
                .build();
        thingDiscovered(discoveryResult);
      }
    } catch (Exception e) {
      logger.debug("Error occurred during device discovery", e);
    }
  }
  @Override
  public DiscoveryResult createResult(ServiceInfo service) {

    if (service.getApplication().contains("mieleathome")) {
      ThingUID uid = getThingUID(service);

      if (uid != null) {
        Map<String, Object> properties = new HashMap<>(2);

        InetAddress[] addresses = service.getInetAddresses();
        if (addresses.length > 0 && addresses[0] != null) {
          properties.put(MieleBindingConstants.HOST, addresses[0].getHostAddress());

          Socket socket = null;
          try {
            socket = new Socket(addresses[0], 80);
            InetAddress ourAddress = socket.getLocalAddress();
            properties.put(MieleBindingConstants.INTERFACE, ourAddress.getHostAddress());
          } catch (IOException e) {
            logger.error(
                "An exception occurred while connecting to the Miele Gateway : '{}'",
                e.getMessage());
          }
        }

        return DiscoveryResultBuilder.create(uid)
            .withProperties(properties)
            .withRepresentationProperty(uid.getId())
            .withLabel("Miele XGW3000 Gateway")
            .build();
      }
    }
    return null;
  }
  private void addDiscoveredThing(
      ThingUID thingUID, Map<String, Object> properties, String displayLabel) {
    DiscoveryResult discoveryResult =
        DiscoveryResultBuilder.create(thingUID)
            .withProperties(properties)
            .withBridge(netatmoBridgeHandler.getThing().getUID())
            .withLabel(displayLabel)
            .build();

    thingDiscovered(discoveryResult);
  }
  private void addThing(ThingUID bridgeUID, String thingType, String thingID) {
    logger.trace("Adding new Vitotronic thing: {}", thingID);
    ThingUID thingUID = null;
    switch (thingType) {
      case VitotronicBindingConstants.THING_ID_HEATING:
        thingUID =
            new ThingUID(VitotronicBindingConstants.THING_TYPE_UID_HEATING, bridgeUID, thingID);
        break;
      case VitotronicBindingConstants.THING_ID_PELLETBURNER:
        thingUID =
            new ThingUID(
                VitotronicBindingConstants.THING_TYPE_UID_PELLETBURNER, bridgeUID, thingID);
        break;
      case VitotronicBindingConstants.THING_ID_STORAGETANK:
        thingUID =
            new ThingUID(VitotronicBindingConstants.THING_TYPE_UID_STORAGETANK, bridgeUID, thingID);
        break;
      case VitotronicBindingConstants.THING_ID_CIRCUIT:
        thingUID =
            new ThingUID(VitotronicBindingConstants.THING_TYPE_UID_CIRCUIT, bridgeUID, thingID);
        break;
      case VitotronicBindingConstants.THING_ID_SOLAR:
        thingUID =
            new ThingUID(VitotronicBindingConstants.THING_TYPE_UID_SOLAR, bridgeUID, thingID);
        break;
    }

    if (thingUID != null) {
      logger.trace(
          "Adding new Discovery thingType: {} bridgeType: {}",
          thingUID.getThingTypeId(),
          bridgeUID.getThingTypeId());

      DiscoveryResult discoveryResult =
          DiscoveryResultBuilder.create(thingUID).withBridge(bridgeUID).withLabel(thingID).build();
      logger.trace(
          "call register: {} label: {}",
          discoveryResult.getBindingId(),
          discoveryResult.getLabel());
      thingDiscovered(discoveryResult);
    } else {
      logger.debug("Discovered Thing is unsupported: type '{}'", thingID);
    }
  }