reduced feature set

This commit is contained in:
Boernsman 2021-02-28 21:47:57 +01:00 committed by Simon Stürz
parent 1c7ed8a09b
commit ab26a22d00
4 changed files with 9 additions and 226 deletions

View File

@ -104,30 +104,8 @@ void IntegrationPluginSma::setupThing(ThingSetupInfo *info)
info->finish(Thing::ThingErrorNoError);
connect(sunnyWebBox, &SunnyWebBox::connectedChanged, this, &IntegrationPluginSma::onConnectedChanged);
connect(sunnyWebBox, &SunnyWebBox::plantOverviewReceived, this, &IntegrationPluginSma::onPlantOverviewReceived);
connect(sunnyWebBox, &SunnyWebBox::devicesReceived, this, &IntegrationPluginSma::onDevicesReceived);
connect(sunnyWebBox, &SunnyWebBox::processDataReceived, this, &IntegrationPluginSma::onProcessDataReceived);
connect(sunnyWebBox, &SunnyWebBox::parameterChannelsReceived, this, &IntegrationPluginSma::onParameterChannelsReceived);
connect(sunnyWebBox, &SunnyWebBox::parametersReceived, this, &IntegrationPluginSma::onParametersReceived);
m_sunnyWebBoxes.insert(info->thing(), sunnyWebBox);
});
} else if (thing->thingClassId() == inverterThingClassId) {
Thing *parentThing = myThings().findById(thing->parentId());
if (!parentThing) {
qCWarning(dcSma()) << "Could not find parentThing for thing " << thing->name();
return info->finish(Thing::ThingErrorHardwareNotAvailable, "Please try again");
}
if (parentThing->setupComplete()) {
info->finish(Thing::ThingErrorNoError);
} else {
//wait for the parent to finish the setup process
connect(parentThing, &Thing::setupStatusChanged, info, [info, parentThing] {
if (parentThing->setupComplete())
info->finish(Thing::ThingErrorNoError);
});
return;
}
} else {
Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
}
@ -142,37 +120,6 @@ void IntegrationPluginSma::postSetupThing(Thing *thing)
return;
sunnyWebBox->getDevices();
thing->setStateValue(sunnyWebBoxConnectedStateTypeId, true);
} else if (thing->thingClassId() == inverterThingClassId) {
SunnyWebBox *sunnyWebBox = m_sunnyWebBoxes.value(myThings().findById(thing->parentId()));
if (!sunnyWebBox)
return;
QString key = thing->paramValue(inverterThingIdParamTypeId).toString();
sunnyWebBox->getParameters(QStringList() << key);
sunnyWebBox->getProcessData(QStringList() << key);
}
}
void IntegrationPluginSma::executeAction(ThingActionInfo *info)
{
Thing *thing = info->thing();
Action action = info->action();
if (thing->thingClassId() == sunnyWebBoxThingClassId) {
SunnyWebBox *sunnyWebBox = m_sunnyWebBoxes.value(thing);
if (!sunnyWebBox)
return;
if (action.actionTypeId() == sunnyWebBoxSearchDevicesActionTypeId) {
QString requestId = sunnyWebBox->getDevices();
if (requestId.isEmpty()) {
return info->finish(Thing::ThingErrorHardwareNotAvailable);
}
m_asyncActions.insert(requestId, info);
connect(info, &ThingActionInfo::aborted, info, [requestId, this] {m_asyncActions.remove(requestId);});
} else {
Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8());
}
} else {
Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
}
}
@ -194,11 +141,6 @@ void IntegrationPluginSma::onRefreshTimer()
Q_FOREACH(Thing *thing, myThings().filterByThingClassId(sunnyWebBoxThingClassId)) {
SunnyWebBox *sunnyWebBox = m_sunnyWebBoxes.value(thing);
sunnyWebBox->getPlantOverview();
Q_FOREACH(Thing *child, myThings().filterByParentId(thing->id())) {
QString key = child->paramValue(inverterThingIdParamTypeId).toString();
sunnyWebBox->getProcessData(QStringList() << key);
}
}
}
@ -208,21 +150,13 @@ void IntegrationPluginSma::onConnectedChanged(bool connected)
if (!thing)
return;
thing->setStateValue(sunnyWebBoxConnectedStateTypeId, connected);
if (!connected) {
Q_FOREACH(Thing *child, myThings().filterByParentId(thing->id())) {
child->setStateValue(inverterConnectedStateTypeId, false);
}
}
}
void IntegrationPluginSma::onPlantOverviewReceived(const QString &messageId, SunnyWebBox::Overview overview)
{
qCDebug(dcSma()) << "Plant overview received" << overview.status;
if (m_asyncSetup.contains(messageId)) {
ThingSetupInfo *info = m_asyncSetup.value(messageId);
info->finish(Thing::ThingErrorNoError);
}
Q_UNUSED(messageId)
qCDebug(dcSma()) << "Plant overview received" << overview.status;
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
if (!thing)
return;
@ -236,72 +170,3 @@ void IntegrationPluginSma::onPlantOverviewReceived(const QString &messageId, Sun
thing->setStateValue(sunnyWebBoxErrorStateTypeId, overview.error);
}
}
void IntegrationPluginSma::onDevicesReceived(const QString &messageId, QList<SunnyWebBox::Device> devices)
{
qCDebug(dcSma()) << "Devices received, count:" << devices.count();
if (m_asyncActions.contains(messageId)) {
ThingActionInfo *info = m_asyncActions.value(messageId);
info->finish(Thing::ThingErrorNoError);
}
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
if (!thing)
return;
ThingDescriptors descriptors;
Q_FOREACH(SunnyWebBox::Device device, devices){
qCDebug(dcSma()) << " - Device received" << device.name << device.key;
if (myThings().findByParams(ParamList() << Param(inverterThingIdParamTypeId, device.key)))
continue;
ThingDescriptor descriptor(inverterThingClassId, device.name, device.key ,thing->id());
ParamList params;
params << Param(inverterThingIdParamTypeId, device.key);
descriptor.setParams(params);
descriptors.append(descriptor);
}
emit autoThingsAppeared(descriptors);
}
void IntegrationPluginSma::onParametersReceived(const QString &messageId, const QString &deviceKey, const QList<SunnyWebBox::Parameter> &parameters)
{
Q_UNUSED(messageId);
Thing *thing = myThings().findByParams(ParamList() << Param(inverterThingIdParamTypeId, deviceKey));
if (!thing)
return;
qCDebug(dcSma()) << "Parameters received";
Q_FOREACH(SunnyWebBox::Parameter parameter, parameters) {
qCDebug(dcSma()) << " - " << parameter.name << parameter.value << parameter.unit;
}
}
void IntegrationPluginSma::onProcessDataReceived(const QString &messageId, const QString &deviceKey, const QHash<QString, QVariant> &channels)
{
Q_UNUSED(messageId)
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
if (!thing)
return;
qCDebug(dcSma()) << "Process data received" << deviceKey;
Q_FOREACH(Thing *childThing, myThings().filterByParentId(thing->id())) {
if (childThing->paramValue(inverterThingIdParamTypeId).toString() == deviceKey) {
Q_FOREACH(QString channel, channels.keys()) {
qCDebug(dcSma()) << " - Channel received" << channel << channels.value(channel);
//TODO parse data
}
break;
}
}
}
void IntegrationPluginSma::onParameterChannelsReceived(const QString &messageId, const QString &deviceKey, QStringList parameterChannels)
{
Q_UNUSED(messageId)
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
if (!thing)
return;
qCDebug(dcSma()) << "Parameter channels received" << deviceKey << parameterChannels;
}

View File

@ -34,13 +34,9 @@
#include "integrations/integrationplugin.h"
#include "plugintimer.h"
#include "sunnywebbox.h"
#include "sunnywebboxcommunication.h"
#include "discovery.h"
#include <QDebug>
#include <QHostAddress>
#include <QUdpSocket>
class IntegrationPluginSma: public IntegrationPlugin {
Q_OBJECT
@ -53,7 +49,6 @@ public:
void discoverThings(ThingDiscoveryInfo *info) override;
void setupThing(ThingSetupInfo *info) override;
void postSetupThing(Thing *thing) override;
void executeAction(ThingActionInfo *info) override;
void thingRemoved(Thing *thing) override;
private slots:
@ -61,17 +56,10 @@ private slots:
void onConnectedChanged(bool connected);
void onPlantOverviewReceived(const QString &messageId, SunnyWebBox::Overview overview);
void onDevicesReceived(const QString &messageId, QList<SunnyWebBox::Device> devices);
void onParametersReceived(const QString &messageId, const QString &deviceKey, const QList<SunnyWebBox::Parameter> &parameters);
void onProcessDataReceived(const QString &messageId, const QString &deviceKey, const QHash<QString, QVariant> &channels);
void onParameterChannelsReceived(const QString &messageId, const QString &deviceKey, QStringList parameterChannels);
private:
PluginTimer *m_refreshTimer = nullptr;
QHash<Thing *, SunnyWebBox *> m_sunnyWebBoxes;
QHash<QString, ThingSetupInfo *> m_asyncSetup;
QHash<QString, ThingActionInfo *> m_asyncActions;
SunnyWebBoxCommunication *m_sunnyWebBoxCommunication = nullptr;
};
#endif // INTEGRATIONPLUGINSMA_H

View File

@ -13,7 +13,7 @@
"name": "sunnyWebBox",
"displayName": "Sunny WebBox",
"createMethods": ["user", "discovery"],
"interfaces": ["extendedsmartmeterproducer", "gateway"],
"interfaces": ["extendedsmartmeterproducer"],
"paramTypes": [
{
"id": "864d4162-e3ce-48b8-b8ac-c1b971b52d42",
@ -84,76 +84,6 @@
"type": "QString",
"defaultValue": "None"
}
],
"actionTypes": [
{
"id": "15fc3dac-1868-4490-ba41-7c2f545926ad",
"name": "searchDevices",
"displayName": "Search new devices"
}
]
},
{
"id": "9cb72321-042e-4912-b23e-18516b6bbe96",
"name": "inverter",
"displayName": "Solar Inverter",
"createMethods": ["auto"],
"interfaces" : ["extendedsmartmeterproducer", "connectable"],
"paramTypes": [
{
"id": "f43e8159-7337-4bd0-ba74-b6630e554e43",
"name": "id",
"displayName": "Device ID",
"type": "QString",
"readOnly": true
}
],
"stateTypes": [
{
"id": "eda29c50-73ac-40e0-9c92-26fee352e688",
"name": "connected",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false,
"cached": false
},
{
"id": "a804eabf-d5b8-4c83-84e4-8ec994875950",
"name": "currentPower",
"displayName": "Current power",
"displayNameEvent": "Current Power changed",
"type": "double",
"unit": "Watt",
"defaultValue": "0"
},
{
"id": "cd3a0abc-37cc-4f9c-8ff2-c7ccc2513880",
"name": "eday",
"displayName": "Energy of current day",
"displayNameEvent": "Energy of day changed",
"type": "double",
"unit": "KiloWattHour",
"defaultValue": "0"
},
{
"id": "341596ec-690b-4bf6-b6ed-0f92fa1c7d6c",
"name": "eyear",
"displayName": "Energy of current year",
"displayNameEvent": "Energy of year changed",
"type": "int",
"unit": "KiloWattHour",
"defaultValue": "0"
},
{
"id": "6b6c1ddb-692f-400f-8b8d-38e0e0ae34ba",
"name": "totalEnergyProduced",
"displayName": "Energy total",
"displayNameEvent": "Energy total changed",
"type": "double",
"unit": "KiloWattHour",
"defaultValue": "0"
}
]
}
]

View File

@ -32,7 +32,7 @@
#define SUNNYWEBBOX_H
#include "integrations/thing.h"
#include "sunnywebboxcommunication.h"
#include "network/networkaccessmanager.h"
#include <QObject>
#include <QHostAddress>
@ -77,11 +77,11 @@ public:
~SunnyWebBox();
QString getPlantOverview(); // Returns an object with the following plant data: PAC, E-TODAY, E-TOTAL, MODE, ERROR
QString getDevices(); //Returns a hierarchical list of all detected plant devices.
QString getDevices(); // Returns a hierarchical list of all detected plant devices.
QString getProcessDataChannels(const QString &deviceKey); //Returns a list with the meta names of the available process data channels for a particular device type.
QString getProcessData(const QStringList &deviceKeys); //Returns process data for up to 5 devices per request.
QString getParameterChannels(const QString &deviceKey); //Returns a list with the meta names of the available parameter channels for a particular device type
QString getParameters(const QStringList &deviceKeys); //Returns the parameter values of up to 5 devices
QString getProcessData(const QStringList &deviceKeys); //Returns process data for up to 5 devices per request.
QString getParameterChannels(const QString &deviceKey); //Returns a list with the meta names of the available parameter channels for a particular device type
QString getParameters(const QStringList &deviceKeys); //Returns the parameter values of up to 5 devices
QString setParameters(const QString &deviceKeys, const QHash<QString, QVariant> &channels); //Sets parameter values
void setHostAddress(const QHostAddress &address);
@ -95,8 +95,8 @@ private:
QString sendMessage(const QHostAddress &address, const QString &procedure);
QString sendMessage(const QHostAddress &address, const QString &procedure, const QJsonObject &params);
void parseMessage(const QString &messageId, const QString &messageType, const QVariantMap &result);
void setConnectionStatus(bool connected);
signals:
void connectedChanged(bool connected);