moved mypv to QModbus
parent
bd6cfd8b02
commit
05e71c24f6
|
|
@ -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 "";
|
||||
|
|
|
|||
|
|
@ -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<quint16> &values);
|
||||
|
|
|
|||
|
|
@ -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<quint16>() << 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<quint16>() << 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "../modbus/modbustcpmaster.h"
|
||||
|
||||
#include <QUdpSocket>
|
||||
#include <QUuid>
|
||||
|
||||
class IntegrationPluginMyPv: public IntegrationPlugin
|
||||
{
|
||||
|
|
@ -80,6 +81,7 @@ private:
|
|||
|
||||
PluginTimer *m_refreshTimer = nullptr;
|
||||
QHash<Thing *, ModbusTCPMaster *> m_modbusTcpMasters;
|
||||
QHash<QUuid, ThingActionInfo *> 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<quint16> &values);
|
||||
void onReceivedInputRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector<quint16> &values);
|
||||
};
|
||||
|
||||
#endif // INTEGRATIONPLUGINMYPV_H
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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<quint16> &value);
|
||||
void onReceivedInputRegister(int slaveAddress, int modbusRegister, int value);
|
||||
|
||||
void onWriteRequestExecuted(const QUuid &requestId, bool success);
|
||||
void onWriteRequestError(const QUuid &requestId, const QString &error);
|
||||
|
|
|
|||
Loading…
Reference in New Issue