added sunny webbox
This commit is contained in:
parent
2dc3d62623
commit
f8df49845b
@ -0,0 +1,114 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* Copyright 2013 - 2020, nymea GmbH
|
||||||
|
* Contact: contact@nymea.io
|
||||||
|
*
|
||||||
|
* This file is part of nymea.
|
||||||
|
* This project including source code and documentation is protected by
|
||||||
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
||||||
|
* reproduction, publication, editing and translation, are reserved. The use of
|
||||||
|
* this project is subject to the terms of a license agreement to be concluded
|
||||||
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
||||||
|
* under https://nymea.io/license
|
||||||
|
*
|
||||||
|
* GNU Lesser General Public License Usage
|
||||||
|
* Alternatively, this project may be redistributed and/or modified under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
* Software Foundation; version 3. This project is distributed in the hope that
|
||||||
|
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this project. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* For any further details and any questions please contact us under
|
||||||
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
||||||
|
* https://nymea.io/license/faq
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#include "integrationpluginsma.h"
|
||||||
|
#include "plugininfo.h"
|
||||||
|
|
||||||
|
IntegrationPluginSma::IntegrationPluginSma()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginSma::setupThing(ThingSetupInfo *info)
|
||||||
|
{
|
||||||
|
Thing *thing = info->thing();
|
||||||
|
|
||||||
|
if (!m_udpSocket) {
|
||||||
|
m_udpSocket = new QUdpSocket(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->thingClassId() == sunnyWebBoxThingClassId) {
|
||||||
|
//check if a Sunny WebBox is already added with this IPv4Address
|
||||||
|
foreach(SunnyWebBox *sunnyWebBox, m_sunnyWebBoxes.values()) {
|
||||||
|
if(sunnyWebBox->hostAddress().toString() == thing->paramValue(sunnyWebBoxThingHostParamTypeId).toString()){
|
||||||
|
//this logger at this IPv4 address is already added
|
||||||
|
qCWarning(dcSma()) << "thing at " << thing->paramValue(sunnyWebBoxThingHostParamTypeId).toString() << " already added!";
|
||||||
|
info->finish(Thing::ThingErrorThingInUse);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} 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()) {
|
||||||
|
//wait for the parent to finish the setup process
|
||||||
|
connect(parentThing, &Thing::setupStatusChanged, info, [this, info, parentThing] {
|
||||||
|
|
||||||
|
if (parentThing->setupComplete())
|
||||||
|
setupChild(info, parentThing);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setupChild(info, parentThing);
|
||||||
|
} else {
|
||||||
|
Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginSma::postSetupThing(Thing *thing)
|
||||||
|
{
|
||||||
|
if (thing->thingClassId() == sunnyWebBoxThingClassId) {
|
||||||
|
SunnyWebBox *sunnyWebBox = m_sunnyWebBoxes.value(thing);
|
||||||
|
if (!sunnyWebBox)
|
||||||
|
return;
|
||||||
|
sunnyWebBox->getDevices();
|
||||||
|
} else if (thing->thingClassId() == inverterThingClassId) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginSma::thingRemoved(Thing *thing)
|
||||||
|
{
|
||||||
|
if (thing->thingClassId() == sunnyWebBoxThingClassId) {
|
||||||
|
m_sunnyWebBoxes.take(thing)->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myThings().filterByThingClassId(sunnyWebBoxThingClassId).isEmpty()) {
|
||||||
|
m_udpSocket->deleteLater();
|
||||||
|
m_udpSocket = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SunnyWebBox * IntegrationPluginSma::createSunnyWebBoxConnection(Thing *thing)
|
||||||
|
{
|
||||||
|
SunnyWebBox *sunnyWebBox = new SunnyWebBox(m_udpSocket, this);
|
||||||
|
m_sunnyWebBoxes.insert(thing, sunnyWebBox);
|
||||||
|
//connect();
|
||||||
|
return sunnyWebBox;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginSma::setupChild(ThingSetupInfo *info, Thing *parentThing)
|
||||||
|
{
|
||||||
|
Q_UNUSED(info)
|
||||||
|
Q_UNUSED(parentThing)
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* Copyright 2013 - 2020, nymea GmbH
|
||||||
|
* Contact: contact@nymea.io
|
||||||
|
*
|
||||||
|
* This file is part of nymea.
|
||||||
|
* This project including source code and documentation is protected by
|
||||||
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
||||||
|
* reproduction, publication, editing and translation, are reserved. The use of
|
||||||
|
* this project is subject to the terms of a license agreement to be concluded
|
||||||
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
||||||
|
* under https://nymea.io/license
|
||||||
|
*
|
||||||
|
* GNU Lesser General Public License Usage
|
||||||
|
* Alternatively, this project may be redistributed and/or modified under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
* Software Foundation; version 3. This project is distributed in the hope that
|
||||||
|
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this project. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* For any further details and any questions please contact us under
|
||||||
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
||||||
|
* https://nymea.io/license/faq
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#ifndef INTEGRATIONPLUGINSMA_H
|
||||||
|
#define INTEGRATIONPLUGINSMA_H
|
||||||
|
|
||||||
|
#include "integrations/integrationplugin.h"
|
||||||
|
#include "plugintimer.h"
|
||||||
|
#include "sunnywebbox.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QUdpSocket>
|
||||||
|
|
||||||
|
|
||||||
|
class IntegrationPluginSma: public IntegrationPlugin {
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationpluginsma.json")
|
||||||
|
Q_INTERFACES(IntegrationPlugin)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit IntegrationPluginSma();
|
||||||
|
|
||||||
|
void setupThing(ThingSetupInfo *info) override;
|
||||||
|
void postSetupThing(Thing *thing) override;
|
||||||
|
void thingRemoved(Thing *thing) override;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onRefreshTimer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
PluginTimer *m_refreshTimer = nullptr;
|
||||||
|
QHash<Thing *, SunnyWebBox *> m_sunnyWebBoxes;
|
||||||
|
QHash<Thing *, ThingSetupInfo *> m_asyncSetup;
|
||||||
|
QUdpSocket *m_udpSocket = nullptr;
|
||||||
|
|
||||||
|
SunnyWebBox * createSunnyWebBoxConnection(Thing *thing);
|
||||||
|
void setupChild(ThingSetupInfo *info, Thing *parentThing);
|
||||||
|
void getData(Thing *thing);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INTEGRATIONPLUGINSMA_H
|
||||||
@ -0,0 +1,164 @@
|
|||||||
|
{
|
||||||
|
"id": "b8442bbf-9d3f-4aa2-9443-b3a31ae09bac",
|
||||||
|
"name": "sma",
|
||||||
|
"displayName": "SMA",
|
||||||
|
"vendors": [
|
||||||
|
{
|
||||||
|
"id": "16d5a4a3-36d5-46c0-b7dd-df166ddf5981",
|
||||||
|
"name": "Sma",
|
||||||
|
"displayName": "SMA",
|
||||||
|
"thingClasses": [
|
||||||
|
{
|
||||||
|
"id": "49304127-ce9b-45dd-8511-05030a4ac003",
|
||||||
|
"name": "sunnyWebBox",
|
||||||
|
"displayName": "Sunny WebBox",
|
||||||
|
"createMethods": ["user", "discovery"],
|
||||||
|
"interfaces": ["gateway"],
|
||||||
|
"paramTypes": [
|
||||||
|
{
|
||||||
|
"id": "864d4162-e3ce-48b8-b8ac-c1b971b52d42",
|
||||||
|
"name": "host",
|
||||||
|
"displayName": "Host address",
|
||||||
|
"type": "QString",
|
||||||
|
"inputType": "IPv4Address",
|
||||||
|
"defaultValue": "192.168.0.168"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a6df3d28-1b02-42dd-8301-81754c47e55f",
|
||||||
|
"name": "id",
|
||||||
|
"displayName": "Device ID",
|
||||||
|
"type": "QString",
|
||||||
|
"defaultValue": "-",
|
||||||
|
"readOnly": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateTypes": [
|
||||||
|
{
|
||||||
|
"id": "c05e6a1a-252c-4f2b-8b31-09cf113d01c1",
|
||||||
|
"name": "connected",
|
||||||
|
"displayName": "Connected",
|
||||||
|
"displayNameEvent": "Connected changed",
|
||||||
|
"type": "bool",
|
||||||
|
"defaultValue": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ff4ff872-2f0f-4ca4-9fe2-220eeaf16cc2",
|
||||||
|
"name": "currentPower",
|
||||||
|
"displayName": "Current power",
|
||||||
|
"displayNameEvent": "Current power changed",
|
||||||
|
"type": "double",
|
||||||
|
"unit": "Watt",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "16f34c5c-8dbb-4dcc-9faa-4b782d57226c",
|
||||||
|
"name": "dayEnergy",
|
||||||
|
"displayName": "Day energy",
|
||||||
|
"displayNameEvent": "Day energy changed",
|
||||||
|
"type": "double",
|
||||||
|
"unit": "KiloWattHour",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0bb4e227-7e38-49ca-9b32-ce4621c9305b",
|
||||||
|
"name": "totalEnergy",
|
||||||
|
"displayName": "Total energy",
|
||||||
|
"displayNameEvent": "Total energy changed",
|
||||||
|
"type": "double",
|
||||||
|
"unit": "KiloWattHour",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1974550b-6059-4b0e-83f4-70177e20dac3",
|
||||||
|
"name": "mode",
|
||||||
|
"displayName": "Mode",
|
||||||
|
"displayNameEvent": "Mode changed",
|
||||||
|
"type": "QString",
|
||||||
|
"defaultValue": "MPP"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4e64f9ca-7e5a-4897-8035-6f2ae88fde89",
|
||||||
|
"name": "error",
|
||||||
|
"displayName": "Error",
|
||||||
|
"displayNameEvent": "Error changed",
|
||||||
|
"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",
|
||||||
|
"inputType": "TextLine",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
12
sma/sma.pro
12
sma/sma.pro
@ -0,0 +1,12 @@
|
|||||||
|
include(../plugins.pri)
|
||||||
|
|
||||||
|
QT += \
|
||||||
|
network \
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
integrationpluginsma.cpp \
|
||||||
|
sunnywebbox.cpp \
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
integrationpluginsma.h \
|
||||||
|
sunnywebbox.h \
|
||||||
177
sma/sunnywebbox.cpp
Normal file
177
sma/sunnywebbox.cpp
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* Copyright 2013 - 2020, nymea GmbH
|
||||||
|
* Contact: contact@nymea.io
|
||||||
|
*
|
||||||
|
* This file is part of nymea.
|
||||||
|
* This project including source code and documentation is protected by
|
||||||
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
||||||
|
* reproduction, publication, editing and translation, are reserved. The use of
|
||||||
|
* this project is subject to the terms of a license agreement to be concluded
|
||||||
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
||||||
|
* under https://nymea.io/license
|
||||||
|
*
|
||||||
|
* GNU Lesser General Public License Usage
|
||||||
|
* Alternatively, this project may be redistributed and/or modified under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
* Software Foundation; version 3. This project is distributed in the hope that
|
||||||
|
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this project. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* For any further details and any questions please contact us under
|
||||||
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
||||||
|
* https://nymea.io/license/faq
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#include "sunnywebbox.h"
|
||||||
|
#include "extern-plugininfo.h"
|
||||||
|
|
||||||
|
#include "QJsonDocument"
|
||||||
|
#include "QJsonObject"
|
||||||
|
|
||||||
|
SunnyWebBox::SunnyWebBox(QUdpSocket *udpSocket, QObject *parrent) :
|
||||||
|
QObject(parrent),
|
||||||
|
m_udpSocket(udpSocket)
|
||||||
|
{
|
||||||
|
connect(m_udpSocket, &QUdpSocket::stateChanged, this, [this](QAbstractSocket::SocketState state) {
|
||||||
|
emit connectedChanged((state == QAbstractSocket::SocketState::ConnectedState));
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(m_udpSocket, &QUdpSocket::readyRead, this, [this] {
|
||||||
|
//m_udpSocket->readDatagram(QByteArray())
|
||||||
|
qCDebug(dcSma()) << "Received datagram" << m_udpSocket->readAll();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
int SunnyWebBox::getPlantOverview()
|
||||||
|
{
|
||||||
|
return sendMessage("GetPlantOverview");
|
||||||
|
}
|
||||||
|
|
||||||
|
int SunnyWebBox::getDevices()
|
||||||
|
{
|
||||||
|
return sendMessage("GetDevices");
|
||||||
|
}
|
||||||
|
|
||||||
|
int SunnyWebBox::getProcessDataChannels(const QString &deviceId)
|
||||||
|
{
|
||||||
|
QJsonObject params;
|
||||||
|
params["device"] = deviceId;
|
||||||
|
return sendMessage("GetProcessDataChannels", params);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SunnyWebBox::sendMessage(const QString &procedure)
|
||||||
|
{
|
||||||
|
int requestId = qrand();
|
||||||
|
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["version"] = "1.0";
|
||||||
|
obj["proc"] = procedure;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["format"] = "JSON";
|
||||||
|
m_udpSocket->writeDatagram(doc.toJson(), m_hostAddresss, m_port);
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SunnyWebBox::sendMessage(const QString &procedure, const QJsonObject ¶ms)
|
||||||
|
{
|
||||||
|
int requestId = qrand();
|
||||||
|
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["version"] = "1.0";
|
||||||
|
obj["proc"] = procedure;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["format"] = "JSON";
|
||||||
|
if (!params.isEmpty()) {
|
||||||
|
obj.insert("params", params);
|
||||||
|
}
|
||||||
|
m_udpSocket->writeDatagram(doc.toJson(), m_hostAddresss, m_port);
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SunnyWebBox::onDatagramReceived(const QByteArray &data)
|
||||||
|
{
|
||||||
|
QJsonParseError error;
|
||||||
|
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
|
||||||
|
if (error.error != QJsonParseError::NoError) {
|
||||||
|
qCWarning(dcSma()) << "Could not parse JSON" << error.errorString();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!doc.isObject()) {
|
||||||
|
qCWarning(dcSma()) << "JSON is not an Object";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QVariantMap map = doc.toVariant().toMap();
|
||||||
|
if (map["version"] != "1.0") {
|
||||||
|
qCWarning(dcSma()) << "API version not supported" << map["version"];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map.contains("proc") && map.contains("result")) {
|
||||||
|
QString requestType = map["proc"].toString();
|
||||||
|
int requestId = map["id"].toInt();
|
||||||
|
QVariantMap result = map.value("result").toMap();
|
||||||
|
emit messageResponseReceived(requestId, requestType, result);
|
||||||
|
} else {
|
||||||
|
qCWarning(dcSma()) << "Missing proc or result value";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SunnyWebBox::parseMessageReponse(int messageId, const QString &messageType, const QVariantMap &result)
|
||||||
|
{
|
||||||
|
if (messageType == "GetPlantOverview") {
|
||||||
|
Overview overview;
|
||||||
|
QVariantList overviewList = result.value("overview").toList();
|
||||||
|
Q_FOREACH(QVariant value, overviewList) {
|
||||||
|
QVariantMap map = value.toMap();
|
||||||
|
if (map["meta"].toString() == "GriPwr") {
|
||||||
|
overview.power = map["value"].toInt();
|
||||||
|
} else if (map["meta"].toString() == "GriEgyTdy") {
|
||||||
|
overview.dailyYield = map["value"].toInt();
|
||||||
|
} else if (map["meta"].toString() == "GriEgyTot") {
|
||||||
|
overview.totalYield = map["value"].toInt();
|
||||||
|
} else if (map["meta"].toString() == "OpStt") {
|
||||||
|
overview.status = map["value"].toString();
|
||||||
|
} else if (map["meta"].toString() == "Msg") {
|
||||||
|
overview.error = map["value"].toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit plantOverviewReceived(messageId, overview);
|
||||||
|
|
||||||
|
} else if (messageType == "GetDevices") {
|
||||||
|
QList<Device> devices;
|
||||||
|
QVariantList deviceList = result.value("devices").toList();
|
||||||
|
Q_FOREACH(QVariant value, deviceList) {
|
||||||
|
Device device;
|
||||||
|
QVariantMap map = value.toMap();
|
||||||
|
device.name = map["name"].toString();
|
||||||
|
device.key = map["key"].toString();
|
||||||
|
|
||||||
|
QVariantList childrenList = map["children"].toList();
|
||||||
|
Q_FOREACH(QVariant childValue, childrenList) {
|
||||||
|
Device child;
|
||||||
|
QVariantMap childMap = childValue.toMap();
|
||||||
|
device.name = childMap["name"].toString();
|
||||||
|
device.key = childMap["key"].toString();
|
||||||
|
device.childrens.append(child);
|
||||||
|
}
|
||||||
|
devices.append(device);
|
||||||
|
}
|
||||||
|
if (!devices.isEmpty())
|
||||||
|
emit devicesReceived(messageId, devices);
|
||||||
|
} else if (messageType == "GetProcessDataChannels") {
|
||||||
|
} else if (messageType == "GetProcessData") {
|
||||||
|
} else if (messageType == "GetParameterChannels") {
|
||||||
|
} else if (messageType == "GetParameter") {
|
||||||
|
} else if (messageType == "SetParameter") {
|
||||||
|
} else {
|
||||||
|
qCWarning(dcSma()) << "Unknown message type" << messageType;
|
||||||
|
}
|
||||||
|
}
|
||||||
90
sma/sunnywebbox.h
Normal file
90
sma/sunnywebbox.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*
|
||||||
|
* Copyright 2013 - 2020, nymea GmbH
|
||||||
|
* Contact: contact@nymea.io
|
||||||
|
*
|
||||||
|
* This file is part of nymea.
|
||||||
|
* This project including source code and documentation is protected by
|
||||||
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
||||||
|
* reproduction, publication, editing and translation, are reserved. The use of
|
||||||
|
* this project is subject to the terms of a license agreement to be concluded
|
||||||
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
||||||
|
* under https://nymea.io/license
|
||||||
|
*
|
||||||
|
* GNU Lesser General Public License Usage
|
||||||
|
* Alternatively, this project may be redistributed and/or modified under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
* Software Foundation; version 3. This project is distributed in the hope that
|
||||||
|
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this project. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* For any further details and any questions please contact us under
|
||||||
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
||||||
|
* https://nymea.io/license/faq
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#ifndef SUNNYWEBBOX_H
|
||||||
|
#define SUNNYWEBBOX_H
|
||||||
|
|
||||||
|
#include "integrations/thing.h"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QUdpSocket>
|
||||||
|
|
||||||
|
class SunnyWebBox : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct Overview {
|
||||||
|
int power;
|
||||||
|
double dailyYield;
|
||||||
|
int totalYield;
|
||||||
|
QString status;
|
||||||
|
QString error;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Device {
|
||||||
|
QString key;
|
||||||
|
QString name;
|
||||||
|
QList<Device> childrens;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit SunnyWebBox(QUdpSocket *udpSocket, 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);
|
||||||
|
|
||||||
|
void setHostAddress();
|
||||||
|
QHostAddress hostAddress();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_port = 34268;
|
||||||
|
QHostAddress m_hostAddresss;
|
||||||
|
QUdpSocket *m_udpSocket = nullptr;
|
||||||
|
|
||||||
|
int sendMessage(const QString &procedure);
|
||||||
|
int sendMessage(const QString &procedure, const QJsonObject ¶ms);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onDatagramReceived(const QByteArray &data);
|
||||||
|
void parseMessageReponse(int messageId, const QString &messageType, const QVariantMap &result);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void connectedChanged(bool connected);
|
||||||
|
void messageResponseReceived(int messageId, const QString &messageType, const QVariantMap &result);
|
||||||
|
void plantOverviewReceived(int messageId, Overview overview);
|
||||||
|
void devicesReceived(int messageId, QList<Device> devices);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SUNNYWEBBOX_H
|
||||||
Loading…
x
Reference in New Issue
Block a user