added async setup
This commit is contained in:
parent
74f9f28895
commit
9e3cf02e3c
@ -48,7 +48,7 @@ void IntegrationPluginSma::discoverThings(ThingDiscoveryInfo *info)
|
|||||||
connect(discovery, &Discovery::finished, info, [this, info](const QList<Host> &hosts) {
|
connect(discovery, &Discovery::finished, info, [this, info](const QList<Host> &hosts) {
|
||||||
qCDebug(dcSma()) << "Discovery finished. Found" << hosts.count() << "devices";
|
qCDebug(dcSma()) << "Discovery finished. Found" << hosts.count() << "devices";
|
||||||
foreach (const Host &host, hosts) {
|
foreach (const Host &host, hosts) {
|
||||||
if (host.hostName().contains("SMA Regelsysteme Gmbh")){
|
if (host.hostName().contains("SMA")){
|
||||||
ThingDescriptor descriptor(info->thingClassId(), host.hostName(), host.address() + " (" + host.macAddress() + ")");
|
ThingDescriptor descriptor(info->thingClassId(), host.hostName(), host.address() + " (" + host.macAddress() + ")");
|
||||||
|
|
||||||
foreach (Thing *existingThing, myThings()) {
|
foreach (Thing *existingThing, myThings()) {
|
||||||
@ -67,7 +67,6 @@ void IntegrationPluginSma::discoverThings(ThingDiscoveryInfo *info)
|
|||||||
}
|
}
|
||||||
info->finish(Thing::ThingErrorNoError);
|
info->finish(Thing::ThingErrorNoError);
|
||||||
});
|
});
|
||||||
info->finish(Thing::ThingErrorNoError);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,8 +94,14 @@ void IntegrationPluginSma::setupThing(ThingSetupInfo *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SunnyWebBox *sunnyWebBox = new SunnyWebBox(m_sunnyWebBoxCommunication, QHostAddress(thing->paramValue(sunnyWebBoxThingHostParamTypeId).toString()), this);
|
SunnyWebBox *sunnyWebBox = new SunnyWebBox(m_sunnyWebBoxCommunication, QHostAddress(thing->paramValue(sunnyWebBoxThingHostParamTypeId).toString()), this);
|
||||||
|
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);
|
||||||
m_sunnyWebBoxes.insert(thing, sunnyWebBox);
|
m_sunnyWebBoxes.insert(thing, sunnyWebBox);
|
||||||
//TODO m_asyncSetup
|
connect(info, &ThingSetupInfo::aborted, this, [thing, this] { m_sunnyWebBoxes.remove(thing);});
|
||||||
|
int requestId = sunnyWebBox->getPlantOverview();
|
||||||
|
m_asyncSetup.insert(requestId, info);
|
||||||
return info->finish(Thing::ThingErrorNoError);
|
return info->finish(Thing::ThingErrorNoError);
|
||||||
|
|
||||||
} else if (thing->thingClassId() == inverterThingClassId) {
|
} else if (thing->thingClassId() == inverterThingClassId) {
|
||||||
@ -142,9 +147,11 @@ void IntegrationPluginSma::executeAction(ThingActionInfo *info)
|
|||||||
if (!sunnyWebBox)
|
if (!sunnyWebBox)
|
||||||
return;
|
return;
|
||||||
if (action.actionTypeId() == sunnyWebBoxSearchDevicesActionTypeId) {
|
if (action.actionTypeId() == sunnyWebBoxSearchDevicesActionTypeId) {
|
||||||
sunnyWebBox->getDevices();
|
int requestId = sunnyWebBox->getDevices();
|
||||||
|
m_asyncActions.insert(requestId, info);
|
||||||
|
connect(info, &ThingActionInfo::aborted, info, [requestId, this] {m_asyncActions.remove(requestId);});
|
||||||
} else {
|
} else {
|
||||||
//Unhandled actionTypeId
|
Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
|
Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
|
||||||
@ -172,12 +179,16 @@ void IntegrationPluginSma::onRefreshTimer()
|
|||||||
|
|
||||||
void IntegrationPluginSma::onPlantOverviewReceived(int messageId, SunnyWebBox::Overview overview)
|
void IntegrationPluginSma::onPlantOverviewReceived(int messageId, SunnyWebBox::Overview overview)
|
||||||
{
|
{
|
||||||
Q_UNUSED(messageId)
|
if (m_asyncSetup.contains(messageId)) {
|
||||||
|
ThingSetupInfo *info = m_asyncSetup.value(messageId);
|
||||||
|
info->finish(Thing::ThingErrorNoError);
|
||||||
|
}
|
||||||
|
|
||||||
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
|
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
|
||||||
if (!thing)
|
if (!thing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
qCDebug(dcSma()) << "Plant overview received" << overview.status;
|
||||||
thing->setStateValue(sunnyWebBoxConnectedStateTypeId, true);
|
thing->setStateValue(sunnyWebBoxConnectedStateTypeId, true);
|
||||||
thing->setStateValue(sunnyWebBoxCurrentPowerStateTypeId, overview.power);
|
thing->setStateValue(sunnyWebBoxCurrentPowerStateTypeId, overview.power);
|
||||||
thing->setStateValue(sunnyWebBoxDayEnergyStateTypeId, overview.dailyYield);
|
thing->setStateValue(sunnyWebBoxDayEnergyStateTypeId, overview.dailyYield);
|
||||||
@ -191,7 +202,11 @@ void IntegrationPluginSma::onPlantOverviewReceived(int messageId, SunnyWebBox::O
|
|||||||
|
|
||||||
void IntegrationPluginSma::onDevicesReceived(int messageId, QList<SunnyWebBox::Device> devices)
|
void IntegrationPluginSma::onDevicesReceived(int messageId, QList<SunnyWebBox::Device> devices)
|
||||||
{
|
{
|
||||||
Q_UNUSED(messageId)
|
if (m_asyncActions.contains(messageId)) {
|
||||||
|
ThingActionInfo *info = m_asyncActions.value(messageId);
|
||||||
|
info->finish(Thing::ThingErrorNoError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
|
Thing *thing = m_sunnyWebBoxes.key(static_cast<SunnyWebBox *>(sender()));
|
||||||
if (!thing)
|
if (!thing)
|
||||||
|
|||||||
@ -67,7 +67,8 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
PluginTimer *m_refreshTimer = nullptr;
|
PluginTimer *m_refreshTimer = nullptr;
|
||||||
QHash<Thing *, SunnyWebBox *> m_sunnyWebBoxes;
|
QHash<Thing *, SunnyWebBox *> m_sunnyWebBoxes;
|
||||||
QHash<Thing *, ThingSetupInfo *> m_asyncSetup;
|
QHash<int, ThingSetupInfo *> m_asyncSetup;
|
||||||
|
QHash<int, ThingActionInfo *> m_asyncActions;
|
||||||
SunnyWebBoxCommunication *m_sunnyWebBoxCommunication = nullptr;
|
SunnyWebBoxCommunication *m_sunnyWebBoxCommunication = nullptr;
|
||||||
|
|
||||||
SunnyWebBox *createSunnyWebBoxConnection(Thing *thing);
|
SunnyWebBox *createSunnyWebBoxConnection(Thing *thing);
|
||||||
|
|||||||
@ -55,6 +55,7 @@ SunnyWebBoxCommunication::SunnyWebBoxCommunication(QObject *parent) : QObject(pa
|
|||||||
qCWarning(dcSma()) << "Error reading pending datagram";
|
qCWarning(dcSma()) << "Error reading pending datagram";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
datagramReceived(address, data);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ int SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QSt
|
|||||||
obj["proc"] = procedure;
|
obj["proc"] = procedure;
|
||||||
obj["id"] = requestId;
|
obj["id"] = requestId;
|
||||||
obj["format"] = "JSON";
|
obj["format"] = "JSON";
|
||||||
|
qCDebug(dcSma()) << "Send message" << doc.toJson() << address << m_port;
|
||||||
m_udpSocket->writeDatagram(doc.toJson(), address, m_port);
|
m_udpSocket->writeDatagram(doc.toJson(), address, m_port);
|
||||||
return requestId;
|
return requestId;
|
||||||
}
|
}
|
||||||
@ -85,12 +87,14 @@ int SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QSt
|
|||||||
if (!params.isEmpty()) {
|
if (!params.isEmpty()) {
|
||||||
obj.insert("params", params);
|
obj.insert("params", params);
|
||||||
}
|
}
|
||||||
|
qCDebug(dcSma()) << "Send message" << doc.toJson() << address << m_port;
|
||||||
m_udpSocket->writeDatagram(doc.toJson(), address, m_port);
|
m_udpSocket->writeDatagram(doc.toJson(), address, m_port);
|
||||||
return requestId;
|
return requestId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunnyWebBoxCommunication::datagramReceived(const QHostAddress &address, const QByteArray &data)
|
void SunnyWebBoxCommunication::datagramReceived(const QHostAddress &address, const QByteArray &data)
|
||||||
{
|
{
|
||||||
|
qCDebug(dcSma()) << "Datagram received" << data;
|
||||||
QJsonParseError error;
|
QJsonParseError error;
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
|
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
|
||||||
if (error.error != QJsonParseError::NoError) {
|
if (error.error != QJsonParseError::NoError) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user