added async setup

This commit is contained in:
Boernsman 2020-06-30 15:54:24 +02:00
parent 72f821849b
commit 3959239623
3 changed files with 61 additions and 33 deletions

View File

@ -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));
});
}

View File

@ -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<Thing *, ThingSetupInfo *> m_asyncSetup;
void getData(Thing *thing);
};

View File

@ -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
}
]