fixed myPV timer initialization

This commit is contained in:
bernhard.trinnes 2020-09-18 18:10:26 +02:00
parent 5b8291b29c
commit 9d75fb9dcc
2 changed files with 76 additions and 66 deletions

View File

@ -42,73 +42,73 @@ IntegrationPluginMyPv::IntegrationPluginMyPv()
void IntegrationPluginMyPv::discoverThings(ThingDiscoveryInfo *info) void IntegrationPluginMyPv::discoverThings(ThingDiscoveryInfo *info)
{ {
if (info->thingClassId() == elwaThingClassId) { if (info->thingClassId() == elwaThingClassId) {
QUdpSocket *searchSocket = new QUdpSocket(this); QUdpSocket *searchSocket = new QUdpSocket(this);
// Note: This will fail, and it's not a problem, but it is required to force the socket to stick to IPv4... // Note: This will fail, and it's not a problem, but it is required to force the socket to stick to IPv4...
searchSocket->bind(QHostAddress::AnyIPv4, 16124); searchSocket->bind(QHostAddress::AnyIPv4, 16124);
QByteArray discoveryString; QByteArray discoveryString;
discoveryString.resize(19); discoveryString.resize(19);
discoveryString.fill(0); discoveryString.fill(0);
discoveryString.insert(0, QByteArray::fromHex("86d93efc")); discoveryString.insert(0, QByteArray::fromHex("86d93efc"));
discoveryString.insert(4, "AC ELWA-E"); discoveryString.insert(4, "AC ELWA-E");
qCDebug(dcMypv()) << "Send datagram:" << discoveryString << "length: " << discoveryString.length(); qCDebug(dcMypv()) << "Send datagram:" << discoveryString << "length: " << discoveryString.length();
qint64 len = searchSocket->writeDatagram(discoveryString, QHostAddress("255.255.255.255"), 16124); qint64 len = searchSocket->writeDatagram(discoveryString, QHostAddress("255.255.255.255"), 16124);
if (len != discoveryString.length()) { if (len != discoveryString.length()) {
searchSocket->deleteLater(); searchSocket->deleteLater();
info->finish(Thing::ThingErrorHardwareNotAvailable , tr("Error starting device discovery")); info->finish(Thing::ThingErrorHardwareNotAvailable , tr("Error starting device discovery"));
return; return;
}
QTimer::singleShot(2000, this, [this, searchSocket, info](){
QList<ThingDescriptor> descriptorList;
while(searchSocket->hasPendingDatagrams()) {
char buffer[1024];
QHostAddress senderAddress;
int len = searchSocket->readDatagram(buffer, 1024, &senderAddress);
QByteArray data = QByteArray::fromRawData(buffer, len);
qCDebug(dcMypv()) << "Have datagram:" << data;
if (data.length() < 64) {
continue;
}
//Device Id AC•THOR = 0x4e84
//Device Id Power = 0x4e8e
//Device Id AC ELWA-E = 0x3efc
qCDebug(dcMypv()) << "device Id:" << data.mid(2, 2);
if (data.mid(2, 2) == QByteArray::fromHex("3efc")) {
qCDebug(dcMypv()) << "Found Device: AC ElWA-E";
} else if (data.mid(2, 2) == QByteArray::fromHex("0x4e8e")) {
qCDebug(dcMypv()) << "Found Device: Powermeter";
} else if (data.mid(2, 2) == QByteArray::fromHex("0x4e84")) {
qCDebug(dcMypv()) << "Found Device: AC Thor";
} else {
qCDebug(dcMypv()) << "Failed to parse discovery datagram from" << senderAddress << data;
continue;
}
ThingDescriptor thingDescriptors(info->thingClassId(), "AC ELWA-E", senderAddress.toString());
QByteArray serialNumber = data.mid(8, 16);
foreach (Thing *existingThing, myThings()) {
if (serialNumber == existingThing->paramValue(elwaThingSerialNumberParamTypeId).toString()) {
qCDebug(dcMypv()) << "Rediscovered device " << existingThing->name();
thingDescriptors.setThingId(existingThing->id());
break;
}
}
ParamList params;
params << Param(elwaThingIpAddressParamTypeId, senderAddress.toString());
params << Param(elwaThingSerialNumberParamTypeId, serialNumber);
thingDescriptors.setParams(params);
descriptorList << thingDescriptors;
} }
info->addThingDescriptors(descriptorList);;
searchSocket->deleteLater(); QTimer::singleShot(2000, this, [this, searchSocket, info](){
info->finish(Thing::ThingErrorNoError); QList<ThingDescriptor> descriptorList;
}); while(searchSocket->hasPendingDatagrams()) {
char buffer[1024];
QHostAddress senderAddress;
int len = searchSocket->readDatagram(buffer, 1024, &senderAddress);
QByteArray data = QByteArray::fromRawData(buffer, len);
qCDebug(dcMypv()) << "Have datagram:" << data;
if (data.length() < 64) {
continue;
}
//Device Id AC•THOR = 0x4e84
//Device Id Power = 0x4e8e
//Device Id AC ELWA-E = 0x3efc
qCDebug(dcMypv()) << "device Id:" << data.mid(2, 2);
if (data.mid(2, 2) == QByteArray::fromHex("3efc")) {
qCDebug(dcMypv()) << "Found Device: AC ElWA-E";
} else if (data.mid(2, 2) == QByteArray::fromHex("0x4e8e")) {
qCDebug(dcMypv()) << "Found Device: Powermeter";
} else if (data.mid(2, 2) == QByteArray::fromHex("0x4e84")) {
qCDebug(dcMypv()) << "Found Device: AC Thor";
} else {
qCDebug(dcMypv()) << "Failed to parse discovery datagram from" << senderAddress << data;
continue;
}
ThingDescriptor thingDescriptors(info->thingClassId(), "AC ELWA-E", senderAddress.toString());
QByteArray serialNumber = data.mid(8, 16);
foreach (Thing *existingThing, myThings()) {
if (serialNumber == existingThing->paramValue(elwaThingSerialNumberParamTypeId).toString()) {
qCDebug(dcMypv()) << "Rediscovered device " << existingThing->name();
thingDescriptors.setThingId(existingThing->id());
break;
}
}
ParamList params;
params << Param(elwaThingIpAddressParamTypeId, senderAddress.toString());
params << Param(elwaThingSerialNumberParamTypeId, serialNumber);
thingDescriptors.setParams(params);
descriptorList << thingDescriptors;
}
info->addThingDescriptors(descriptorList);;
searchSocket->deleteLater();
info->finish(Thing::ThingErrorNoError);
});
} else { } else {
Q_ASSERT_X(false, "discoverThings", QString("Unhandled thingClassId: %1").arg(info->thingClassId().toString()).toUtf8()); Q_ASSERT_X(false, "discoverThings", QString("Unhandled thingClassId: %1").arg(info->thingClassId().toString()).toUtf8());
} }
@ -134,6 +134,11 @@ void IntegrationPluginMyPv::setupThing(ThingSetupInfo *info)
void IntegrationPluginMyPv::postSetupThing(Thing *thing) void IntegrationPluginMyPv::postSetupThing(Thing *thing)
{ {
if (!m_refreshTimer) {
m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(10);
connect(m_refreshTimer, &PluginTimer::timeout, this, &IntegrationPluginMyPv::onRefreshTimer);
}
if (thing->thingClassId() == elwaThingClassId) { if (thing->thingClassId() == elwaThingClassId) {
update(thing); update(thing);
} }
@ -145,6 +150,11 @@ void IntegrationPluginMyPv::thingRemoved(Thing *thing)
ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.take(thing); ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.take(thing);
modbusTCPMaster->deleteLater(); modbusTCPMaster->deleteLater();
} }
if (myThings().isEmpty()) {
hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer);
m_refreshTimer = nullptr;
}
} }
void IntegrationPluginMyPv::executeAction(ThingActionInfo *info) void IntegrationPluginMyPv::executeAction(ThingActionInfo *info)
@ -179,11 +189,12 @@ void IntegrationPluginMyPv::executeAction(ThingActionInfo *info)
Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8());
} }
} else { } else {
Q_ASSERT_X(false, "executeAction", QString("Unhandled deviceClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
} }
} }
void IntegrationPluginMyPv::onRefreshTimer(){ void IntegrationPluginMyPv::onRefreshTimer()
{
foreach (Thing *thing, myThings()) { foreach (Thing *thing, myThings()) {
update(thing); update(thing);

View File

@ -11,4 +11,3 @@ SOURCES += \
HEADERS += \ HEADERS += \
integrationpluginmypv.h \ integrationpluginmypv.h \
../modbus/modbustcpmaster.h \ ../modbus/modbustcpmaster.h \