diff --git a/miele/integrationpluginmiele.cpp b/miele/integrationpluginmiele.cpp index 10bea6af..b6ed7b48 100644 --- a/miele/integrationpluginmiele.cpp +++ b/miele/integrationpluginmiele.cpp @@ -204,7 +204,7 @@ void IntegrationPluginMiele::postSetupThing(Thing *thing) } miele->getDevicesShort(); Q_FOREACH (Thing *childThing, myThings().filterByParentId(thing->id())) { - QString deviceId = childThing->paramValue(m_idParamTypeIds.value(childThing->thingClassId())).toString(); + QString deviceId = childThing->paramValue(m_idParamTypeIds.value(childThing->thingClassId())).toString(); miele->getDeviceState(deviceId); } } @@ -214,9 +214,9 @@ void IntegrationPluginMiele::postSetupThing(Thing *thing) if (thing->thingClassId() == mieleAccountThingClassId) { Miele *miele = m_mieleConnections.value(thing); miele->getDevicesShort(); - //miele->connectEventStream(); + miele->connectEventStream(); thing->setStateValue(mieleAccountConnectedStateTypeId, true); - thing->setStateValue(mieleAccountLoggedInStateTypeId, true); + thing->setStateValue(mieleAccountLoggedInStateTypeId, true); } else if (m_idParamTypeIds.contains(thing->thingClassId())) { Thing *parentThing = myThings().findById(thing->parentId()); if (!parentThing) diff --git a/miele/miele.cpp b/miele/miele.cpp index 76b0e4ca..7562357a 100644 --- a/miele/miele.cpp +++ b/miele/miele.cpp @@ -423,24 +423,39 @@ QUuid Miele::setStartTime(const QString &deviceId, int seconds) return putAction(deviceId, doc); } -void Miele::getAllEvents() +void Miele::connectEventStream() { QUrl url = m_apiUrl; url.setPath("/v1/devices/all/events"); QNetworkRequest request(url); request.setRawHeader("Authorization", "Bearer "+m_accessToken); - request.setRawHeader("accept", "*/*"); + request.setRawHeader("accept", "text/event-stream"); QNetworkReply *reply = m_networkManager->get(request); connect(reply, &QNetworkReply::finished, [reply, this] { reply->deleteLater(); - QTimer::singleShot(5000, this, [this] {getAllEvents();}); //try to reconnect every 5 seconds + QTimer::singleShot(5000, this, [this] {connectEventStream();}); //try to reconnect every 5 seconds }); connect(reply, &QNetworkReply::readyRead, this, [this, reply]{ while (reply->canReadLine()) { - + QByteArray rawData = reply->readAll(); + qCDebug(dcMiele()) << "Raw events data: " << rawData; + QJsonDocument data = QJsonDocument::fromJson(rawData); + qCDebug(dcMiele()) << "Got events data: " << data.toJson(); + QVariantMap eventsData = data.toVariant().toMap(); + foreach (QVariant eventEntry, eventsData.values()) { + QVariantMap eventEntryMap = eventEntry.toMap(); + if (!eventEntryMap.contains("ident")) { + qCWarning(dcMiele()) << "Got event but no device ident available"; + return; + } + QVariantMap deviceIdent = eventEntryMap.value("ident").toMap().value("deviceIdentLabel").toMap(); + QString deviceId = deviceIdent.value("fabNumber").toString(); + QVariantMap state = eventEntryMap.value("state").toMap(); + emit deviceStateReceived(deviceId, state); + } } }); } diff --git a/miele/miele.h b/miele/miele.h index 20afe653..3532758d 100644 --- a/miele/miele.h +++ b/miele/miele.h @@ -128,7 +128,7 @@ public: QUuid setStartTime(const QString &deviceId, int seconds); // EVENTS - void getAllEvents(); + void connectEventStream(); private: QString m_language; QByteArray m_clientId;