Add thermostat interface, extend values and implement execute action
This commit is contained in:
parent
1a1276366a
commit
b79a055f48
@ -106,9 +106,19 @@ void IntegrationPluginMTec::setupThing(ThingSetupInfo *info)
|
|||||||
thing->setStateValue(mtecConnectedStateTypeId, connected);
|
thing->setStateValue(mtecConnectedStateTypeId, connected);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(mtec, &MTec::waterTankTemperatureChanged, thing, [=](double waterTankTemperature){
|
connect(mtec, &MTec::roomTemperatureChanged, thing, [=](double roomTemperature){
|
||||||
qCDebug(dcMTec()) << thing << "Water tank temperature" << waterTankTemperature << "°C";
|
qCDebug(dcMTec()) << thing << "Room temperature" << roomTemperature << "°C";
|
||||||
thing->setStateValue(mtecWaterTankTemperatureStateTypeId, waterTankTemperature);
|
thing->setStateValue(mtecTemperatureStateTypeId, roomTemperature);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(mtec, &MTec::targetRoomTemperatureChanged, thing, [=](double targetRoomTemperature){
|
||||||
|
qCDebug(dcMTec()) << thing << "Target room temperature" << targetRoomTemperature << "°C";
|
||||||
|
thing->setStateValue(mtecTargetTemperatureStateTypeId, targetRoomTemperature);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(mtec, &MTec::waterTankTopTemperatureChanged, thing, [=](double waterTankTopTemperature){
|
||||||
|
qCDebug(dcMTec()) << thing << "Water tank top temperature" << waterTankTopTemperature << "°C";
|
||||||
|
thing->setStateValue(mtecWaterTankTopTemperatureStateTypeId, waterTankTopTemperature);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(mtec, &MTec::bufferTankTemperatureChanged, thing, [=](double bufferTankTemperature){
|
connect(mtec, &MTec::bufferTankTemperatureChanged, thing, [=](double bufferTankTemperature){
|
||||||
@ -116,8 +126,13 @@ void IntegrationPluginMTec::setupThing(ThingSetupInfo *info)
|
|||||||
thing->setStateValue(mtecBufferTankTemperatureStateTypeId, bufferTankTemperature);
|
thing->setStateValue(mtecBufferTankTemperatureStateTypeId, bufferTankTemperature);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(mtec, &MTec::totalAccumulatedHeatingEnergyChanged, thing, [=](double totalAccumulatedHeatingEnergy){
|
||||||
|
qCDebug(dcMTec()) << thing << "Total accumulated heating energy" << totalAccumulatedHeatingEnergy << "kWh";
|
||||||
|
thing->setStateValue(mtecTotalAccumulatedHeatingEnergyStateTypeId, totalAccumulatedHeatingEnergy);
|
||||||
|
});
|
||||||
|
|
||||||
connect(mtec, &MTec::totalAccumulatedElectricalEnergyChanged, thing, [=](double totalAccumulatedElectricalEnergy){
|
connect(mtec, &MTec::totalAccumulatedElectricalEnergyChanged, thing, [=](double totalAccumulatedElectricalEnergy){
|
||||||
qCDebug(dcMTec()) << thing << "Total accumulated energy" << totalAccumulatedElectricalEnergy << "kWh";
|
qCDebug(dcMTec()) << thing << "Total accumulated electrical energy" << totalAccumulatedElectricalEnergy << "kWh";
|
||||||
thing->setStateValue(mtecTotalAccumulatedElectricalEnergyStateTypeId, totalAccumulatedElectricalEnergy);
|
thing->setStateValue(mtecTotalAccumulatedElectricalEnergyStateTypeId, totalAccumulatedElectricalEnergy);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -126,27 +141,43 @@ void IntegrationPluginMTec::setupThing(ThingSetupInfo *info)
|
|||||||
switch (heatPumpState) {
|
switch (heatPumpState) {
|
||||||
case MTec::HeatpumpStateStandby:
|
case MTec::HeatpumpStateStandby:
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Standby");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Standby");
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStatePreRun:
|
case MTec::HeatpumpStatePreRun:
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Pre run");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Pre run");
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStateAutomaticHeat:
|
case MTec::HeatpumpStateAutomaticHeat:
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Automatic heat");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Automatic heat");
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, true);
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStateDefrost:
|
case MTec::HeatpumpStateDefrost:
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Defrost");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Defrost");
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStateAutomaticCool:
|
case MTec::HeatpumpStateAutomaticCool:
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Automatic cool");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Automatic cool");
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, true);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStatePostRun:
|
case MTec::HeatpumpStatePostRun:
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Post run");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Post run");
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStateSaftyShutdown:
|
case MTec::HeatpumpStateSaftyShutdown:
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Safty shutdown");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Safty shutdown");
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
case MTec::HeatpumpStateError:
|
case MTec::HeatpumpStateError:
|
||||||
|
thing->setStateValue(mtecHeatingOnStateTypeId, false);
|
||||||
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Error");
|
thing->setStateValue(mtecHeatPumpStateStateTypeId, "Error");
|
||||||
|
thing->setStateValue(mtecCoolingOnStateTypeId, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -166,6 +197,11 @@ void IntegrationPluginMTec::setupThing(ThingSetupInfo *info)
|
|||||||
thing->setStateValue(mtecSmartHomeEnergyStateTypeId, actualExcessEnergySmartHome);
|
thing->setStateValue(mtecSmartHomeEnergyStateTypeId, actualExcessEnergySmartHome);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(mtec, &MTec::actualExcessEnergySmartHomeElectricityMeterChanged, thing, [=](double actualExcessEnergySmartHomeElectricityMeter){
|
||||||
|
qCDebug(dcMTec()) << thing << "Smart home energy electrical meter" << actualExcessEnergySmartHomeElectricityMeter << "W";
|
||||||
|
thing->setStateValue(mtecSmartHomeEnergyElectricityMeterStateTypeId, actualExcessEnergySmartHomeElectricityMeter);
|
||||||
|
});
|
||||||
|
|
||||||
connect(mtec, &MTec::actualOutdoorTemperatureChanged, thing, [=](double actualOutdoorTemperature){
|
connect(mtec, &MTec::actualOutdoorTemperatureChanged, thing, [=](double actualOutdoorTemperature){
|
||||||
qCDebug(dcMTec()) << thing << "Outdoor temperature" << actualOutdoorTemperature << "°C";
|
qCDebug(dcMTec()) << thing << "Outdoor temperature" << actualOutdoorTemperature << "°C";
|
||||||
thing->setStateValue(mtecOutdoorTemperatureStateTypeId, actualOutdoorTemperature);
|
thing->setStateValue(mtecOutdoorTemperatureStateTypeId, actualOutdoorTemperature);
|
||||||
@ -221,9 +257,76 @@ void IntegrationPluginMTec::thingRemoved(Thing *thing)
|
|||||||
|
|
||||||
void IntegrationPluginMTec::executeAction(ThingActionInfo *info)
|
void IntegrationPluginMTec::executeAction(ThingActionInfo *info)
|
||||||
{
|
{
|
||||||
// Thing *thing = info->thing();
|
Thing *thing = info->thing();
|
||||||
// Action action = info->action();
|
Action action = info->action();
|
||||||
info->finish(Thing::ThingErrorNoError);
|
|
||||||
|
MTec *mtec = m_mtecConnections.value(thing);
|
||||||
|
if (!mtec) {
|
||||||
|
qCWarning(dcMTec()) << "Could not execute action because the MTec connection could not be found for" << thing;
|
||||||
|
info->finish(Thing::ThingErrorHardwareNotAvailable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we are connected
|
||||||
|
if (!mtec->connected()) {
|
||||||
|
qCWarning(dcMTec()) << "Could not execute action because the MTec connection is not connected" << thing;
|
||||||
|
info->finish(Thing::ThingErrorHardwareNotAvailable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (action.actionTypeId() == mtecTargetTemperatureActionTypeId) {
|
||||||
|
double targetTemperature = action.paramValue(mtecTargetTemperatureActionTargetTemperatureParamTypeId).toDouble();
|
||||||
|
qCDebug(dcMTec()) << "Setting target temperature" << targetTemperature << "°C";
|
||||||
|
QModbusReply *reply = mtec->setTargetRoomTemperature(targetTemperature);
|
||||||
|
if (!reply) {
|
||||||
|
qCWarning(dcMTec()) << "Failed to send modbus request" << thing;
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::finished, this, [=]() {
|
||||||
|
reply->deleteLater();
|
||||||
|
if (reply->error() == QModbusDevice::NoError) {
|
||||||
|
qCDebug(dcMTec()) << "Setting target temperature" << targetTemperature << "°C" << "finished successfully";
|
||||||
|
info->finish(Thing::ThingErrorNoError);
|
||||||
|
} else {
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::errorOccurred, this, [=](QModbusDevice::Error error) {
|
||||||
|
qCWarning(dcMTec()) << thing << "Action execution finished due to modbus replay error:" << error;
|
||||||
|
reply->deleteLater();
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
});
|
||||||
|
} else if (action.actionTypeId() == mtecSmartHomeEnergyActionTypeId) {
|
||||||
|
quint16 energy = action.paramValue(mtecSmartHomeEnergyActionSmartHomeEnergyParamTypeId).toUInt();
|
||||||
|
qCDebug(dcMTec()) << "Setting smart home energy to" << energy << "W";
|
||||||
|
QModbusReply *reply = mtec->setSmartHomeEnergy(energy);
|
||||||
|
if (!reply) {
|
||||||
|
qCWarning(dcMTec()) << "Failed to send modbus request" << thing;
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::finished, this, [=]() {
|
||||||
|
reply->deleteLater();
|
||||||
|
if (reply->error() == QModbusDevice::NoError) {
|
||||||
|
qCDebug(dcMTec()) << "Setting smart home energy" << energy << "W" << "finished successfully";
|
||||||
|
info->finish(Thing::ThingErrorNoError);
|
||||||
|
} else {
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::errorOccurred, this, [=](QModbusDevice::Error error) {
|
||||||
|
qCWarning(dcMTec()) << thing << "Action execution finished due to modbus replay error:" << error;
|
||||||
|
reply->deleteLater();
|
||||||
|
info->finish(Thing::ThingErrorHardwareFailure);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Q_ASSERT_X(false, "executeAction", QString("Unhandled action: %1").arg(action.actionTypeId().toString()).toUtf8());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IntegrationPluginMTec::update(Thing *thing)
|
void IntegrationPluginMTec::update(Thing *thing)
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
"displayName": "MTec",
|
"displayName": "MTec",
|
||||||
"id": "451e38d8-50d5-4ae9-8d9f-21af9347128d",
|
"id": "451e38d8-50d5-4ae9-8d9f-21af9347128d",
|
||||||
"createMethods": ["discovery", "user"],
|
"createMethods": ["discovery", "user"],
|
||||||
"interfaces": ["connectable"],
|
"interfaces": ["thermostat", "connectable"],
|
||||||
"paramTypes": [
|
"paramTypes": [
|
||||||
{
|
{
|
||||||
"id": "f1c43b1e-cffe-4d30-bda0-c23ed648dd71",
|
"id": "f1c43b1e-cffe-4d30-bda0-c23ed648dd71",
|
||||||
@ -41,43 +41,6 @@
|
|||||||
"type": "bool",
|
"type": "bool",
|
||||||
"defaultValue": false,
|
"defaultValue": false,
|
||||||
"cached": false
|
"cached": false
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "545f94d6-f4fd-48fe-bf3b-f193e5cb76e7",
|
|
||||||
"name": "waterTankTemperature",
|
|
||||||
"displayName": "Water tank temperature",
|
|
||||||
"displayNameEvent": "Water tank temperature changed",
|
|
||||||
"unit": "DegreeCelsius",
|
|
||||||
"type": "double",
|
|
||||||
"defaultValue": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "a98e37f8-dcdc-4c4c-aecf-07f376321849",
|
|
||||||
"name": "bufferTankTemperature",
|
|
||||||
"displayName": "Buffer tank temperature",
|
|
||||||
"displayNameEvent": "Buffer tank temperature changed",
|
|
||||||
"unit": "DegreeCelsius",
|
|
||||||
"type": "double",
|
|
||||||
"defaultValue": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "d0c8f168-49b5-47ca-9988-c9922be38dd5",
|
|
||||||
"name": "outdoorTemperature",
|
|
||||||
"displayName": "Outdoor temperature",
|
|
||||||
"displayNameEvent": "Outdoor temperature changed",
|
|
||||||
"unit": "DegreeCelsius",
|
|
||||||
"type": "double",
|
|
||||||
"defaultValue": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "c67c79cf-7369-409f-b170-16c4ece9d25a",
|
|
||||||
"name": "totalAccumulatedElectricalEnergy",
|
|
||||||
"displayName": "Total accumulated electrical energy",
|
|
||||||
"displayNameEvent": "Total accumulated electrical energy changed",
|
|
||||||
"type": "double",
|
|
||||||
"unit": "KiloWattHour",
|
|
||||||
"defaultValue": 0,
|
|
||||||
"suggestLogging": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "1e2037c8-09dc-4396-974c-efa9c486aa65",
|
"id": "1e2037c8-09dc-4396-974c-efa9c486aa65",
|
||||||
@ -98,6 +61,91 @@
|
|||||||
"defaultValue": "Standby",
|
"defaultValue": "Standby",
|
||||||
"suggestLogging": true
|
"suggestLogging": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "9b538cb9-f7a3-471e-8d3b-09f6370a571c",
|
||||||
|
"name": "targetTemperature",
|
||||||
|
"displayName": "Target room temperature (heat circuit 0)",
|
||||||
|
"displayNameEvent": "Target room temperature changed (heat circuit 0=",
|
||||||
|
"displayNameAction": "Set target room temperature (heat circuit 0)",
|
||||||
|
"unit": "DegreeCelsius",
|
||||||
|
"type": "double",
|
||||||
|
"writable": true,
|
||||||
|
"minValue": 10,
|
||||||
|
"maxValue": 30,
|
||||||
|
"defaultValue": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b22ac9bb-3842-497c-bd93-f8bea6670e32",
|
||||||
|
"name": "temperature",
|
||||||
|
"displayName": "Room temperature heat circuit 0",
|
||||||
|
"displayNameEvent": "Room temperature heat circuit 0 changed",
|
||||||
|
"unit": "DegreeCelsius",
|
||||||
|
"type": "double",
|
||||||
|
"defaultValue": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "07465fbb-6949-4bd1-90d5-acf2d80c161d",
|
||||||
|
"name": "heatingOn",
|
||||||
|
"displayName": "Heating on",
|
||||||
|
"displayNameEvent": "Heating turned on/off",
|
||||||
|
"type": "bool",
|
||||||
|
"defaultValue": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8b407c1d-b84f-48d4-9961-b29bc58fff0e",
|
||||||
|
"name": "coolingOn",
|
||||||
|
"displayName": "Cooling on",
|
||||||
|
"displayNameEvent": "Cooling turned on/off",
|
||||||
|
"type": "bool",
|
||||||
|
"defaultValue": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d0c8f168-49b5-47ca-9988-c9922be38dd5",
|
||||||
|
"name": "outdoorTemperature",
|
||||||
|
"displayName": "Outdoor temperature",
|
||||||
|
"displayNameEvent": "Outdoor temperature changed",
|
||||||
|
"unit": "DegreeCelsius",
|
||||||
|
"type": "double",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "545f94d6-f4fd-48fe-bf3b-f193e5cb76e7",
|
||||||
|
"name": "waterTankTopTemperature",
|
||||||
|
"displayName": "Water tank top temperature",
|
||||||
|
"displayNameEvent": "Water tank top temperature changed",
|
||||||
|
"unit": "DegreeCelsius",
|
||||||
|
"type": "double",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a98e37f8-dcdc-4c4c-aecf-07f376321849",
|
||||||
|
"name": "bufferTankTemperature",
|
||||||
|
"displayName": "Buffer tank temperature",
|
||||||
|
"displayNameEvent": "Buffer tank temperature changed",
|
||||||
|
"unit": "DegreeCelsius",
|
||||||
|
"type": "double",
|
||||||
|
"defaultValue": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7d087af8-cdbe-463e-a9bb-7a7a79471963",
|
||||||
|
"name": "totalAccumulatedHeatingEnergy",
|
||||||
|
"displayName": "Total accumulated heating energy",
|
||||||
|
"displayNameEvent": "Total accumulated heating energy changed",
|
||||||
|
"type": "double",
|
||||||
|
"unit": "KiloWattHour",
|
||||||
|
"defaultValue": 0,
|
||||||
|
"suggestLogging": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c67c79cf-7369-409f-b170-16c4ece9d25a",
|
||||||
|
"name": "totalAccumulatedElectricalEnergy",
|
||||||
|
"displayName": "Total accumulated electrical energy",
|
||||||
|
"displayNameEvent": "Total accumulated electrical energy changed",
|
||||||
|
"type": "double",
|
||||||
|
"unit": "KiloWattHour",
|
||||||
|
"defaultValue": 0,
|
||||||
|
"suggestLogging": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "581abddc-90d6-4dea-a43c-63b117b335fe",
|
"id": "581abddc-90d6-4dea-a43c-63b117b335fe",
|
||||||
"name": "heatMeterPowerConsumption",
|
"name": "heatMeterPowerConsumption",
|
||||||
@ -123,14 +171,27 @@
|
|||||||
"name": "smartHomeEnergy",
|
"name": "smartHomeEnergy",
|
||||||
"displayName": "Smart home energy",
|
"displayName": "Smart home energy",
|
||||||
"displayNameEvent": "Smart home energy changed",
|
"displayNameEvent": "Smart home energy changed",
|
||||||
|
"displayNameAction": "Set smart home energy",
|
||||||
|
"type": "uint",
|
||||||
|
"unit": "Watt",
|
||||||
|
"minValue": 0,
|
||||||
|
"maxValue": 20000,
|
||||||
|
"defaultValue": 0,
|
||||||
|
"writable": true,
|
||||||
|
"suggestLogging": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a7734474-30db-435c-985a-105fb3ea5a86",
|
||||||
|
"name": "smartHomeEnergyElectricityMeter",
|
||||||
|
"displayName": "Smart home energy consumed",
|
||||||
|
"displayNameEvent": "Smart home energy consumed changed",
|
||||||
"type": "double",
|
"type": "double",
|
||||||
"unit": "Watt",
|
"unit": "Watt",
|
||||||
"defaultValue": 0,
|
"defaultValue": 0,
|
||||||
"suggestLogging": true
|
"suggestLogging": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"actionTypes": [
|
"actionTypes": [ ]
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,6 +51,37 @@ MTec::~MTec()
|
|||||||
m_modbusMaster->disconnectDevice();
|
m_modbusMaster->disconnectDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHostAddress MTec::hostAddress() const
|
||||||
|
{
|
||||||
|
return m_hostAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MTec::connected() const
|
||||||
|
{
|
||||||
|
return m_modbusMaster->connected();
|
||||||
|
}
|
||||||
|
|
||||||
|
QModbusReply *MTec::setTargetRoomTemperature(double targetRoomTemperature)
|
||||||
|
{
|
||||||
|
QVector<quint16> values;
|
||||||
|
values << static_cast<quint16>(qRound(targetRoomTemperature * 10));
|
||||||
|
|
||||||
|
QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, RegisterTargetRoomTemperature, values.length());
|
||||||
|
request.setValues(values);
|
||||||
|
QModbusReply *reply = m_modbusMaster->sendWriteRequest(request, MTec::ModbusUnitID);
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
QModbusReply *MTec::setSmartHomeEnergy(quint16 smartHomeEnergy)
|
||||||
|
{
|
||||||
|
QVector<quint16> values;
|
||||||
|
values << smartHomeEnergy;
|
||||||
|
QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, RegisterActualExcessEnergySmartHome, values.length());
|
||||||
|
request.setValues(values);
|
||||||
|
QModbusReply *reply = m_modbusMaster->sendWriteRequest(request, MTec::ModbusUnitID);
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
bool MTec::connectDevice()
|
bool MTec::connectDevice()
|
||||||
{
|
{
|
||||||
return m_modbusMaster->connectDevice();
|
return m_modbusMaster->connectDevice();
|
||||||
@ -67,7 +98,7 @@ void MTec::updateValues()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterHotWaterTankTemperature, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterRoomTemperature, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MTec::onModbusError()
|
void MTec::onModbusError()
|
||||||
@ -80,10 +111,24 @@ void MTec::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const
|
|||||||
Q_UNUSED(slaveAddress);
|
Q_UNUSED(slaveAddress);
|
||||||
|
|
||||||
switch (modbusRegister) {
|
switch (modbusRegister) {
|
||||||
|
case RegisterRoomTemperature:
|
||||||
|
if (value.length() == 1) {
|
||||||
|
m_roomTemperature = value[0] / 10.0;
|
||||||
|
emit roomTemperatureChanged(m_roomTemperature);
|
||||||
|
}
|
||||||
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterTargetRoomTemperature, 1);
|
||||||
|
break;
|
||||||
|
case RegisterTargetRoomTemperature:
|
||||||
|
if (value.length() == 1) {
|
||||||
|
m_targetRoomTemperature = value[0] / 10.0;
|
||||||
|
emit targetRoomTemperatureChanged(m_targetRoomTemperature);
|
||||||
|
}
|
||||||
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterHotWaterTankTemperature, 1);
|
||||||
|
break;
|
||||||
case RegisterHotWaterTankTemperature:
|
case RegisterHotWaterTankTemperature:
|
||||||
if (value.length() == 1) {
|
if (value.length() == 1) {
|
||||||
m_waterTankTemperature = value[0] / 10.0;
|
m_waterTankTopTemperature = value[0] / 10.0;
|
||||||
emit waterTankTemperatureChanged(m_waterTankTemperature);
|
emit waterTankTopTemperatureChanged(m_waterTankTopTemperature);
|
||||||
}
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterBufferTankTemperature, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterBufferTankTemperature, 1);
|
||||||
break;
|
break;
|
||||||
@ -92,11 +137,18 @@ void MTec::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const
|
|||||||
m_bufferTankTemperature = value[0] / 10.0;
|
m_bufferTankTemperature = value[0] / 10.0;
|
||||||
emit bufferTankTemperatureChanged(m_bufferTankTemperature);
|
emit bufferTankTemperatureChanged(m_bufferTankTemperature);
|
||||||
}
|
}
|
||||||
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterTotalAccumulatedHeatingEnergy, 1);
|
||||||
|
break;
|
||||||
|
case RegisterTotalAccumulatedHeatingEnergy:
|
||||||
|
if (value.length() == 1) {
|
||||||
|
m_totalAccumulatedElectricalEnergy = value[0];
|
||||||
|
emit totalAccumulatedElectricalEnergyChanged(m_totalAccumulatedElectricalEnergy);
|
||||||
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterTotalAccumulatedElectricalEnergy, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterTotalAccumulatedElectricalEnergy, 1);
|
||||||
break;
|
break;
|
||||||
case RegisterTotalAccumulatedElectricalEnergy:
|
case RegisterTotalAccumulatedElectricalEnergy:
|
||||||
if (value.length() == 1) {
|
if (value.length() == 1) {
|
||||||
m_totalAccumulatedElectricalEnergy = value[0] / 100.0;
|
m_totalAccumulatedElectricalEnergy = value[0];
|
||||||
emit totalAccumulatedElectricalEnergyChanged(m_totalAccumulatedElectricalEnergy);
|
emit totalAccumulatedElectricalEnergyChanged(m_totalAccumulatedElectricalEnergy);
|
||||||
}
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterHeatpumpState, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterHeatpumpState, 1);
|
||||||
@ -110,21 +162,28 @@ void MTec::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const
|
|||||||
break;
|
break;
|
||||||
case RegisterHeatMeterPowerConsumption:
|
case RegisterHeatMeterPowerConsumption:
|
||||||
if (value.length() == 1) {
|
if (value.length() == 1) {
|
||||||
m_heatMeterPowerConsumption = value[0] / 100.0;
|
m_heatMeterPowerConsumption = value[0];
|
||||||
emit heatMeterPowerConsumptionChanged(m_heatMeterPowerConsumption);
|
emit heatMeterPowerConsumptionChanged(m_heatMeterPowerConsumption);
|
||||||
}
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterEnergyMeterPowerConsumption, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterEnergyMeterPowerConsumption, 1);
|
||||||
break;
|
break;
|
||||||
case RegisterEnergyMeterPowerConsumption:
|
case RegisterEnergyMeterPowerConsumption:
|
||||||
if (value.length() == 1) {
|
if (value.length() == 1) {
|
||||||
m_energyMeterPowerConsumption = value[0] / 100.0;
|
m_energyMeterPowerConsumption = value[0];
|
||||||
emit energyMeterPowerConsumptionChanged(m_energyMeterPowerConsumption);
|
emit energyMeterPowerConsumptionChanged(m_energyMeterPowerConsumption);
|
||||||
}
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterActualExcessEnergySmartHome, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterActualExcessEnergySmartHome, 1);
|
||||||
break;
|
break;
|
||||||
case RegisterActualExcessEnergySmartHome:
|
case RegisterActualExcessEnergySmartHome:
|
||||||
if (value.length() == 1) {
|
if (value.length() == 1) {
|
||||||
m_actualExcessEnergySmartHome = value[0] / 100.0;
|
m_actualExcessEnergySmartHome = value[0];
|
||||||
|
emit actualExcessEnergySmartHomeChanged(m_actualExcessEnergySmartHome);
|
||||||
|
}
|
||||||
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterActualExcessEnergySmartHomeElectricityMeter, 1);
|
||||||
|
break;
|
||||||
|
case RegisterActualExcessEnergySmartHomeElectricityMeter:
|
||||||
|
if (value.length() == 1) {
|
||||||
|
m_actualExcessEnergySmartHomeElectricityMeter = value[0];
|
||||||
emit actualExcessEnergySmartHomeChanged(m_actualExcessEnergySmartHome);
|
emit actualExcessEnergySmartHomeChanged(m_actualExcessEnergySmartHome);
|
||||||
}
|
}
|
||||||
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterActualOutdoorTemperature, 1);
|
m_modbusMaster->readHoldingRegister(MTec::ModbusUnitID, RegisterActualOutdoorTemperature, 1);
|
||||||
|
|||||||
51
mtec/mtec.h
51
mtec/mtec.h
@ -55,8 +55,13 @@ public:
|
|||||||
explicit MTec(const QHostAddress &address, QObject *parent = nullptr);
|
explicit MTec(const QHostAddress &address, QObject *parent = nullptr);
|
||||||
~MTec();
|
~MTec();
|
||||||
|
|
||||||
inline QHostAddress hostAddress() const { return m_hostAddress; };
|
QHostAddress hostAddress() const;
|
||||||
|
bool connected() const;
|
||||||
|
|
||||||
|
QModbusReply *setTargetRoomTemperature(double targetRoomTemperature);
|
||||||
|
QModbusReply *setSmartHomeEnergy(quint16 smartHomeEnergy);
|
||||||
|
|
||||||
|
public slots:
|
||||||
bool connectDevice();
|
bool connectDevice();
|
||||||
void disconnectDevice();
|
void disconnectDevice();
|
||||||
|
|
||||||
@ -68,34 +73,50 @@ private:
|
|||||||
|
|
||||||
/** The following modbus addresses can be read: */
|
/** The following modbus addresses can be read: */
|
||||||
enum Register {
|
enum Register {
|
||||||
/* APPL.CtrlAppl.sParam.hotWaterTank[0].topTemp.values.actValue
|
/* R APPL.CtrlAppl.sParam.heatCircuit[0].tempRoom.values.actValue
|
||||||
|
* Actual room temperature [1/10°C]. */
|
||||||
|
RegisterRoomTemperature = 1,
|
||||||
|
|
||||||
|
/* RW APPL.CtrlAppl.sParam.heatCircuit[0].param.normalSetTemp
|
||||||
|
* Room set temperature for heating circuit [1/10°C]. */
|
||||||
|
RegisterTargetRoomTemperature = 4,
|
||||||
|
|
||||||
|
/* R APPL.CtrlAppl.sParam.hotWaterTank[0].topTemp.values.actValue
|
||||||
* Hot water tank top temperature [1/10°C]. */
|
* Hot water tank top temperature [1/10°C]. */
|
||||||
RegisterHotWaterTankTemperature = 401,
|
RegisterHotWaterTankTemperature = 401,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sParam.bufferTank[0].topTemp.values.actValue
|
/* R APPL.CtrlAppl.sParam.bufferTank[0].topTemp.values.actValue
|
||||||
* Buffer Actual top temperature [1/10°C]. */
|
* Buffer Actual top temperature [1/10°C]. */
|
||||||
RegisterBufferTankTemperature = 601,
|
RegisterBufferTankTemperature = 601,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sStatisticalData.heatpump[0].consumption.electricalenergy
|
/* R APPL.CtrlAppl.sStatisticalData.heatpump[0].consumption.energy
|
||||||
|
* Total accumulated heating energy [kWh] */
|
||||||
|
RegisterTotalAccumulatedHeatingEnergy = 701,
|
||||||
|
|
||||||
|
/* R APPL.CtrlAppl.sStatisticalData.heatpump[0].consumption.electricalenergy
|
||||||
* Total accumulated electrical energy [kWh] */
|
* Total accumulated electrical energy [kWh] */
|
||||||
RegisterTotalAccumulatedElectricalEnergy = 702,
|
RegisterTotalAccumulatedElectricalEnergy = 702,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sParam.heatpump[0].values.heatpumpState */
|
/* R APPL.CtrlAppl.sParam.heatpump[0].values.heatpumpState */
|
||||||
RegisterHeatpumpState = 703,
|
RegisterHeatpumpState = 703,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sParam.heatpump[0].HeatMeter.values.power
|
/* R APPL.CtrlAppl.sParam.heatpump[0].HeatMeter.values.power
|
||||||
* Actual power consumtion [W] */
|
* Actual power consumtion [W] */
|
||||||
RegisterHeatMeterPowerConsumption = 706,
|
RegisterHeatMeterPowerConsumption = 706,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sParam.heatpump[0].ElectricEnergyMeter.values.power
|
/* R APPL.CtrlAppl.sParam.heatpump[0].ElectricEnergyMeter.values.power
|
||||||
* Actual power consumtion [W] */
|
* Actual power consumtion [W] */
|
||||||
RegisterEnergyMeterPowerConsumption = 707,
|
RegisterEnergyMeterPowerConsumption = 707,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sIOModule.Virt[0].param.sensor[0]
|
/* RW APPL.CtrlAppl.sIOModule.Virt[0].param.sensor[0]
|
||||||
* Acutal excess energy given from Smart home System [W] */
|
* Acutal excess energy given from Smart home System [W] */
|
||||||
RegisterActualExcessEnergySmartHome = 1000,
|
RegisterActualExcessEnergySmartHome = 1000,
|
||||||
|
|
||||||
/* APPL.CtrlAppl.sParam.outdoorTemp.values.actValue
|
/* R APPL.CtrlAppl.sParam.photovoltaics.ElectricEnergyMeter.values.power
|
||||||
|
* Acutal excess energy given from Electricity Meter [W] */
|
||||||
|
RegisterActualExcessEnergySmartHomeElectricityMeter = 1002,
|
||||||
|
|
||||||
|
/* R APPL.CtrlAppl.sParam.outdoorTemp.values.actValue
|
||||||
* Actual exterior temperature [°C] */
|
* Actual exterior temperature [°C] */
|
||||||
RegisterActualOutdoorTemperature = 1502,
|
RegisterActualOutdoorTemperature = 1502,
|
||||||
|
|
||||||
@ -104,25 +125,33 @@ private:
|
|||||||
QHostAddress m_hostAddress;
|
QHostAddress m_hostAddress;
|
||||||
ModbusTCPMaster *m_modbusMaster = nullptr;
|
ModbusTCPMaster *m_modbusMaster = nullptr;
|
||||||
|
|
||||||
double m_waterTankTemperature = 0;
|
double m_roomTemperature = 0;
|
||||||
|
double m_targetRoomTemperature = 0;
|
||||||
|
double m_waterTankTopTemperature = 0;
|
||||||
double m_bufferTankTemperature = 0;
|
double m_bufferTankTemperature = 0;
|
||||||
|
double m_totalAccumulatedHeatingEnergy = 0;
|
||||||
double m_totalAccumulatedElectricalEnergy = 0;
|
double m_totalAccumulatedElectricalEnergy = 0;
|
||||||
HeatpumpState m_heatPumpState = HeatpumpStateStandby;
|
HeatpumpState m_heatPumpState = HeatpumpStateStandby;
|
||||||
double m_heatMeterPowerConsumption = 0;
|
double m_heatMeterPowerConsumption = 0;
|
||||||
double m_energyMeterPowerConsumption = 0;
|
double m_energyMeterPowerConsumption = 0;
|
||||||
double m_actualExcessEnergySmartHome = 0;
|
double m_actualExcessEnergySmartHome = 0;
|
||||||
|
double m_actualExcessEnergySmartHomeElectricityMeter = 0;
|
||||||
double m_actualOutdoorTemperature = 0;
|
double m_actualOutdoorTemperature = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void connectedChanged(bool connected);
|
void connectedChanged(bool connected);
|
||||||
|
|
||||||
void waterTankTemperatureChanged(double waterTankTemperature);
|
void roomTemperatureChanged(double roomTemperature);
|
||||||
|
void targetRoomTemperatureChanged(double targetRoomTemperature);
|
||||||
|
void waterTankTopTemperatureChanged(double waterTankTopTemperature);
|
||||||
void bufferTankTemperatureChanged(double bufferTankTemperature);
|
void bufferTankTemperatureChanged(double bufferTankTemperature);
|
||||||
|
void totalAccumulatedHeatingEnergyChanged(double totalAccumulatedHeatingEnergy);
|
||||||
void totalAccumulatedElectricalEnergyChanged(double totalAccumulatedElectricalEnergy);
|
void totalAccumulatedElectricalEnergyChanged(double totalAccumulatedElectricalEnergy);
|
||||||
void heatPumpStateChanged(HeatpumpState heatPumpState);
|
void heatPumpStateChanged(HeatpumpState heatPumpState);
|
||||||
void heatMeterPowerConsumptionChanged(double heatMeterPowerConsumption);
|
void heatMeterPowerConsumptionChanged(double heatMeterPowerConsumption);
|
||||||
void energyMeterPowerConsumptionChanged(double energyMeterPowerConsumption);
|
void energyMeterPowerConsumptionChanged(double energyMeterPowerConsumption);
|
||||||
void actualExcessEnergySmartHomeChanged(double actualExcessEnergySmartHome);
|
void actualExcessEnergySmartHomeChanged(double actualExcessEnergySmartHome);
|
||||||
|
void actualExcessEnergySmartHomeElectricityMeterChanged(double actualExcessEnergySmartHomeElectricityMeter);
|
||||||
void actualOutdoorTemperatureChanged(double actualOutdoorTemperature);
|
void actualOutdoorTemperatureChanged(double actualOutdoorTemperature);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|||||||
Reference in New Issue
Block a user