Fronius: Set energy states to 0 if not connected

pull/654/head
Simon Stürz 2023-02-02 00:12:57 +01:00
parent bc059d4efd
commit eadc69b4e3
2 changed files with 53 additions and 11 deletions

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2022, nymea GmbH
* Copyright 2013 - 2023, nymea GmbH
* Contact: contact@nymea.io
*
* This file is part of nymea.
@ -170,7 +170,14 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info)
if (!available) {
// Update all child things, they will be set to available once the connection starts working again
foreach (Thing *childThing, myThings().filterByParentId(thing->id())) {
childThing->setStateValue("connected", false);
// Reset live data states in order to show missing information by 0 line and not by keeping the last known value
if (childThing->thingClassId() == inverterThingClassId) {
markInverterAsDisconnected(childThing);
} else if (childThing->thingClassId() == meterThingClassId) {
markMeterAsDisconnected(childThing);
} else if (childThing->thingClassId() == storageThingClassId) {
markStorageAsDisconnected(childThing);
}
}
}
});
@ -435,7 +442,7 @@ void IntegrationPluginFronius::updatePowerFlow(FroniusSolarConnection *connectio
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcFronius()) << "Meter: Failed to parse JSON data" << data << ":" << error.errorString();
qCWarning(dcFronius()) << "PowerFlow: Failed to parse JSON data" << data << ":" << error.errorString();
return;
}
@ -482,7 +489,7 @@ void IntegrationPluginFronius::updateInverters(FroniusSolarConnection *connectio
connect(realtimeDataReply, &FroniusNetworkReply::finished, this, [=]() {
if (realtimeDataReply->networkReply()->error() != QNetworkReply::NoError) {
// Thing does not seem to be reachable
inverterThing->setStateValue("connected", false);
markInverterAsDisconnected(inverterThing);
return;
}
@ -492,7 +499,7 @@ void IntegrationPluginFronius::updateInverters(FroniusSolarConnection *connectio
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcFronius()) << "Inverter: Failed to parse JSON data" << data << ":" << error.errorString();
inverterThing->setStateValue("connected", false);
markInverterAsDisconnected(inverterThing);
return;
}
@ -546,7 +553,7 @@ void IntegrationPluginFronius::updateMeters(FroniusSolarConnection *connection)
connect(realtimeDataReply, &FroniusNetworkReply::finished, this, [=]() {
if (realtimeDataReply->networkReply()->error() != QNetworkReply::NoError) {
// Thing does not seem to be reachable
meterThing->setStateValue("connected", false);
markMeterAsDisconnected(meterThing);
return;
}
@ -556,7 +563,7 @@ void IntegrationPluginFronius::updateMeters(FroniusSolarConnection *connection)
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcFronius()) << "Meter: Failed to parse JSON data" << data << ":" << error.errorString();
meterThing->setStateValue("connected", false);
markMeterAsDisconnected(meterThing);
return;
}
@ -637,7 +644,7 @@ void IntegrationPluginFronius::updateStorages(FroniusSolarConnection *connection
connect(realtimeDataReply, &FroniusNetworkReply::finished, this, [=]() {
if (realtimeDataReply->networkReply()->error() != QNetworkReply::NoError) {
// Thing does not seem to be reachable
storageThing->setStateValue("connected", false);
markStorageAsDisconnected(storageThing);
return;
}
@ -646,8 +653,8 @@ void IntegrationPluginFronius::updateStorages(FroniusSolarConnection *connection
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcFronius()) << "Meter: Failed to parse JSON data" << data << ":" << error.errorString();
storageThing->setStateValue("connected", false);
qCWarning(dcFronius()) << "Storage: Failed to parse JSON data" << data << ":" << error.errorString();
markStorageAsDisconnected(storageThing);
return;
}
@ -678,3 +685,35 @@ void IntegrationPluginFronius::updateStorages(FroniusSolarConnection *connection
});
}
}
void IntegrationPluginFronius::markInverterAsDisconnected(Thing *thing)
{
thing->setStateValue("connected", false);
thing->setStateValue("currentPower", 0);
// Note: do not reset the energy counters since they are always counting up until reset on the device
}
void IntegrationPluginFronius::markMeterAsDisconnected(Thing *thing)
{
thing->setStateValue("connected", false);
thing->setStateValue("currentPower", 0);
thing->setStateValue("voltagePhaseA", 0);
thing->setStateValue("voltagePhaseB", 0);
thing->setStateValue("voltagePhaseC", 0);
thing->setStateValue("currentPhaseA", 0);
thing->setStateValue("currentPhaseB", 0);
thing->setStateValue("currentPhaseC", 0);
thing->setStateValue("currentPowerPhaseA", 0);
thing->setStateValue("currentPowerPhaseB", 0);
thing->setStateValue("currentPowerPhaseC", 0);
thing->setStateValue("frequency", 0);
// Note: do not reset the energy counters since they are always counting up until reset on the device
}
void IntegrationPluginFronius::markStorageAsDisconnected(Thing *thing)
{
thing->setStateValue("connected", false);
thing->setStateValue("currentPower", 0);
thing->setStateValue("chargingState", "idle");
// Note: do not reset the energy counters since they are always counting up until reset on the device
}

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2022, nymea GmbH
* Copyright 2013 - 2023, nymea GmbH
* Contact: contact@nymea.io
*
* This file is part of nymea.
@ -68,6 +68,9 @@ private:
void updateMeters(FroniusSolarConnection *connection);
void updateStorages(FroniusSolarConnection *connection);
void markInverterAsDisconnected(Thing *thing);
void markMeterAsDisconnected(Thing *thing);
void markStorageAsDisconnected(Thing *thing);
};
#endif // INTEGRATIONPLUGINFRONIUS_H