diff --git a/avahimonitor/devicepluginavahimonitor.cpp b/avahimonitor/devicepluginavahimonitor.cpp index 46c64a1b..4083b3cd 100644 --- a/avahimonitor/devicepluginavahimonitor.cpp +++ b/avahimonitor/devicepluginavahimonitor.cpp @@ -82,6 +82,12 @@ DeviceManager::DeviceError DevicePluginAvahiMonitor::discoverDevices(const Devic params.append(Param(avahiDeviceServiceParamTypeId, service.name())); params.append(Param(avahiDeviceHostNameParamTypeId, service.hostName())); deviceDescriptor.setParams(params); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(avahiDeviceServiceParamTypeId).toString() == service.name() && existingDevice->paramValue(avahiDeviceHostNameParamTypeId).toString() == service.hostName()) { + deviceDescriptor.setDeviceId(existingDevice->id()); + break; + } + } deviceDescriptors.append(deviceDescriptor); } diff --git a/elgato/devicepluginelgato.cpp b/elgato/devicepluginelgato.cpp index d8f32c18..937e5d25 100644 --- a/elgato/devicepluginelgato.cpp +++ b/elgato/devicepluginelgato.cpp @@ -604,6 +604,12 @@ void DevicePluginElgato::onBluetoothDiscoveryFinished() params.append(Param(aveaDeviceNameParamTypeId, deviceInfo.name())); params.append(Param(aveaDeviceMacAddressParamTypeId, deviceInfo.address().toString())); descriptor.setParams(params); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(aveaDeviceMacAddressParamTypeId).toString() == deviceInfo.address().toString()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } deviceDescriptors.append(descriptor); } } diff --git a/eq-3/deviceplugineq-3.cpp b/eq-3/deviceplugineq-3.cpp index 3a11faf0..3dd2a723 100644 --- a/eq-3/deviceplugineq-3.cpp +++ b/eq-3/deviceplugineq-3.cpp @@ -245,6 +245,13 @@ void DevicePluginEQ3::discoveryDone(const QList &cubeList) Param serialNumberParam(cubeDeviceSerialParamTypeId, cube->serialNumber()); params.append(serialNumberParam); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(cubeDeviceSerialParamTypeId).toString() == cube->serialNumber()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + descriptor.setParams(params); retList.append(descriptor); } diff --git a/flowercare/devicepluginflowercare.cpp b/flowercare/devicepluginflowercare.cpp index 95a83fac..6e492253 100644 --- a/flowercare/devicepluginflowercare.cpp +++ b/flowercare/devicepluginflowercare.cpp @@ -172,6 +172,12 @@ void DevicePluginFlowercare::onBluetoothDiscoveryFinished() params.append(Param(flowerCareDeviceNameParamTypeId, deviceInfo.name())); params.append(Param(flowerCareDeviceMacParamTypeId, deviceInfo.address().toString())); descriptor.setParams(params); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(flowerCareDeviceMacParamTypeId).toString() == deviceInfo.address().toString()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } deviceDescriptors.append(descriptor); } } diff --git a/gpio/deviceplugingpio.cpp b/gpio/deviceplugingpio.cpp index 93d9f8b5..2d8832ce 100644 --- a/gpio/deviceplugingpio.cpp +++ b/gpio/deviceplugingpio.cpp @@ -185,6 +185,13 @@ DeviceManager::DeviceError DevicePluginGpio::discoverDevices(const DeviceClassId } descriptor.setParams(parameters); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(gpioOutputRpiDeviceGpioParamTypeId).toInt() == gpioDescriptor.gpio()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + deviceDescriptors.append(descriptor); } diff --git a/lgsmarttv/devicepluginlgsmarttv.cpp b/lgsmarttv/devicepluginlgsmarttv.cpp index ef9cd34c..c677d6dc 100644 --- a/lgsmarttv/devicepluginlgsmarttv.cpp +++ b/lgsmarttv/devicepluginlgsmarttv.cpp @@ -340,6 +340,13 @@ void DevicePluginLgSmartTv::onUpnpDiscoveryFinished() params.append(Param(lgSmartTvDevicePortParamTypeId, upnpDeviceDescriptor.port())); params.append(Param(lgSmartTvDeviceKeyParamTypeId, QString())); descriptor.setParams(params); + + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(lgSmartTvDeviceUuidParamTypeId).toString() == upnpDeviceDescriptor.uuid()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } deviceDescriptors.append(descriptor); } emit devicesDiscovered(lgSmartTvDeviceClassId, deviceDescriptors); diff --git a/networkdetector/devicepluginnetworkdetector.cpp b/networkdetector/devicepluginnetworkdetector.cpp index ae6bd65c..68347ae9 100644 --- a/networkdetector/devicepluginnetworkdetector.cpp +++ b/networkdetector/devicepluginnetworkdetector.cpp @@ -156,6 +156,13 @@ void DevicePluginNetworkDetector::discoveryFinished(const QList &hosts) paramList.append(address); descriptor.setParams(paramList); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(networkDeviceDeviceMacAddressParamTypeId).toString() == host.macAddress()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + discoveredDevices.append(descriptor); } diff --git a/openweathermap/devicepluginopenweathermap.cpp b/openweathermap/devicepluginopenweathermap.cpp index 77a13e66..d313f513 100644 --- a/openweathermap/devicepluginopenweathermap.cpp +++ b/openweathermap/devicepluginopenweathermap.cpp @@ -312,16 +312,22 @@ void DevicePluginOpenweathermap::processGeoSearchResponse(QByteArray data) void DevicePluginOpenweathermap::processSearchResults(const QList &cityList) { QList retList; - foreach (QVariantMap elemant, cityList) { - DeviceDescriptor descriptor(openweathermapDeviceClassId, elemant.value("name").toString(), elemant.value("country").toString()); + foreach (QVariantMap element, cityList) { + DeviceDescriptor descriptor(openweathermapDeviceClassId, element.value("name").toString(), element.value("country").toString()); ParamList params; - Param nameParam(openweathermapDeviceNameParamTypeId, elemant.value("name")); + Param nameParam(openweathermapDeviceNameParamTypeId, element.value("name")); params.append(nameParam); - Param countryParam(openweathermapDeviceCountryParamTypeId, elemant.value("country")); + Param countryParam(openweathermapDeviceCountryParamTypeId, element.value("country")); params.append(countryParam); - Param idParam(openweathermapDeviceIdParamTypeId, elemant.value("id")); + Param idParam(openweathermapDeviceIdParamTypeId, element.value("id")); params.append(idParam); descriptor.setParams(params); + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(openweathermapDeviceIdParamTypeId).toString() == element.value("id")) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } retList.append(descriptor); } emit devicesDiscovered(openweathermapDeviceClassId, retList); diff --git a/philipshue/devicepluginphilipshue.cpp b/philipshue/devicepluginphilipshue.cpp index bac78a06..770b6326 100644 --- a/philipshue/devicepluginphilipshue.cpp +++ b/philipshue/devicepluginphilipshue.cpp @@ -121,7 +121,6 @@ DeviceManager::DeviceSetupStatus DevicePluginPhilipsHue::setupDevice(Device *dev // set data which was not known during discovery device->setParamValue(bridgeDeviceApiKeyParamTypeId, b->apiKey()); device->setParamValue(bridgeDeviceZigbeeChannelParamTypeId, b->zigbeeChannel()); - device->setParamValue(bridgeDeviceIdParamTypeId, b->id()); device->setParamValue(bridgeDeviceMacParamTypeId, b->macAddress()); m_bridges.insert(b, device); device->setStateValue(bridgeConnectedStateTypeId, true); @@ -283,6 +282,8 @@ DeviceManager::DeviceSetupStatus DevicePluginPhilipsHue::confirmPairing(const Pa { Q_UNUSED(secret) + qCDebug(dcPhilipsHue()) << "Confirming pairing for transactionId" << pairingTransactionId; + if (deviceClassId != bridgeDeviceClassId) return DeviceManager::DeviceSetupStatusFailure; @@ -408,7 +409,7 @@ void DevicePluginPhilipsHue::networkManagerReplyReady() // check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (device->stateValue(colorLightConnectedStateTypeId).toBool()) { + if (device->stateValue(bridgeConnectedStateTypeId).toBool()) { qCWarning(dcPhilipsHue) << "Refresh Hue lights request error:" << status << reply->errorString(); bridgeReachableChanged(device, false); } @@ -421,7 +422,7 @@ void DevicePluginPhilipsHue::networkManagerReplyReady() // check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (device->stateValue(remoteConnectedStateTypeId).toBool() || device->stateValue(tapConnectedStateTypeId).toBool()) { + if (device->stateValue(bridgeConnectedStateTypeId).toBool()) { qCWarning(dcPhilipsHue) << "Refresh Hue sensors request error:" << status << reply->errorString(); bridgeReachableChanged(device, false); } @@ -764,11 +765,20 @@ void DevicePluginPhilipsHue::onUpnpDiscoveryFinished() } } params.append(Param(bridgeDeviceHostParamTypeId, upnpDevice.hostAddress().toString())); + params.append(Param(bridgeDeviceIdParamTypeId, upnpDevice.serialNumber().toLower())); + // Not known yet... params.append(Param(bridgeDeviceApiKeyParamTypeId, QString())); params.append(Param(bridgeDeviceMacParamTypeId, QString())); - params.append(Param(bridgeDeviceIdParamTypeId, upnpDevice.serialNumber().toLower())); params.append(Param(bridgeDeviceZigbeeChannelParamTypeId, -1)); descriptor.setParams(params); + + Device *dev = bridgeForBridgeId(upnpDevice.serialNumber().toLower()); + if (dev) { + qCDebug(dcPhilipsHue()) << "Found already added Hue bridge:" << upnpDevice.serialNumber().toLower(); + descriptor.setDeviceId(dev->id()); + } else { + qCDebug(dcPhilipsHue()) << "Found new Hue bridge:" << upnpDevice.serialNumber().toLower(); + } deviceDescriptors.append(descriptor); } } @@ -1289,13 +1299,6 @@ void DevicePluginPhilipsHue::processInformationResponse(PairingInfo *pairingInfo bridge->setName(response.value("name").toString()); bridge->setZigbeeChannel(response.value("zigbeechannel").toInt()); - if (bridgeAlreadyAdded(bridge->id())) { - qCWarning(dcPhilipsHue) << "Bridge with id" << bridge->id() << "already added."; - emit pairingFinished(pairingInfo->pairingTransactionId(), DeviceManager::DeviceSetupStatusFailure); - bridge->deleteLater(); - pairingInfo->deleteLater(); - } - m_unconfiguredBridges.append(bridge); emit pairingFinished(pairingInfo->pairingTransactionId(), DeviceManager::DeviceSetupStatusSuccess); @@ -1345,6 +1348,8 @@ void DevicePluginPhilipsHue::bridgeReachableChanged(Device *device, const bool & light->setReachable(false); if (m_lights.value(light)->deviceClassId() == colorLightDeviceClassId) { m_lights.value(light)->setStateValue(colorLightConnectedStateTypeId, false); + } else if (m_lights.value(light)->deviceClassId() == colorTemperatureLightDeviceClassId) { + m_lights.value(light)->setStateValue(colorTemperatureLightConnectedStateTypeId, false); } else if (m_lights.value(light)->deviceClassId() == dimmableLightDeviceClassId) { m_lights.value(light)->setStateValue(dimmableLightConnectedStateTypeId, false); } @@ -1366,16 +1371,17 @@ void DevicePluginPhilipsHue::bridgeReachableChanged(Device *device, const bool & } -bool DevicePluginPhilipsHue::bridgeAlreadyAdded(const QString &id) +Device* DevicePluginPhilipsHue::bridgeForBridgeId(const QString &id) { foreach (Device *device, myDevices()) { if (device->deviceClassId() == bridgeDeviceClassId) { - if (device->paramValue(bridgeDeviceIdParamTypeId).toString() == id) { - return true; + qCDebug(dcPhilipsHue()) << "Have bridge" << device->name() << device->paramValue(bridgeDeviceIdParamTypeId).toString().toLower() << id; + if (device->paramValue(bridgeDeviceIdParamTypeId).toString().toLower() == id) { + return device; } } } - return false; + return nullptr; } bool DevicePluginPhilipsHue::lightAlreadyAdded(const QString &uuid) diff --git a/philipshue/devicepluginphilipshue.h b/philipshue/devicepluginphilipshue.h index 5b4ef521..ce76f6db 100644 --- a/philipshue/devicepluginphilipshue.h +++ b/philipshue/devicepluginphilipshue.h @@ -118,7 +118,7 @@ private: void bridgeReachableChanged(Device *device, const bool &reachable); - bool bridgeAlreadyAdded(const QString &id); + Device* bridgeForBridgeId(const QString &id); bool lightAlreadyAdded(const QString &uuid); bool sensorAlreadyAdded(const QString &uuid); diff --git a/unipi/devicepluginunipi.cpp b/unipi/devicepluginunipi.cpp index 05fe779a..9604899d 100644 --- a/unipi/devicepluginunipi.cpp +++ b/unipi/devicepluginunipi.cpp @@ -154,8 +154,16 @@ DeviceManager::DeviceError DevicePluginUniPi::discoverDevices(const DeviceClassI DeviceDescriptor descriptor(deviceClassId, QString("Relay %1").arg(circuit), circuit); ParamList parameters; parameters.append(Param(relayOutputDeviceNumberParamTypeId, circuit)); - descriptor.setParams(parameters); + + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(relayOutputDeviceNumberParamTypeId).toString() == circuit) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + + deviceDescriptors.append(descriptor); } emit devicesDiscovered(deviceClassId, deviceDescriptors); diff --git a/wemo/devicepluginwemo.cpp b/wemo/devicepluginwemo.cpp index 69ea1f44..6192b134 100644 --- a/wemo/devicepluginwemo.cpp +++ b/wemo/devicepluginwemo.cpp @@ -254,6 +254,13 @@ void DevicePluginWemo::onUpnpDiscoveryFinished() params.append(Param(wemoSwitchDevicePortParamTypeId, upnpDeviceDescriptor.port())); params.append(Param(wemoSwitchDeviceSerialParamTypeId, upnpDeviceDescriptor.serialNumber())); descriptor.setParams(params); + + foreach (Device *existingDevice, myDevices()) { + if (existingDevice->paramValue(wemoSwitchDeviceSerialParamTypeId).toString() == upnpDeviceDescriptor.serialNumber()) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } deviceDescriptors.append(descriptor); } }