diff --git a/libguh/plugin/device.cpp b/libguh/plugin/device.cpp
index e5eff79e..08b746e3 100644
--- a/libguh/plugin/device.cpp
+++ b/libguh/plugin/device.cpp
@@ -111,6 +111,18 @@ QVariant Device::paramValue(const QString ¶mName) const
return QVariant();
}
+void Device::setParamValue(const QString ¶mName, const QVariant &value)
+{
+ QList params;
+ foreach (Param param, m_params) {
+ if (param.name() == paramName) {
+ param.setValue(value);
+ }
+ params.append(param);
+ }
+ m_params = params;
+}
+
/*! Returns the states of this Device. It must match the \l{StateType} description in the associated \l{DeviceClass}. */
QList Device::states() const
{
diff --git a/libguh/plugin/device.h b/libguh/plugin/device.h
index 956cf003..0b79679d 100644
--- a/libguh/plugin/device.h
+++ b/libguh/plugin/device.h
@@ -49,6 +49,7 @@ public:
void setParams(const QList ¶ms);
QVariant paramValue(const QString ¶mName) const;
+ void setParamValue(const QString ¶mName, const QVariant &value);
QList states() const;
bool hasState(const StateTypeId &stateTypeId) const;
diff --git a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp
index 174b8ce1..fe7bdb71 100644
--- a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp
+++ b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp
@@ -69,6 +69,8 @@ QList DevicePluginPhilipsHue::supportedDevices() const
QList paramTypes;
ParamType ipParam("ip", QVariant::String);
paramTypes.append(ipParam);
+ ParamType usernameParam("username", QVariant::String);
+ paramTypes.append(usernameParam);
deviceClassHue.setParamTypes(paramTypes);
QList hueStates;
@@ -146,6 +148,12 @@ DeviceManager::DeviceError DevicePluginPhilipsHue::discoverDevices(const DeviceC
return DeviceManager::DeviceErrorAsync;
}
+QPair DevicePluginPhilipsHue::setupDevice(Device *device)
+{
+ qDebug() << "setupDevice" << device->params();
+ return reportDeviceSetup();
+}
+
QPair DevicePluginPhilipsHue::confirmPairing(const QUuid &pairingTransactionId, const DeviceClassId &deviceClassId, const QList ¶ms)
{
Param ipParam;
@@ -157,12 +165,19 @@ QPair DevicePluginPhilipsHue::confirm
if (!ipParam.isValid()) {
return reportDeviceSetup(DeviceManager::DeviceSetupStatusFailure, "Missing parameter: ip");
}
-
- QString username = "guh-" + QUuid::createUuid().toString().remove(QRegExp("[\\{\\}]*")).remove(QRegExp("\\-[0-9a-f\\-]*"));
+ Param usernameParam;
+ foreach (const Param ¶m, params) {
+ if (param.name() == "username") {
+ usernameParam = param;
+ }
+ }
+ if (!usernameParam.isValid()) {
+ return reportDeviceSetup(DeviceManager::DeviceSetupStatusFailure, "Missing parameter: username");
+ }
QVariantMap createUserParams;
createUserParams.insert("devicetype", "guh");
- createUserParams.insert("username", username);
+ createUserParams.insert("username", usernameParam.value().toString());
QJsonDocument jsonDoc = QJsonDocument::fromVariant(createUserParams);
QByteArray data = jsonDoc.toJson();
@@ -171,8 +186,7 @@ QPair DevicePluginPhilipsHue::confirm
QNetworkReply *reply = m_nam->post(request, data);
connect(reply, &QNetworkReply::finished, this, &DevicePluginPhilipsHue::createUserFinished);
- HueBridgeConnection *bridge = new HueBridgeConnection(QHostAddress(ipParam.value().toString()), username);
- m_pairings.insert(reply, qMakePair(pairingTransactionId, bridge));
+ m_pairings.insert(reply, pairingTransactionId);
return reportDeviceSetup(DeviceManager::DeviceSetupStatusAsync);
}
@@ -202,6 +216,8 @@ void DevicePluginPhilipsHue::discoveryDone(const QList &bridges)
QList params;
Param param("ip", bridge.toString());
params.append(param);
+ Param userParam("username", "guh-" + QUuid::createUuid().toString().remove(QRegExp("[\\{\\}]*")).remove(QRegExp("\\-[0-9a-f\\-]*")));
+ params.append(userParam);
descriptor.setParams(params);
deviceDescriptors.append(descriptor);
}
@@ -214,15 +230,12 @@ void DevicePluginPhilipsHue::createUserFinished()
QNetworkReply *reply = static_cast(sender());
QByteArray data = reply->readAll();
- QPair pair = m_pairings.take(reply);
- QUuid pairingTransactionId = pair.first;
- HueBridgeConnection *bridge = pair.second;
+ QUuid pairingTransactionId = m_pairings.take(reply);
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusFailure, "Pairing failed. Failed to parse response from Hue Bridge.");
- delete bridge;
return;
}
@@ -231,12 +244,9 @@ void DevicePluginPhilipsHue::createUserFinished()
if (response.contains("error")) {
qDebug() << "Failed to pair Hue bridge:" << response.value("error").toMap().value("description");
emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusFailure, "Pairing failed:" + response.value("error").toMap().value("description").toString());
- delete bridge;
return;
}
emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusSuccess, QString());
-
- m_bridges.append(bridge);
qDebug() << "response" << response << data;
}
diff --git a/plugins/deviceplugins/philipshue/devicepluginphilipshue.h b/plugins/deviceplugins/philipshue/devicepluginphilipshue.h
index bac9d0a0..07624f72 100644
--- a/plugins/deviceplugins/philipshue/devicepluginphilipshue.h
+++ b/plugins/deviceplugins/philipshue/devicepluginphilipshue.h
@@ -48,6 +48,8 @@ public:
QList configurationDescription() const override;
DeviceManager::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const QVariantMap ¶ms) const override;
+ QPair setupDevice(Device *device) override;
+
QPair confirmPairing(const QUuid &pairingTransactionId, const DeviceClassId &deviceClassId, const QList ¶ms) override;
public slots:
@@ -63,9 +65,7 @@ private:
Discovery *m_discovery;
QNetworkAccessManager *m_nam;
- QHash > m_pairings;
-
- QList m_bridges;
+ QHash m_pairings;
};
#endif // DEVICEPLUGINBOBLIGHT_H