diff --git a/sma/integrationpluginsma.cpp b/sma/integrationpluginsma.cpp index 15a4e048..64644a63 100644 --- a/sma/integrationpluginsma.cpp +++ b/sma/integrationpluginsma.cpp @@ -180,6 +180,7 @@ void IntegrationPluginSma::onDevicesReceived(int messageId, QList &channels) { + Q_UNUSED(messageId) Thing *thing = m_sunnyWebBoxes.key(static_cast(sender())); if (!thing) return; diff --git a/sma/sunnywebbox.cpp b/sma/sunnywebbox.cpp index 90738b1d..12716fac 100644 --- a/sma/sunnywebbox.cpp +++ b/sma/sunnywebbox.cpp @@ -33,6 +33,7 @@ #include "QJsonDocument" #include "QJsonObject" +#include "QJsonArray" SunnyWebBox::SunnyWebBox(SunnyWebBoxCommunication *communication, const QHostAddress &hostAddress, QObject *parrent) : QObject(parrent), @@ -60,6 +61,25 @@ int SunnyWebBox::getProcessDataChannels(const QString &deviceId) return m_communication->sendMessage(m_hostAddresss, "GetProcessDataChannels", params); } +int SunnyWebBox::setParameters(const QString &deviceKey, const QHash &channels) +{ + QJsonObject paramsObj; + QJsonArray devicesArray; + QJsonObject deviceObj; + deviceObj["key"] = deviceKey; + QJsonArray channelsArray; + Q_FOREACH(QString key, channels.keys()) { + QJsonObject channelObj; + channelObj["meta"] = key; + channelObj["value"] = channels.value(key).toString(); + channelsArray.append(channelObj); + } + deviceObj["channels"] = channelsArray; + devicesArray.append(deviceObj); + paramsObj["devices"] = devicesArray; + return m_communication->sendMessage(m_hostAddresss, "SetParameter", paramsObj); +} + void SunnyWebBox::onMessageReceived(const QHostAddress &address, int messageId, const QString &messageType, const QVariantMap &result) { if (address != m_hostAddresss) { @@ -106,16 +126,52 @@ void SunnyWebBox::onMessageReceived(const QHostAddress &address, int messageId, } if (!devices.isEmpty()) emit devicesReceived(messageId, devices); - } else if (messageType == "GetProcessDataChannels") { + } else if (messageType == "GetProcessDataChannels" || + messageType == "GetProDataChannels") { + Q_FOREACH(QString deviceKey, result.keys()) { + QStringList processDataChannels = result.value(deviceKey).toStringList(); + if (!processDataChannels.isEmpty()) + emit processDataChannelsReceived(messageId, deviceKey, processDataChannels); + } } else if (messageType == "GetProcessData") { + QList devices; + QVariantList devicesList = result.value("devices").toList(); + Q_FOREACH(QVariant value, devicesList) { + + QString key = value.toMap().value("key").toString(); + QVariantList channelsList = value.toMap().value("channels").toList(); + QHash channels; + Q_FOREACH(QVariant channel, channelsList) { + channels.insert(channel.toMap().value("meta").toString(), channel.toMap().value("value")); + } + emit processDataReceived(messageId, key, channels); + } } else if (messageType == "GetParameterChannels") { Q_FOREACH(QString deviceKey, result.keys()) { QStringList parameterChannels = result.value(deviceKey).toStringList(); if (!parameterChannels.isEmpty()) emit parameterChannelsReceived(messageId, deviceKey, parameterChannels); } - } else if (messageType == "GetParameter") { - } else if (messageType == "SetParameter") { + } else if (messageType == "GetParameter"|| messageType == "SetParameter") { + QList devices; + QVariantList devicesList = result.value("devices").toList(); + Q_FOREACH(QVariant value, devicesList) { + + QString key = value.toMap().value("key").toString(); + QVariantList channelsList = value.toMap().value("channels").toList(); + QList parameters; + Q_FOREACH(QVariant channel, channelsList) { + Parameter parameter; + parameter.meta = channel.toMap().value("meta").toString(); + parameter.name = channel.toMap().value("name").toString(); + parameter.unit = channel.toMap().value("unit").toString(); + parameter.min = channel.toMap().value("min").toDouble(); + parameter.max = channel.toMap().value("max").toDouble(); + parameter.value = channel.toMap().value("value").toDouble(); + parameters.append(parameter); + } + emit parametersReceived(messageId, key, parameters); + } } else { qCWarning(dcSma()) << "Unknown message type" << messageType; } diff --git a/sma/sunnywebbox.h b/sma/sunnywebbox.h index 3b4cf367..9b6b2fe5 100644 --- a/sma/sunnywebbox.h +++ b/sma/sunnywebbox.h @@ -64,14 +64,24 @@ public: QString unit; }; + struct Parameter { + QString meta; + QString name; + QString unit; + double min; + double max; + double value; + }; + explicit SunnyWebBox(SunnyWebBoxCommunication *communication, const QHostAddress &hostAddress, QObject *parrent = 0); - int getPlantOverview(); - int getDevices(); - int getProcessDataChannels(const QString &deviceKey); - int getProcessData(const QStringList &deviceKeys); - int getParameterChannels(const QString &deviceKey); - int getParameters(const QStringList &deviceKeys); + int getPlantOverview(); // Returns an object with the following plant data: PAC, E-TODAY, E-TOTAL, MODE, ERROR + int getDevices(); //Returns a hierarchical list of all detected plant devices. + int getProcessDataChannels(const QString &deviceKey); //Returns a list with the meta names of the available process data channels for a particular device type. + int getProcessData(const QStringList &deviceKeys); //Returns process data for up to 5 devices per request. + int getParameterChannels(const QString &deviceKey); //Returns a list with the meta names of the available parameter channels for a particular device type + int getParameters(const QStringList &deviceKeys); //Returns the parameter values of up to 5 devices + int setParameters(const QString &deviceKeys, const QHash &channels); //Sets parameter values void setHostAddress(); QHostAddress hostAddress(); @@ -90,8 +100,10 @@ signals: void plantOverviewReceived(int messageId, Overview overview); void devicesReceived(int messageId, QList devices); + void processDataChannelsReceived(int messageId, const QString &deviceKey, QStringList processDataChanels); void processDataReceived(int messageId, const QString &deviceKey, const QHash &channels); void parameterChannelsReceived(int messageId, const QString &deviceKey, QStringList parameterChannels); + void parametersReceived(int messageId, const QString &deviceKey, const QList ¶meters); }; #endif // SUNNYWEBBOX_H