From 39592396232f47eedb0443445310673f09a94677 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Tue, 30 Jun 2020 15:54:24 +0200 Subject: [PATCH] added async setup --- solarlog/integrationpluginsolarlog.cpp | 52 ++++++++++++++++++------- solarlog/integrationpluginsolarlog.h | 2 + solarlog/integrationpluginsolarlog.json | 40 +++++++++---------- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/solarlog/integrationpluginsolarlog.cpp b/solarlog/integrationpluginsolarlog.cpp index a490edae..9b354604 100644 --- a/solarlog/integrationpluginsolarlog.cpp +++ b/solarlog/integrationpluginsolarlog.cpp @@ -43,11 +43,24 @@ IntegrationPluginSolarLog::IntegrationPluginSolarLog() void IntegrationPluginSolarLog::setupThing(ThingSetupInfo *info) { + Thing *thing = info->thing(); + if (thing->thingClassId() == solarlogThingClassId) { + getData(thing); + m_asyncSetup.insert(thing, info); + connect(info, &ThingSetupInfo::aborted, this, [thing, this] {m_asyncSetup.remove(thing);}); + } else { + Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} + +void IntegrationPluginSolarLog::postSetupThing(Thing *thing) +{ + Q_UNUSED(thing) + if (!m_refreshTimer) { m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); connect(m_refreshTimer, &PluginTimer::timeout, this, &IntegrationPluginSolarLog::onRefreshTimer); } - info->finish(Thing::ThingErrorNoError); } void IntegrationPluginSolarLog::thingRemoved(Thing *thing) @@ -74,7 +87,7 @@ void IntegrationPluginSolarLog::getData(Thing *thing) url.setPath("/getjp"); url.setScheme("http"); QNetworkRequest request(url); - request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "text/plain"); + request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json"); QNetworkReply *reply = hardwareManager()->networkManager()->post(request, QByteArray("{\"801\":{\"170\":null}}")); connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [this, reply, thing]{ @@ -83,39 +96,52 @@ void IntegrationPluginSolarLog::getData(Thing *thing) // Check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { - if (reply->error() == QNetworkReply::HostNotFoundError) { - } + thing->setStateValue(solarlogConnectedStateTypeId, false); qCWarning(dcSolarlog()) << "Request error:" << status << reply->errorString(); + if (m_asyncSetup.contains(thing)) { + ThingSetupInfo *info = m_asyncSetup.take(thing); + info->finish(Thing::ThingErrorHardwareNotAvailable, "No Solar-Log device at given IP-Address"); + } return; } + thing->setStateValue(solarlogConnectedStateTypeId, true); QByteArray rawData = reply->readAll(); qCDebug(dcSolarlog()) << "Data:" << rawData; QJsonParseError error; QJsonDocument data = QJsonDocument::fromJson(rawData, &error); if (error.error != QJsonParseError::NoError) { - qCWarning(dcSolarlog()) << "Received invalide JSON object" << data.toJson(); + qCWarning(dcSolarlog()) << "Received invalide JSON object, try to upgrade the Solarlog firmware. Min Version is 3.5."; + if (m_asyncSetup.contains(thing)) { + ThingSetupInfo *info = m_asyncSetup.take(thing); + info->finish(Thing::ThingErrorHardwareFailure, "Firmware outdated"); + } return; } + if (m_asyncSetup.contains(thing)) { + ThingSetupInfo *info = m_asyncSetup.take(thing); + info->finish(Thing::ThingErrorNoError); + } + QVariantMap map = data.toVariant().toMap().value("801").toMap().value("170").toMap(); qCDebug(dcSolarlog()) << "Map 170:" << map; thing->setStateValue(solarlogLastupdateStateTypeId, map.value(QString::number(JsonObjectNumbers::LastUpdateTime))); - thing->setStateValue(solarlogPacStateTypeId, map.value(QString::number(JsonObjectNumbers::Pac))); - thing->setStateValue(solarlogPdcStateTypeId, map.value(QString::number(JsonObjectNumbers::Pdc))); + thing->setStateValue(solarlogPacStateTypeId, (map.value(QString::number(JsonObjectNumbers::Pac)).toDouble()/1000.00)); + thing->setStateValue(solarlogPdcStateTypeId, (map.value(QString::number(JsonObjectNumbers::Pdc)).toDouble()/1000.00)); thing->setStateValue(solarlogUacStateTypeId, map.value(QString::number(JsonObjectNumbers::Uac))); thing->setStateValue(solarlogDcVoltageStateTypeId, map.value(QString::number(JsonObjectNumbers::DCVoltage))); - thing->setStateValue(solarlogYieldDayStateTypeId, map.value(QString::number(JsonObjectNumbers::YieldDay))); - thing->setStateValue(solarlogYieldYesterdayStateTypeId, map.value(QString::number(JsonObjectNumbers::YieldYesterday))); - thing->setStateValue(solarlogYieldMonthStateTypeId, map.value(QString::number(JsonObjectNumbers::YieldMonth))); - thing->setStateValue(solarlogYieldYearStateTypeId, map.value(QString::number(JsonObjectNumbers::YieldYear))); - thing->setStateValue(solarlogYieldTotalStateTypeId, map.value(QString::number(JsonObjectNumbers::YieldTotal))); + thing->setStateValue(solarlogYieldDayStateTypeId, (map.value(QString::number(JsonObjectNumbers::YieldDay)).toDouble()/1000.00)); + thing->setStateValue(solarlogYieldYesterdayStateTypeId, (map.value(QString::number(JsonObjectNumbers::YieldYesterday)).toDouble()/1000.00)); + thing->setStateValue(solarlogYieldMonthStateTypeId, (map.value(QString::number(JsonObjectNumbers::YieldMonth)).toDouble()/1000.00)); + thing->setStateValue(solarlogYieldYearStateTypeId, (map.value(QString::number(JsonObjectNumbers::YieldYear)).toDouble()/1000.00)); + thing->setStateValue(solarlogYieldTotalStateTypeId, (map.value(QString::number(JsonObjectNumbers::YieldTotal)).toDouble()/1000.00)); thing->setStateValue(solarlogCurrentTotalConsumptionStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsPac))); thing->setStateValue(solarlogConsYieldDayStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsYieldDay))); thing->setStateValue(solarlogConsYieldYesterdayStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsYieldYesterday))); thing->setStateValue(solarlogConsYieldMonthStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsYieldMonth))); thing->setStateValue(solarlogConsYieldYearStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsYieldYear))); thing->setStateValue(solarlogConsYieldTotalStateTypeId, map.value(QString::number(JsonObjectNumbers::ConsYieldTotal))); - thing->setStateValue(solarlogTotalPowerStateTypeId, map.value(QString::number(JsonObjectNumbers::TotalPower))); + thing->setStateValue(solarlogTotalPowerStateTypeId, (map.value(QString::number(JsonObjectNumbers::TotalPower)).toDouble()/1000.00)); }); } diff --git a/solarlog/integrationpluginsolarlog.h b/solarlog/integrationpluginsolarlog.h index 82d8fb45..b81e45ae 100644 --- a/solarlog/integrationpluginsolarlog.h +++ b/solarlog/integrationpluginsolarlog.h @@ -67,6 +67,7 @@ public: explicit IntegrationPluginSolarLog(); void setupThing(ThingSetupInfo *info) override; + void postSetupThing(Thing *thing) override; void thingRemoved(Thing *thing) override; private slots: @@ -74,6 +75,7 @@ private slots: private: PluginTimer *m_refreshTimer = nullptr; + QHash m_asyncSetup; void getData(Thing *thing); }; diff --git a/solarlog/integrationpluginsolarlog.json b/solarlog/integrationpluginsolarlog.json index 9df383fd..1d5a8a25 100644 --- a/solarlog/integrationpluginsolarlog.json +++ b/solarlog/integrationpluginsolarlog.json @@ -28,8 +28,8 @@ { "id": "eb9f8575-71e3-42a9-aa4d-ffea9586cc4f", "name": "connected", - "displayName": "Connected", - "displayNameEvent": "Connected changed", + "displayName": "Reachable", + "displayNameEvent": "Reachable changed", "type": "bool", "defaultValue": false, "cached": false @@ -45,26 +45,26 @@ { "id": "0bf515d8-0f48-4eba-9255-f774d68c80fe", "name": "pac", - "displayName": "PAC", - "displayNameEvent": "PAC changed", + "displayName": "Power AC", + "displayNameEvent": "Power AC changed", "type": "int", - "unit": "Watt", + "unit": "KiloWatt", "defaultValue": 0 }, { "id": "e4183a70-c848-447a-962a-f19dc5974140", "name": "pdc", - "displayName": "PDC", - "displayNameEvent": "PDC changed", + "displayName": "Power DC", + "displayNameEvent": "Power DC changed", "type": "int", - "unit": "Watt", + "unit": "KiloWatt", "defaultValue": 0 }, { "id": "7dc46b2e-5fba-4cc6-a159-09472cdfac62", "name": "uac", - "displayName": "UAC", - "displayNameEvent": "UAC changed", + "displayName": "AC voltage", + "displayNameEvent": "AC voltage changed", "type": "int", "unit": "Volt", "defaultValue": 0 @@ -72,8 +72,8 @@ { "id": "bb891a05-59d8-4a3b-a0ea-b63af58558f7", "name": "dcVoltage", - "displayName": "DC Voltage", - "displayNameEvent": "DC Voltage changed", + "displayName": "DC voltage", + "displayNameEvent": "DC voltage changed", "type": "int", "unit": "Volt", "defaultValue": 0 @@ -129,7 +129,7 @@ "displayName": "Current total consumption", "displayNameEvent": "Current total consumption changed", "type": "int", - "unit": "Watt", + "unit": "KiloWatt", "defaultValue": 0 }, { @@ -153,8 +153,8 @@ { "id": "a45a557a-a937-4382-8ef5-76f1ff5940e4", "name": "consYieldMonth", - "displayName": "consYieldMonth", - "displayNameEvent": "consYieldMonth changed", + "displayName": "Cons yield month", + "displayNameEvent": "Cons yield month changed", "type": "int", "unit": "KiloWattHour", "defaultValue": 0 @@ -162,8 +162,8 @@ { "id": "1d42619b-3a50-4bde-b325-67a8014332ef", "name": "consYieldYear", - "displayName": "consYieldYear", - "displayNameEvent": "consYieldYear changed", + "displayName": "Cons yield year", + "displayNameEvent": "Cons yield year changed", "type": "int", "unit": "KiloWattHour", "defaultValue": 0 @@ -171,8 +171,8 @@ { "id": "34f60062-5dec-45ed-9a27-4fbc083cb36e", "name": "consYieldTotal", - "displayName": "consYieldTotal", - "displayNameEvent": "consYieldTotal changed", + "displayName": "Cons yield total", + "displayNameEvent": "Cons yield total changed", "type": "int", "unit": "KiloWattHour", "defaultValue": 0 @@ -183,7 +183,7 @@ "displayName": "Installed generator power", "displayNameEvent": "Installed generator power changed", "type": "int", - "unit": "Watt", + "unit": "KiloWatt", "defaultValue": 0 } ]