improved connection state and added more debug output

master
Boernsman 2021-05-09 22:44:46 +02:00 committed by Michael Zanetti
parent 278e7febcd
commit 807a472b57
3 changed files with 35 additions and 18 deletions

View File

@ -39,7 +39,7 @@ EnergyMeter::EnergyMeter(ModbusRtuMaster *modbusMaster, int slaveAddress, const
m_slaveAddress(slaveAddress), m_slaveAddress(slaveAddress),
m_modbusRegisters(modbusRegisters) m_modbusRegisters(modbusRegisters)
{ {
qCDebug(dcEnergyMeters()) << "EnergyMeter: Creating new meter connection, address:" << slaveAddress;
} }
ModbusRtuMaster *EnergyMeter::modbusMaster() ModbusRtuMaster *EnergyMeter::modbusMaster()
@ -114,14 +114,23 @@ bool EnergyMeter::getEnergyConsumed()
bool EnergyMeter::getRegister(ModbusRegisterType type) bool EnergyMeter::getRegister(ModbusRegisterType type)
{ {
if (!m_modbusRegisters.contains(type)) if (!m_modbusRegisters.contains(type)) {
qCWarning(dcEnergyMeters()) << "EnergyMeter: Register type not supported" << type;
setConnectionStatus(false);
return false; return false;
}
if (!m_modbusRtuMaster) if (!m_modbusRtuMaster) {
qCWarning(dcEnergyMeters()) << "EnergyMeter: Modbus RTU interface not available";
setConnectionStatus(false);
return false; return false;
}
if (!m_modbusRtuMaster->connected()) if (!m_modbusRtuMaster->connected()) {
qCWarning(dcEnergyMeters()) << "EnergyMeter: Modbus RTU interface not connected";
setConnectionStatus(false);
return false; return false;
}
ModbusRegisterDescriptor descriptor = m_modbusRegisters.value(type); ModbusRegisterDescriptor descriptor = m_modbusRegisters.value(type);
@ -134,16 +143,9 @@ bool EnergyMeter::getRegister(ModbusRegisterType type)
connect(reply, &ModbusRtuReply::finished, reply, &ModbusRtuReply::deleteLater); connect(reply, &ModbusRtuReply::finished, reply, &ModbusRtuReply::deleteLater);
connect(reply, &ModbusRtuReply::finished, this, [reply, type, descriptor, this] { connect(reply, &ModbusRtuReply::finished, this, [reply, type, descriptor, this] {
if (reply->error() != ModbusRtuReply::NoError) { if (reply->error() != ModbusRtuReply::NoError) {
if (m_connected) { qCWarning(dcEnergyMeters()) << "EnergyMeter: Modbus RTU reply error" << reply->errorString();
m_connected = false; setConnectionStatus(false);
emit connectedChanged(m_connected);
}
return; return;
} else {
if (!m_connected) {
m_connected = true;
emit connectedChanged(m_connected);
}
} }
modbus_32_t value; modbus_32_t value;
value.u = 0; value.u = 0;
@ -153,9 +155,11 @@ bool EnergyMeter::getRegister(ModbusRegisterType type)
if (descriptor.dataType() == "float") { if (descriptor.dataType() == "float") {
value.u = static_cast<float>(static_cast<uint32_t>(reply->result().at(0)) << 16 | reply->result().at(1)); value.u = static_cast<float>(static_cast<uint32_t>(reply->result().at(0)) << 16 | reply->result().at(1));
} else { } else {
qCWarning(dcEnergyMeters()) << "Data type not supported" << descriptor.dataType(); qCWarning(dcEnergyMeters()) << "EnergyMeter: Data type not supported" << descriptor.dataType();
} }
} else { } else {
qCWarning(dcEnergyMeters()) << "EnergyMeter: Reply length invalid" << reply->result().length();
setConnectionStatus(false);
return; return;
} }
@ -214,6 +218,14 @@ bool EnergyMeter::getRegister(ModbusRegisterType type)
qCWarning(dcEnergyMeters()) << "EnergyMeter: Modbus register type not handled" << type; qCWarning(dcEnergyMeters()) << "EnergyMeter: Modbus register type not handled" << type;
} }
}); });
setConnectionStatus(true);
return true; return true;
} }
void EnergyMeter::setConnectionStatus(bool connected)
{
if (connected != m_connected) {
m_connected = connected;
emit connectedChanged(m_connected);
}
}

View File

@ -74,6 +74,7 @@ private:
QHash<ModbusRegisterType, ModbusRegisterDescriptor> m_modbusRegisters; QHash<ModbusRegisterType, ModbusRegisterDescriptor> m_modbusRegisters;
bool getRegister(ModbusRegisterType type); bool getRegister(ModbusRegisterType type);
void setConnectionStatus(bool connected);
signals: signals:
void connectedChanged(bool connected); void connectedChanged(bool connected);

View File

@ -126,7 +126,7 @@ void IntegrationPluginEnergyMeters::discoverThings(ThingDiscoveryInfo *info)
} }
uint slaveAddress = info->params().paramValue(m_discoverySlaveAddressParamTypeIds.value(info->thingClassId())).toUInt(); uint slaveAddress = info->params().paramValue(m_discoverySlaveAddressParamTypeIds.value(info->thingClassId())).toUInt();
if (slaveAddress > 254 || slaveAddress == 0) { if (slaveAddress > 254 || slaveAddress == 0) {
info->finish(Thing::ThingErrorInvalidParameter, tr("Modbus slave address must be between 1 and 254")); info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("Modbus slave address must be between 1 and 254"));
return; return;
} }
Q_FOREACH(ModbusRtuMaster *modbusMaster, hardwareManager()->modbusRtuResource()->modbusRtuMasters()) { Q_FOREACH(ModbusRtuMaster *modbusMaster, hardwareManager()->modbusRtuResource()->modbusRtuMasters()) {
@ -174,7 +174,7 @@ void IntegrationPluginEnergyMeters::setupThing(ThingSetupInfo *info)
EnergyMeter *meter = new EnergyMeter(hardwareManager()->modbusRtuResource()->getModbusRtuMaster(uuid), address, m_registerMaps.value(thing->thingClassId()), this); EnergyMeter *meter = new EnergyMeter(hardwareManager()->modbusRtuResource()->getModbusRtuMaster(uuid), address, m_registerMaps.value(thing->thingClassId()), this);
connect(info, &ThingSetupInfo::aborted, meter, &EnergyMeter::deleteLater); connect(info, &ThingSetupInfo::aborted, meter, &EnergyMeter::deleteLater);
connect(meter, &EnergyMeter::consumedEnergyReceived, info, [this, info, meter] (double energy) { connect(meter, &EnergyMeter::consumedEnergyReceived, info, [this, info, meter] (double energy) {
qCDebug(dcEnergyMeters()) << "Consumed energy receieved" << energy << "Setup finished"; qCDebug(dcEnergyMeters()) << "Consumed energy received" << energy << "Setup finished";
connect(meter, &EnergyMeter::connectedChanged, this, &IntegrationPluginEnergyMeters::onConnectionStateChanged); connect(meter, &EnergyMeter::connectedChanged, this, &IntegrationPluginEnergyMeters::onConnectionStateChanged);
connect(meter, &EnergyMeter::voltageL1Received, this, &IntegrationPluginEnergyMeters::onVoltageL1Received); connect(meter, &EnergyMeter::voltageL1Received, this, &IntegrationPluginEnergyMeters::onVoltageL1Received);
connect(meter, &EnergyMeter::voltageL2Received, this, &IntegrationPluginEnergyMeters::onVoltageL2Received); connect(meter, &EnergyMeter::voltageL2Received, this, &IntegrationPluginEnergyMeters::onVoltageL2Received);
@ -209,15 +209,18 @@ void IntegrationPluginEnergyMeters::postSetupThing(Thing *thing)
} }
if (!m_reconnectTimer) { if (!m_reconnectTimer) {
qCDebug(dcEnergyMeters()) << "Starting reconnect timer";
m_reconnectTimer = hardwareManager()->pluginTimerManager()->registerTimer(5); m_reconnectTimer = hardwareManager()->pluginTimerManager()->registerTimer(5);
connect(m_reconnectTimer, &PluginTimer::timeout, this, [this] { connect(m_reconnectTimer, &PluginTimer::timeout, this, [this] {
foreach (Thing *thing, myThings()) { foreach (Thing *thing, myThings()) {
if (m_connectionStateTypeIds.contains(thing->thingClassId())) { if (m_connectionStateTypeIds.contains(thing->thingClassId())) {
if (!thing->stateValue(m_connectionStateTypeIds.value(thing->thingClassId())).toBool()) { if (!thing->stateValue(m_connectionStateTypeIds.value(thing->thingClassId())).toBool()) {
EnergyMeter *meter = m_energyMeters.value(thing); EnergyMeter *meter = m_energyMeters.value(thing);
if (!meter) if (!meter) {
qCWarning(dcEnergyMeters()) << "On reconnect timer, could not find any EnergyMeter connection for" << thing->name();
continue; continue;
}
qCDebug(dcEnergyMeters()) << "On reconnect timer, restarting update cycle for" << thing->name();
startUpdateCycle(meter); startUpdateCycle(meter);
} }
} }
@ -247,6 +250,7 @@ void IntegrationPluginEnergyMeters::startUpdateCycle(EnergyMeter *meter)
{ {
if (m_updateCycleInProgress.contains(meter)) { if (m_updateCycleInProgress.contains(meter)) {
if (m_updateCycleInProgress.value(meter)) { if (m_updateCycleInProgress.value(meter)) {
qCWarning(dcEnergyMeters()) << "Update cycle not startet, update cycle already in progress";
return; return;
} }
} }