improved connection state and added more debug output
parent
278e7febcd
commit
807a472b57
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue