From 05e71c24f62cc2afcd87d084b6fa6df4667adccb Mon Sep 17 00:00:00 2001 From: Boernsman Date: Tue, 16 Jun 2020 17:32:42 +0200 Subject: [PATCH] moved mypv to QModbus --- modbus/modbustcpmaster.cpp | 2 +- modbus/modbustcpmaster.h | 2 +- mypv/integrationpluginmypv.cpp | 173 ++++++++++++++++------------- mypv/integrationpluginmypv.h | 13 ++- wallbe/integrationpluginwallbe.cpp | 2 +- wallbe/integrationpluginwallbe.h | 4 - 6 files changed, 105 insertions(+), 91 deletions(-) diff --git a/modbus/modbustcpmaster.cpp b/modbus/modbustcpmaster.cpp index 213b50a..74db87b 100644 --- a/modbus/modbustcpmaster.cpp +++ b/modbus/modbustcpmaster.cpp @@ -274,7 +274,7 @@ QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress return requestId; } -QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddress, uint size = 1) +QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusTcpClient) { return ""; diff --git a/modbus/modbustcpmaster.h b/modbus/modbustcpmaster.h index af6727e..f824df6 100644 --- a/modbus/modbustcpmaster.h +++ b/modbus/modbustcpmaster.h @@ -49,7 +49,7 @@ public: QUuid readCoil(uint slaveAddress, uint registerAddress); QUuid readDiscreteInput(uint slaveAddress, uint registerAddress); QUuid readInputRegister(uint slaveAddress, uint registerAddress); - QUuid readHoldingRegister(uint slaveAddress, uint registerAddress); + QUuid readHoldingRegister(uint slaveAddress, uint registerAddress, uint size = 1); QUuid writeCoil(uint slaveAddress, uint registerAddress, bool status); QUuid writeHoldingRegister(uint slaveAddress, uint registerAddress, const QVector &values); diff --git a/mypv/integrationpluginmypv.cpp b/mypv/integrationpluginmypv.cpp index f145a46..ee46197 100644 --- a/mypv/integrationpluginmypv.cpp +++ b/mypv/integrationpluginmypv.cpp @@ -123,12 +123,11 @@ void IntegrationPluginMyPv::setupThing(ThingSetupInfo *info) if(thing->thingClassId() == elwaThingClassId) { QHostAddress address = QHostAddress(thing->paramValue(elwaThingIpAddressParamTypeId).toString()); ModbusTCPMaster *modbusTcpMaster = new ModbusTCPMaster(address, 502, this); + connect(modbusTcpMaster, &ModbusTCPMaster::connectionStateChanged, this, &IntegrationPluginMyPv::onConnectionStateChanged); + connect(modbusTcpMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &IntegrationPluginMyPv::onReceivedHoldingRegister); + connect(modbusTcpMaster, &ModbusTCPMaster::writeRequestExecuted, this, &IntegrationPluginMyPv::onWriteRequestExecuted); + connect(modbusTcpMaster, &ModbusTCPMaster::writeRequestError, this, &IntegrationPluginMyPv::onWriteRequestError); - if (!modbusTcpMaster->createInterface()) { - modbusTcpMaster->deleteLater(); - - return; - } m_modbusTcpMasters.insert(thing, modbusTcpMaster); } else { Q_ASSERT_X(false, "setupDevice", QString("Unhandled deviceClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); @@ -161,16 +160,12 @@ void IntegrationPluginMyPv::executeAction(ThingActionInfo *info) if (action.actionTypeId() == elwaHeatingPowerActionTypeId) { int heatingPower = action.param(elwaHeatingPowerActionHeatingPowerParamTypeId).value().toInt(); - if(!modbusTCPMaster->writeHoldingRegister(0xff, ElwaModbusRegisters::Power, heatingPower)){ - return info->finish(Thing::ThingErrorHardwareFailure); - } - return; + QUuid requestId = modbusTCPMaster->writeHoldingRegister(0xff, ElwaModbusRegisters::Power, QVector() << heatingPower)); + m_asyncActions.insert(requestId, info); } else if (action.actionTypeId() == elwaPowerActionTypeId) { bool power = action.param(elwaHeatingPowerActionHeatingPowerParamTypeId).value().toBool(); if(power) { - if(!modbusTCPMaster->writeHoldingRegister(0xff, ElwaModbusRegisters::ManuelStart, 1)){ - return info->finish(Thing::ThingErrorHardwareFailure); - } + QUuid requestId = modbusTCPMaster->writeHoldingRegister(0xff, ElwaModbusRegisters::ManuelStart, QVector() << 1)); } } else { Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); @@ -189,80 +184,102 @@ void IntegrationPluginMyPv::onRefreshTimer(){ void IntegrationPluginMyPv::onConnectionStateChanged(bool status) { -//TODO set device connected state + ModbusTCPMaster *modbusTcpMaster = sender(); + Thing *thing = m_modbusTcpMasters.key(modbusTcpMaster); + if (!thing) + return; + thing->setStateValue(elwaConnectedStateTypeId, status); } -void IntegrationPluginMyPv::update(Thing *thing) { - if (thing->thingClassId() == elwaThingClassId) - { - ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing); +void IntegrationPluginMyPv::onWriteRequestExecuted(QUuid requestId, bool success) +{ - int data; - if (modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::Status, &data)) { - switch (data) { - case Heating: { - thing->setStateValue(elwaStatusStateTypeId, "Heating"); - thing->setStateValue(elwaPowerStateTypeId, true); - break; - } - case Standby:{ - thing->setStateValue(elwaStatusStateTypeId, "Standby"); - thing->setStateValue(elwaPowerStateTypeId, false); - break; - } - case Boosted:{ - thing->setStateValue(elwaStatusStateTypeId, "Boosted"); - thing->setStateValue(elwaPowerStateTypeId, true); - break; - } - case HeatFinished:{ - thing->setStateValue(elwaStatusStateTypeId, "Heat finished"); - thing->setStateValue(elwaPowerStateTypeId, false); - break; - } - case Setup:{ - thing->setStateValue(elwaStatusStateTypeId, "Setup"); - thing->setStateValue(elwaPowerStateTypeId, false); - break; - } - case ErrorOvertempFuseBlown:{ - thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp Fuse blown"); - break; - } - case ErrorOvertempMeasured:{ - thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp measured"); - break; - } - case ErrorOvertempElectronics:{ - thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp Electronics"); - break; - } - case ErrorHardwareFault:{ - thing->setStateValue(elwaStatusStateTypeId, "Error Hardware Fault"); - break; - } - case ErrorTempSensor:{ - thing->setStateValue(elwaStatusStateTypeId, "Error Temp Sensor"); - break; - } - default: - thing->setStateValue(elwaStatusStateTypeId, "Unknown"); - } +} - thing->setStateValue(elwaConnectedStateTypeId, true); - } else { - thing->setStateValue(elwaConnectedStateTypeId, false); - } +void IntegrationPluginMyPv::onWriteRequestError(QUuid requestId, const QString &error) +{ + Q_UNUSED(requestId) + qCWarning(dcMypv()) << "Error " +} - if (modbusTCPMaster->getRegister(0xff, ElwaModbusRegisters::WaterTemperature, &data)) { - thing->setStateValue(elwaTemperatureStateTypeId, data/10.00); +void IntegrationPluginMyPv::onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, int value) +{ + Q_UNUSED(slaveAddress) + ModbusTCPMaster *modbusTcpMaster = sender(); + Thing *thing = m_modbusTcpMasters.key(modbusTcpMaster); + if (!thing) + return; + + if(modbusRegister == ElwaModbusRegisters::Status) { + switch (ElwaStatus(value)) { + case ElwaStatus::Heating: { + thing->setStateValue(elwaStatusStateTypeId, "Heating"); + thing->setStateValue(elwaPowerStateTypeId, true); + break; } - if (modbusTCPMaster->getRegister(0xff, ElwaModbusRegisters::TargetWaterTemperature, &data)) { - thing->setStateValue(elwaTargetWaterTemperatureStateTypeId, data/10.00); + case ElwaStatus::Standby:{ + thing->setStateValue(elwaStatusStateTypeId, "Standby"); + thing->setStateValue(elwaPowerStateTypeId, false); + break; } - if (modbusTCPMaster->getRegister(0xff, ElwaModbusRegisters::Power, &data)) { - thing->setStateValue(elwaHeatingPowerStateTypeId, data); + case ElwaStatus::Boosted:{ + thing->setStateValue(elwaStatusStateTypeId, "Boosted"); + thing->setStateValue(elwaPowerStateTypeId, true); + break; } + case ElwaStatus::HeatFinished:{ + thing->setStateValue(elwaStatusStateTypeId, "Heat finished"); + thing->setStateValue(elwaPowerStateTypeId, false); + break; + } + case ElwaStatus::Setup:{ + thing->setStateValue(elwaStatusStateTypeId, "Setup"); + thing->setStateValue(elwaPowerStateTypeId, false); + break; + } + case ElwaStatus::ErrorOvertempFuseBlown:{ + thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp Fuse blown"); + break; + } + case ElwaStatus::ErrorOvertempMeasured:{ + thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp measured"); + break; + } + case ElwaStatus::ErrorOvertempElectronics:{ + thing->setStateValue(elwaStatusStateTypeId, "Error Overtemp Electronics"); + break; + } + case ElwaStatus::ErrorHardwareFault:{ + thing->setStateValue(elwaStatusStateTypeId, "Error Hardware Fault"); + break; + } + case ElwaStatus::ErrorTempSensor:{ + thing->setStateValue(elwaStatusStateTypeId, "Error Temp Sensor"); + break; + } + default: + thing->setStateValue(elwaStatusStateTypeId, "Unknown"); + } + } else if(modbusRegister == ElwaModbusRegisters::WaterTemperature) { + thing->setStateValue(elwaTemperatureStateTypeId, value[0]/10.00); + } else if(modbusRegister == ElwaModbusRegisters::TargetWaterTemperature) { + thing->setStateValue(elwaTargetWaterTemperatureStateTypeId, value[0]/10.00); + } else if(modbusRegister == ElwaModbusRegisters::Power) { + thing->setStateValue(elwaHeatingPowerStateTypeId, value[0]); + } else { + qCWarning(dcMypv()) << "Received unhandled modbus register"; + } +} + +void IntegrationPluginMyPv::update(Thing *thing) +{ + if (thing->thingClassId() == elwaThingClassId) { + ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing); + + modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::Status); + modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::WaterTemperature); + modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::TargetWaterTemperature); + modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::Power); } } diff --git a/mypv/integrationpluginmypv.h b/mypv/integrationpluginmypv.h index 82497ef..af4e8d6 100644 --- a/mypv/integrationpluginmypv.h +++ b/mypv/integrationpluginmypv.h @@ -37,6 +37,7 @@ #include "../modbus/modbustcpmaster.h" #include +#include class IntegrationPluginMyPv: public IntegrationPlugin { @@ -80,6 +81,7 @@ private: PluginTimer *m_refreshTimer = nullptr; QHash m_modbusTcpMasters; + QHash m_asyncActions; void update(Thing *thing); @@ -89,12 +91,11 @@ private slots: void onPluginConfigurationChanged(const ParamTypeId ¶mTypeId, const QVariant &value); void onConnectionStateChanged(bool status); - void onRequestExecuted(QUuid requestId, bool success); - void onRequestError(QUuid requestId, const QString &error); - void onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, bool value); - void onReceivedDiscreteInput(quint32 slaveAddress, quint32 modbusRegister, bool value); - void onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, int value); - void onReceivedInputRegister(quint32 slaveAddress, quint32 modbusRegister, int value); + void onWriteRequestExecuted(QUuid requestId, bool success); + void onWriteRequestError(QUuid requestId, const QString &error); + + void onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); + void onReceivedInputRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); }; #endif // INTEGRATIONPLUGINMYPV_H diff --git a/wallbe/integrationpluginwallbe.cpp b/wallbe/integrationpluginwallbe.cpp index 06b39cf..e9ca4b3 100644 --- a/wallbe/integrationpluginwallbe.cpp +++ b/wallbe/integrationpluginwallbe.cpp @@ -63,7 +63,7 @@ void IntegrationPluginWallbe::setupThing(ThingSetupInfo *info) connect(modbusTcpMaster, &ModbusTCPMaster::writeRequestError, this, &IntegrationPluginWallbe::onWriteRequestError); m_connections.insert(thing, modbusTcpMaster); - connect(modbusTcpMaster, &ModbusTCPMaster::connectionStateChanged, info, [this, modbusTcpMaster](bool connected) { + connect(modbusTcpMaster, &ModbusTCPMaster::connectionStateChanged, info, [this, info, modbusTcpMaster](bool connected) { if(connected) { info->finish(Thing::ThingErrorNoError); } else { diff --git a/wallbe/integrationpluginwallbe.h b/wallbe/integrationpluginwallbe.h index fdb8b5f..6eb0440 100644 --- a/wallbe/integrationpluginwallbe.h +++ b/wallbe/integrationpluginwallbe.h @@ -73,13 +73,9 @@ private: void update(Thing *thing); private slots: - void onRefreshTimer(); - void onConnectionStateChanged(bool status); void onReceivedCoil(int slaveAddress, int modbusRegister, bool value); - void onReceivedDiscreteInput(int slaveAddress, int modbusRegister, bool value); void onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const QVector &value); - void onReceivedInputRegister(int slaveAddress, int modbusRegister, int value); void onWriteRequestExecuted(const QUuid &requestId, bool success); void onWriteRequestError(const QUuid &requestId, const QString &error);