diff --git a/aqi/airqualityindex.cpp b/aqi/airqualityindex.cpp index c7837e92..42fd2b61 100644 --- a/aqi/airqualityindex.cpp +++ b/aqi/airqualityindex.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -54,8 +54,9 @@ QUuid AirQualityIndex::searchByName(const QString &name) { if (m_apiKey.isEmpty()) { qCWarning(dcAirQualityIndex()) << "API key is not set, not sending request"; - return ""; + return QUuid(); } + QUuid requestId = QUuid::createUuid();; QUrl url; url.setUrl(m_baseUrl); @@ -75,13 +76,14 @@ QUuid AirQualityIndex::searchByName(const QString &name) // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (status == 400) { + if (status == 400) qCWarning(dcAirQualityIndex()) << "Request error due to exceeded request quota"; - } - requestExecuted(requestId, false); + + emit requestExecuted(requestId, false); qCWarning(dcAirQualityIndex()) << "Request error:" << status << reply->errorString(); return; } + QByteArray rawData = reply->readAll(); qCDebug(dcAirQualityIndex()) << "Search response" << rawData; @@ -95,7 +97,7 @@ QUuid AirQualityIndex::searchByName(const QString &name) QList stations; QVariantList stationList = doc.toVariant().toMap().value("data").toList(); - foreach (QVariant stationVariant, stationList) { + foreach (const QVariant &stationVariant, stationList) { Station station; station.aqi = stationVariant.toMap().value("aqi").toInt(); station.idx = stationVariant.toMap().value("idx").toInt(); @@ -107,10 +109,11 @@ QUuid AirQualityIndex::searchByName(const QString &name) station.location.longitude = stationVariant.toMap().value("city").toMap().value("geo").toList().last().toDouble(); stations.append(station); } + if (!stations.isEmpty()) emit stationsReceived(requestId, stations); - requestExecuted(requestId, true); + emit requestExecuted(requestId, true); }); return requestId; } @@ -119,18 +122,23 @@ QUuid AirQualityIndex::getDataByIp() { if (m_apiKey.isEmpty()) { qCWarning(dcAirQualityIndex()) << "API key is not set, not sending request"; - return ""; + return QUuid(); } + QUuid requestId = QUuid::createUuid(); + QUrl url; url.setUrl(m_baseUrl); url.setPath("/feed/here/"); + QUrlQuery query; query.addQueryItem("token", m_apiKey); url.setQuery(query); + QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", "nymea"); + qCDebug(dcAirQualityIndex()) << "Get data by IP request" << url.toString(); QNetworkReply *reply = m_networkAccessManager->get(request); connect(reply, &QNetworkReply::finished, this, [requestId, reply, this] { @@ -139,17 +147,20 @@ QUuid AirQualityIndex::getDataByIp() // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (status == 400) { + if (status == 400) qCWarning(dcAirQualityIndex()) << "Request error due to exceeded request quota"; - } - requestExecuted(requestId, false); + + emit requestExecuted(requestId, false); qCWarning(dcAirQualityIndex()) << "Request error:" << status << reply->errorString(); return; } + if (!parseData(requestId, reply->readAll())) - requestExecuted(requestId, false); - requestExecuted(requestId, true); + emit requestExecuted(requestId, false); + + emit requestExecuted(requestId, true); }); + return requestId; } @@ -157,19 +168,23 @@ QUuid AirQualityIndex::getDataByGeolocation(double lat, double lng) { if (m_apiKey.isEmpty()) { qCWarning(dcAirQualityIndex()) << "API key is not set, not sending request"; - return ""; + return QUuid(); } QUuid requestId = QUuid::createUuid(); + QUrl url; url.setUrl(m_baseUrl); url.setPath(QString("/feed/geo:%1;%2/").arg(lat).arg(lng)); + QUrlQuery query; query.addQueryItem("token", m_apiKey); url.setQuery(query); + QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", "nymea"); + qCDebug(dcAirQualityIndex()) << "Get data by geo location request" << url.toString(); QNetworkReply *reply = m_networkAccessManager->get(request); connect(reply, &QNetworkReply::finished, this, [requestId, reply, this] { @@ -178,21 +193,22 @@ QUuid AirQualityIndex::getDataByGeolocation(double lat, double lng) // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (status == 400) { + if (status == 400) qCWarning(dcAirQualityIndex()) << "Request error due to exceeded request quota"; - } - requestExecuted(requestId, false); + + emit requestExecuted(requestId, false); qCWarning(dcAirQualityIndex()) << "Request error:" << status << reply->errorString(); return; } if (!parseData(requestId, reply->readAll())) - requestExecuted(requestId, false); - requestExecuted(requestId, true); + emit requestExecuted(requestId, false); + + emit requestExecuted(requestId, true); }); + return requestId; } - bool AirQualityIndex::parseData(QUuid requestId, const QByteArray &data) { qCDebug(dcAirQualityIndex()) << "Parsing data" << data; @@ -211,8 +227,8 @@ bool AirQualityIndex::parseData(QUuid requestId, const QByteArray &data) } Station station; - station.aqi = doc.toVariant().toMap().value("data").toMap().value("aqi").toInt(); - station.idx = doc.toVariant().toMap().value("data").toMap().value("idx").toInt(); + station.aqi = doc.toVariant().toMap().value("data").toMap().value("aqi").toInt(); + station.idx = doc.toVariant().toMap().value("data").toMap().value("idx").toInt(); QVariantMap city = doc.toVariant().toMap().value("data").toMap().value("city").toMap(); if (city["geo"].toList().length() == 2) { @@ -241,6 +257,7 @@ bool AirQualityIndex::parseData(QUuid requestId, const QByteArray &data) aqiData.co = iaqi["co"].toMap().value("v").toDouble(); aqiData.temperature = iaqi["t"].toMap().value("v").toDouble(); aqiData.windSpeed = iaqi["w"].toMap().value("v").toDouble(); + emit dataReceived(requestId, aqiData); return true; } diff --git a/aqi/airqualityindex.h b/aqi/airqualityindex.h index 79cd1393..e84dabc9 100644 --- a/aqi/airqualityindex.h +++ b/aqi/airqualityindex.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -31,12 +31,13 @@ #ifndef AIRQUALITYINDEX_H #define AIRQUALITYINDEX_H -#include "network/networkaccessmanager.h" #include #include #include +#include + class AirQualityIndex : public QObject { Q_OBJECT @@ -70,6 +71,7 @@ public: }; explicit AirQualityIndex(NetworkAccessManager *networkAccessManager, const QString &apiKey, QObject *parent = nullptr); + void setApiKey(const QString &apiKey); QUuid searchByName(const QString &name); QUuid getDataByIp(); diff --git a/aqi/aqi.pro b/aqi/aqi.pro index 0c7b9893..a95cf11e 100644 --- a/aqi/aqi.pro +++ b/aqi/aqi.pro @@ -1,12 +1,12 @@ include(../plugins.pri) -QT+= network +QT *= network SOURCES += \ airqualityindex.cpp \ - integrationpluginaqi.cpp \ + integrationpluginaqi.cpp HEADERS += \ airqualityindex.h \ - integrationpluginaqi.h \ + integrationpluginaqi.h diff --git a/aqi/integrationpluginaqi.cpp b/aqi/integrationpluginaqi.cpp index 1d5261b5..46cfacf1 100644 --- a/aqi/integrationpluginaqi.cpp +++ b/aqi/integrationpluginaqi.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -30,7 +30,8 @@ #include "integrationpluginaqi.h" #include "plugininfo.h" -#include "nymeasettings.h" + +#include #include @@ -122,7 +123,8 @@ void IntegrationPluginAqi::discoverThings(ThingDiscoveryInfo *info) if(!createAqiConnection()) { return info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("API key is not available.")); } - connect(info, &ThingDiscoveryInfo::aborted, [this] { + + connect(info, &ThingDiscoveryInfo::aborted, this, [this] { if (myThings().filterByThingClassId(airQualityIndexThingClassId).isEmpty()) { m_aqiConnection->deleteLater(); m_aqiConnection = nullptr; @@ -133,7 +135,9 @@ void IntegrationPluginAqi::discoverThings(ThingDiscoveryInfo *info) } QUuid requestId = m_aqiConnection->getDataByIp(); m_asyncDiscovery.insert(requestId, info); - connect(info, &ThingDiscoveryInfo::aborted, [=] {m_asyncDiscovery.remove(requestId);}); + connect(info, &ThingDiscoveryInfo::aborted, this, [this, requestId] { + m_asyncDiscovery.remove(requestId); + }); } void IntegrationPluginAqi::setupThing(ThingSetupInfo *info) @@ -148,7 +152,7 @@ void IntegrationPluginAqi::setupThing(ThingSetupInfo *info) QUuid requestId = m_aqiConnection->getDataByGeolocation(latitude, longitude); m_asyncSetups.insert(requestId, info); - connect(info, &ThingSetupInfo::aborted, [requestId, this] { + connect(info, &ThingSetupInfo::aborted, this, [requestId, this] { m_asyncSetups.remove(requestId); if (myThings().filterByThingClassId(airQualityIndexThingClassId).isEmpty()) { m_aqiConnection->deleteLater(); @@ -219,6 +223,7 @@ double IntegrationPluginAqi::convertFromAQI(int aqi, const QListsetStateValue(airQualityIndexConnectedStateTypeId, true); thing->setStateValue(airQualityIndexHumidityStateTypeId, data.humidity); thing->setStateValue(airQualityIndexTemperatureStateTypeId, data.temperature); @@ -284,7 +288,6 @@ void IntegrationPluginAqi::onAirQualityStationsReceived(QUuid requestId, QListfinish(Thing::ThingErrorNoError); } - if (m_asyncRequests.contains(requestId)) { Thing * thing = myThings().findById(m_asyncRequests.value(requestId)); if (!thing) { diff --git a/aqi/integrationpluginaqi.h b/aqi/integrationpluginaqi.h index b3c115e0..ee515db2 100644 --- a/aqi/integrationpluginaqi.h +++ b/aqi/integrationpluginaqi.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -31,11 +31,11 @@ #ifndef INTEGRATIONPLUGINAQI_H #define INTEGRATIONPLUGINAQI_H -#include "plugintimer.h" -#include "integrations/integrationplugin.h" -#include "network/networkaccessmanager.h" -#include "airqualityindex.h" +#include +#include +#include +#include "airqualityindex.h" #include "extern-plugininfo.h" #include @@ -64,6 +64,7 @@ private: QHash m_asyncDiscovery; QHash m_asyncSetups; QHash m_asyncRequests; + QString getApiKey(); bool createAqiConnection(); @@ -74,6 +75,7 @@ private slots: void onRequestExecuted(QUuid requestId, bool success); void onAirQualityDataReceived(QUuid requestId, AirQualityIndex::AirQualityData data); void onAirQualityStationsReceived(QUuid requestId, QList stations); + }; #endif // INTEGRATIONPLUGINAQI_H