diff --git a/libnymea-modbus/tools/connectiontool/modbustcp.py b/libnymea-modbus/tools/connectiontool/modbustcp.py index d4ccdd1..4ea9afe 100644 --- a/libnymea-modbus/tools/connectiontool/modbustcp.py +++ b/libnymea-modbus/tools/connectiontool/modbustcp.py @@ -590,6 +590,8 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti writeLine(fileDescriptor, ' return false;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) + writeLine(fileDescriptor, ' m_initializing = true;') + writeLine(fileDescriptor) # Read individual registers for registerDefinition in registerDefinitions: @@ -614,6 +616,8 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti writeLine(fileDescriptor, ' return false;') writeLine(fileDescriptor, ' }') writeLine(fileDescriptor) + writeLine(fileDescriptor, ' m_initializing = true;') + writeLine(fileDescriptor) writeLine(fileDescriptor, ' // Parent object for the init process') writeLine(fileDescriptor, ' m_initObject = new QObject(this);') writeLine(fileDescriptor) @@ -744,6 +748,7 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti else: writeLine(fileDescriptor, ' // No init registers defined. Nothing to be done and we are finished.') + writeLine(fileDescriptor, ' m_initializing = false;') writeLine(fileDescriptor, ' emit initializationFinished(true);') writeLine(fileDescriptor, ' return true;') diff --git a/libnymea-modbus/tools/generate-connection.py b/libnymea-modbus/tools/generate-connection.py index 2ddc354..d3208eb 100644 --- a/libnymea-modbus/tools/generate-connection.py +++ b/libnymea-modbus/tools/generate-connection.py @@ -75,6 +75,7 @@ def writeTcpHeaderFile(): writeLine(headerFile, ' quint16 slaveId() const;') writeLine(headerFile) writeLine(headerFile, ' bool reachable() const;') + writeLine(headerFile, ' bool initializing() const;') writeLine(headerFile) # Write init and update method declarations @@ -180,6 +181,7 @@ def writeTcpHeaderFile(): writeLine(headerFile) writeLine(headerFile, ' bool m_reachable = false;') + writeLine(headerFile, ' bool m_initializing = false;') writeLine(headerFile, ' QModbusReply *m_checkRechableReply = nullptr;') writeLine(headerFile, ' uint m_checkReachableRetries = 0;') writeLine(headerFile, ' uint m_checkReachableRetriesCount = 0;') @@ -273,6 +275,12 @@ def writeTcpSourceFile(): writeLine(sourceFile, '}') writeLine(sourceFile) + writeLine(sourceFile, 'bool %s::initializing() const' % (className)) + writeLine(sourceFile, '{') + writeLine(sourceFile, ' return m_initializing;') + writeLine(sourceFile, '}') + writeLine(sourceFile) + writeLine(sourceFile, 'uint %s::checkReachableRetries() const' % (className)) writeLine(sourceFile, '{') writeLine(sourceFile, ' return m_checkReachableRetries;') @@ -423,6 +431,7 @@ def writeTcpSourceFile(): writeLine(sourceFile, ' qCWarning(dc%s()) << "Initialization finished of %s" << m_modbusTcpMaster->hostAddress().toString() << "failed.";' % (className, className)) writeLine(sourceFile, ' }') writeLine(sourceFile) + writeLine(sourceFile, ' m_initializing = false;') if queuedRequests: writeLine(sourceFile, ' m_initRequestQueue.clear();') @@ -460,6 +469,7 @@ def writeTcpSourceFile(): writeLine(sourceFile, ' m_communicationWorking = false;') writeLine(sourceFile, ' m_communicationFailedCounter = 0;') writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;') + writeLine(sourceFile, ' m_initializing = false;') if queuedRequests: writeLine(sourceFile, ' m_updateRequestQueue.clear();') diff --git a/solax/integrationpluginsolax.cpp b/solax/integrationpluginsolax.cpp index 942b247..8da3687 100644 --- a/solax/integrationpluginsolax.cpp +++ b/solax/integrationpluginsolax.cpp @@ -197,7 +197,7 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info) // Try once to reconnect the device solaxConnection->reconnectDevice(); } else { - // Start update cycle + qCInfo(dcSolax()) << "Connection initialized successfully for" << thing; solaxConnection->update(); } }); @@ -309,9 +309,6 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info) batteryThing->setStateValue(solaxBatteryChargingStateStateTypeId, "charging"); } } - - // Run the next update cycle - solaxConnection->update(); }); connect(thing, &Thing::settingChanged, solaxConnection, [this, thing](const ParamTypeId ¶mTypeId, const QVariant &value){ @@ -410,6 +407,28 @@ void IntegrationPluginSolax::setupThing(ThingSetupInfo *info) void IntegrationPluginSolax::postSetupThing(Thing *thing) { + + if (thing->thingClassId() == solaxInverterTcpThingClassId) { + + // Create the update timer if not already set up + if (!m_refreshTimer) { + qCDebug(dcSolax()) << "Starting plugin timer..."; + m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); + connect(m_refreshTimer, &PluginTimer::timeout, this, [this] { + foreach(SolaxModbusTcpConnection *connection, m_tcpConnections) { + if (connection->initializing()) + continue; + + //qCDebug(dcSolax()) << "Update connection" << connection->modbusTcpMaster()->hostAddress().toString(); + connection->update(); + } + }); + + m_refreshTimer->start(); + } + return; + } + if (thing->thingClassId() == solaxMeterThingClassId || thing->thingClassId() == solaxBatteryThingClassId || thing->thingClassId() == solaxInverterChildThingClassId) { Thing *connectionThing = myThings().findById(thing->parentId()); if (connectionThing) { @@ -432,6 +451,11 @@ void IntegrationPluginSolax::thingRemoved(Thing *thing) if (m_monitors.contains(thing)) hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing)); + if (myThings().isEmpty() && m_refreshTimer) { + qCDebug(dcSolax()) << "Stopping refresh timer"; + hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer); + m_refreshTimer = nullptr; + } } Thing *IntegrationPluginSolax::getMeterThing(Thing *parentThing, uint meterId) diff --git a/solax/integrationpluginsolax.h b/solax/integrationpluginsolax.h index 2ffe416..f30b3e6 100644 --- a/solax/integrationpluginsolax.h +++ b/solax/integrationpluginsolax.h @@ -56,6 +56,8 @@ public: void thingRemoved(Thing *thing) override; private: + PluginTimer *m_refreshTimer = nullptr; + QHash m_monitors; QHash m_tcpConnections; QHash m_rtuConnections;