improved update cycle process
parent
465936f9ac
commit
739d1a4dd2
|
|
@ -159,6 +159,8 @@ void EnergyMeter::getRegister(ModbusRegisterType type, ModbusRegisterDescriptor
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcEnergyMeters()) << "Data type not supported" << descriptor.dataType();
|
qCWarning(dcEnergyMeters()) << "Data type not supported" << descriptor.dataType();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == ModbusRegisterType::Voltage) {
|
if (type == ModbusRegisterType::Voltage) {
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ void IntegrationPluginEnergyMeters::discoverThings(ThingDiscoveryInfo *info)
|
||||||
if (!modbusMaster->connected()) {
|
if (!modbusMaster->connected()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ThingDescriptor descriptor(info->thingClassId(), "Modbus interface "+modbusMaster->serialPort(), modbusMaster->modbusUuid().toString());
|
ThingDescriptor descriptor(info->thingClassId(), QT_TR_NOOP("Energy meter"), QT_TR_NOOP("Slave address ") +QString::number(slaveAddress)+" "+modbusMaster->serialPort());
|
||||||
ParamList params;
|
ParamList params;
|
||||||
params << Param(m_slaveIdParamTypeIds.value(info->thingClassId()), slaveAddress);
|
params << Param(m_slaveIdParamTypeIds.value(info->thingClassId()), slaveAddress);
|
||||||
params << Param(m_modbusUuidParamTypeIds.value(info->thingClassId()), modbusMaster->modbusUuid());
|
params << Param(m_modbusUuidParamTypeIds.value(info->thingClassId()), modbusMaster->modbusUuid());
|
||||||
|
|
@ -176,6 +176,27 @@ void IntegrationPluginEnergyMeters::postSetupThing(Thing *thing)
|
||||||
qCDebug(dcEnergyMeters) << "Post setup thing" << thing->name();
|
qCDebug(dcEnergyMeters) << "Post setup thing" << thing->name();
|
||||||
if (m_connectionStateTypeIds.contains(thing->thingClassId())) {
|
if (m_connectionStateTypeIds.contains(thing->thingClassId())) {
|
||||||
thing->setStateValue(m_connectionStateTypeIds.value(thing->thingClassId()), true);
|
thing->setStateValue(m_connectionStateTypeIds.value(thing->thingClassId()), true);
|
||||||
|
|
||||||
|
if (m_energyMeters.contains(thing)) {
|
||||||
|
startUpdateCycle(m_energyMeters.value(thing));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_reconnectTimer) {
|
||||||
|
m_reconnectTimer = hardwareManager()->pluginTimerManager()->registerTimer(5000);
|
||||||
|
connect(m_reconnectTimer, &PluginTimer::timeout, this, [this] {
|
||||||
|
foreach (Thing *thing, myThings()) {
|
||||||
|
if (m_connectionStateTypeIds.contains(thing->thingClassId())) {
|
||||||
|
if (!thing->stateValue(m_connectionStateTypeIds.value(thing->thingClassId())).toBool()) {
|
||||||
|
EnergyMeter *meter = m_energyMeters.value(thing);
|
||||||
|
if (!meter)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
startUpdateCycle(meter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -186,6 +207,32 @@ void IntegrationPluginEnergyMeters::thingRemoved(Thing *thing)
|
||||||
if (m_energyMeters.contains(thing)) {
|
if (m_energyMeters.contains(thing)) {
|
||||||
m_energyMeters.take(thing)->deleteLater();
|
m_energyMeters.take(thing)->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (myThings().isEmpty() && m_reconnectTimer) {
|
||||||
|
hardwareManager()->pluginTimerManager()->unregisterTimer(m_reconnectTimer);
|
||||||
|
m_reconnectTimer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginEnergyMeters::startUpdateCycle(EnergyMeter *meter)
|
||||||
|
{
|
||||||
|
if (m_updateCycleInProgress.contains(meter)) {
|
||||||
|
if (m_updateCycleInProgress.value(meter)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_updateCycleInProgress.insert(meter, true);
|
||||||
|
meter->getVoltage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntegrationPluginEnergyMeters::updateCycleFinished(EnergyMeter *meter)
|
||||||
|
{
|
||||||
|
m_updateCycleInProgress.insert(meter, false);
|
||||||
|
|
||||||
|
int updateInterval = configValue(energyMetersPluginUpdateIntervalParamTypeId).toInt();
|
||||||
|
QTimer::singleShot(updateInterval, meter, [this, meter] {
|
||||||
|
startUpdateCycle(meter); // restart update cycle
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void IntegrationPluginEnergyMeters::onConnectionStateChanged(bool status)
|
void IntegrationPluginEnergyMeters::onConnectionStateChanged(bool status)
|
||||||
|
|
@ -195,15 +242,10 @@ void IntegrationPluginEnergyMeters::onConnectionStateChanged(bool status)
|
||||||
if (!thing)
|
if (!thing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
thing->setStateValue(m_connectionStateTypeIds.value(thing->thingClassId()), status);
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
QTimer::singleShot(5000, meter, [this, meter, thing] {
|
updateCycleFinished(meter);
|
||||||
if (!thing->stateValue(m_connectionStateTypeIds.value(thing->thingClassId())).toBool()) {
|
|
||||||
// Check if the device is still disconnected
|
|
||||||
meter->getVoltage(); // restart update cycle
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
thing->setStateValue(m_connectionStateTypeIds.value(thing->thingClassId()), status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IntegrationPluginEnergyMeters::onVoltageReceived(double voltage)
|
void IntegrationPluginEnergyMeters::onVoltageReceived(double voltage)
|
||||||
|
|
@ -278,10 +320,6 @@ void IntegrationPluginEnergyMeters::onConsumedEnergyReceived(double energy)
|
||||||
Thing *thing = m_energyMeters.key(meter);
|
Thing *thing = m_energyMeters.key(meter);
|
||||||
if (!thing)
|
if (!thing)
|
||||||
return;
|
return;
|
||||||
|
updateCycleFinished(meter);
|
||||||
int updateInterval = configValue(energyMetersPluginUpdateIntervalParamTypeId).toInt();
|
|
||||||
QTimer::singleShot(updateInterval, meter, [meter] {
|
|
||||||
meter->getVoltage(); // restart update cycle
|
|
||||||
});
|
|
||||||
thing->setStateValue(m_totalEnergyConsumedStateTypeIds.value(thing->thingClassId()), energy);
|
thing->setStateValue(m_totalEnergyConsumedStateTypeIds.value(thing->thingClassId()), energy);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ public:
|
||||||
void thingRemoved(Thing *thing) override;
|
void thingRemoved(Thing *thing) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
PluginTimer *m_reconnectTimer = nullptr;
|
||||||
QHash<ThingClassId, StateTypeId> m_connectionStateTypeIds;
|
QHash<ThingClassId, StateTypeId> m_connectionStateTypeIds;
|
||||||
QHash<ThingClassId, StateTypeId> m_voltageStateTypeIds;
|
QHash<ThingClassId, StateTypeId> m_voltageStateTypeIds;
|
||||||
QHash<ThingClassId, StateTypeId> m_currentStateTypeIds;
|
QHash<ThingClassId, StateTypeId> m_currentStateTypeIds;
|
||||||
|
|
@ -73,6 +74,10 @@ private:
|
||||||
|
|
||||||
QHash<Thing *, EnergyMeter *> m_energyMeters;
|
QHash<Thing *, EnergyMeter *> m_energyMeters;
|
||||||
|
|
||||||
|
QHash<EnergyMeter *, bool> m_updateCycleInProgress;
|
||||||
|
void startUpdateCycle(EnergyMeter *meter);
|
||||||
|
void updateCycleFinished(EnergyMeter *meter);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onConnectionStateChanged(bool status);
|
void onConnectionStateChanged(bool status);
|
||||||
void onVoltageReceived(double voltage);
|
void onVoltageReceived(double voltage);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue