Added humidity and connected state

ModbusTCPMaster now emits readRequestError and writeRequestError, which
trigger connected = false.
master
Hermann Detz 2020-10-16 15:27:47 +02:00 committed by Michael Zanetti
parent ad70d1d254
commit 375b7a9d5d
6 changed files with 50 additions and 10 deletions

View File

@ -43,6 +43,8 @@ Idm::Idm(const QHostAddress &address, QObject *parent) :
m_modbusMaster->connectDevice(); m_modbusMaster->connectDevice();
connect(m_modbusMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &Idm::onReceivedHoldingRegister); connect(m_modbusMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &Idm::onReceivedHoldingRegister);
connect(m_modbusMaster, &ModbusTCPMaster::readRequestError, this, &Idm::onModbusError);
connect(m_modbusMaster, &ModbusTCPMaster::writeRequestError, this, &Idm::onModbusError);
} }
} }
@ -90,6 +92,12 @@ void Idm::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const
if (value.length() == 1) { if (value.length() == 1) {
m_info->m_mode = heatPumpOperationModeToString((Idm::IdmHeatPumpMode)value[RegisterList::HeatPumpOperatingMode-modbusRegister]); m_info->m_mode = heatPumpOperationModeToString((Idm::IdmHeatPumpMode)value[RegisterList::HeatPumpOperatingMode-modbusRegister]);
} }
m_modbusMaster->readHoldingRegister(Idm::ModbusUnitID, Idm::HumiditySensor, 2);
break;
case Idm::HumiditySensor:
if (value.length() == 2) {
m_info->m_humidity = ModbusHelpers::convertRegisterToFloat(&value[RegisterList::HumiditySensor - modbusRegister]);
}
m_modbusMaster->readHoldingRegister(Idm::ModbusUnitID, Idm::RoomTemperatureHKA, 2); m_modbusMaster->readHoldingRegister(Idm::ModbusUnitID, Idm::RoomTemperatureHKA, 2);
break; break;
case Idm::RoomTemperatureHKA: case Idm::RoomTemperatureHKA:
@ -97,11 +105,25 @@ void Idm::onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const
m_info->m_roomTemperature = ModbusHelpers::convertRegisterToFloat(&value[RegisterList::ExternalOutsideTemperature - modbusRegister]); m_info->m_roomTemperature = ModbusHelpers::convertRegisterToFloat(&value[RegisterList::ExternalOutsideTemperature - modbusRegister]);
} }
/* Everything read without an error
* -> set connected to true */
m_info->m_connected = true;
emit statusUpdated(m_info); emit statusUpdated(m_info);
break; break;
} }
} }
void Idm::onModbusError()
{
if (m_info == nullptr) {
m_info = new IdmInfo;
}
m_info->m_connected = false;
emit statusUpdated(m_info);
}
void Idm::onRequestStatus() void Idm::onRequestStatus()
{ {
m_info = new IdmInfo; m_info = new IdmInfo;

View File

@ -103,7 +103,7 @@ private:
HeatPumpOperatingMode = 1090, // Betriebsart Wärmepumpe HeatPumpOperatingMode = 1090, // Betriebsart Wärmepumpe
SummationFaultHeatPump = 1099, // Summenstörung Wärepumpe SummationFaultHeatPump = 1099, // Summenstörung Wärepumpe
RoomTemperatureHKA = 1364, // Heizkreis A Raumtemperature (B61) RoomTemperatureHKA = 1364, // Heizkreis A Raumtemperature (B61)
Humiditysensor = 1392, // Feuchtesensor HumiditySensor = 1392, // Feuchtesensor
RoomTemperatureTargetHeatingHKA = 1401, // Raumsolltemperatur Heizen Normal HK A RoomTemperatureTargetHeatingHKA = 1401, // Raumsolltemperatur Heizen Normal HK A
ExternalOutsideTemperature = 1690, // Externe Außentemperatur ExternalOutsideTemperature = 1690, // Externe Außentemperatur
ExternalHumidity = 1692, // Externe Feuchte ExternalHumidity = 1692, // Externe Feuchte
@ -155,6 +155,7 @@ signals:
void statusUpdated(IdmInfo *info); void statusUpdated(IdmInfo *info);
public slots: public slots:
void onModbusError();
void onRequestStatus(); void onRequestStatus();
void onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const QVector<quint16> &value); void onReceivedHoldingRegister(int slaveAddress, int modbusRegister, const QVector<quint16> &value);
}; };

View File

@ -38,7 +38,10 @@
* and passed to the nymea framework within this plugin. * and passed to the nymea framework within this plugin.
*/ */
struct IdmInfo { struct IdmInfo {
/** Set to true, if register values can be read,
* false in case of communication problems */
bool m_connected; bool m_connected;
bool m_power; bool m_power;
/** RegisterList::OutsideTemperature */ /** RegisterList::OutsideTemperature */
@ -56,6 +59,9 @@ struct IdmInfo {
/** RegisterList::TargetHotWaterTemperature */ /** RegisterList::TargetHotWaterTemperature */
double m_targetWaterTemperature; double m_targetWaterTemperature;
/** RegisterList::HumiditySensor */
double m_humidity;
/** RegisterList::OperationModeSystem */ /** RegisterList::OperationModeSystem */
QString m_mode; QString m_mode;

View File

@ -13,7 +13,7 @@
"displayName": "Navigator 2.0", "displayName": "Navigator 2.0",
"id": "1c95ac91-4eca-4cbf-b0f4-d60d35d069ed", "id": "1c95ac91-4eca-4cbf-b0f4-d60d35d069ed",
"createMethods": ["User","Discovery"], "createMethods": ["User","Discovery"],
"interfaces": ["heating", "temperaturesensor", "connectable"], "interfaces": ["thermostat", "temperaturesensor", "humiditysensor", "connectable"],
"paramTypes": [ "paramTypes": [
{ {
"id": "05714e5c-d66a-4095-bbff-a0eb96fb035b", "id": "05714e5c-d66a-4095-bbff-a0eb96fb035b",
@ -69,6 +69,15 @@
"unit": "DegreeCelsius", "unit": "DegreeCelsius",
"defaultValue": 0 "defaultValue": 0
}, },
{
"id": "109b4189-491a-4498-8470-b52b1b434c71",
"name": "humidity",
"displayName": "Humidity",
"displayNameEvent": "Humidity changed",
"type": "double",
"minValue": 0,
"maxValue": 100
},
{ {
"id": "efae7493-68c3-4cb9-853c-81011bdf09ca", "id": "efae7493-68c3-4cb9-853c-81011bdf09ca",
"name": "targetTemperature", "name": "targetTemperature",

View File

@ -305,21 +305,22 @@ QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddre
connect(reply, &QModbusReply::finished, this, [reply, requestId, this] { connect(reply, &QModbusReply::finished, this, [reply, requestId, this] {
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
writeRequestExecuted(requestId, true); emit writeRequestExecuted(requestId, true);
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
uint modbusAddress = unit.startAddress(); uint modbusAddress = unit.startAddress();
emit receivedHoldingRegister(reply->serverAddress(), modbusAddress, unit.values()); emit receivedHoldingRegister(reply->serverAddress(), modbusAddress, unit.values());
} else { } else {
writeRequestExecuted(requestId, false); emit writeRequestExecuted(requestId, false);
qCWarning(dcModbusTCP()) << "Read response error:" << reply->error(); qCWarning(dcModbusTCP()) << "Read response error:" << reply->error();
emit readRequestError(requestId, reply->errorString());
} }
reply->deleteLater(); reply->deleteLater();
}); });
connect(reply, &QModbusReply::errorOccurred, this, [reply, requestId, this] (QModbusDevice::Error error){ connect(reply, &QModbusReply::errorOccurred, this, [reply, requestId, this] (QModbusDevice::Error error){
qCWarning(dcModbusTCP()) << "Modbus replay error:" << error; qCWarning(dcModbusTCP()) << "Modbus reply error:" << error;
emit writeRequestError(requestId, reply->errorString()); emit readRequestError(requestId, reply->errorString());
reply->finished(); // To make sure it will be deleted reply->finished(); // To make sure it will be deleted
}); });
QTimer::singleShot(2000, reply, &QModbusReply::deleteLater); QTimer::singleShot(2000, reply, &QModbusReply::deleteLater);
@ -355,14 +356,14 @@ QUuid ModbusTCPMaster::writeCoils(uint slaveAddress, uint registerAddress, const
connect(reply, &QModbusReply::finished, this, [reply, requestId, this] () { connect(reply, &QModbusReply::finished, this, [reply, requestId, this] () {
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
writeRequestExecuted(requestId, true); emit writeRequestExecuted(requestId, true);
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
uint modbusAddress = unit.startAddress(); uint modbusAddress = unit.startAddress();
emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values()); emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values());
} else { } else {
writeRequestExecuted(requestId, false); emit writeRequestExecuted(requestId, false);
qCWarning(dcModbusTCP()) << "Read response error:" << reply->error(); qCWarning(dcModbusTCP()) << "Write response error:" << reply->error();
} }
reply->deleteLater(); reply->deleteLater();
}); });

View File

@ -82,6 +82,7 @@ signals:
void writeRequestExecuted(const QUuid &requestId, bool success); void writeRequestExecuted(const QUuid &requestId, bool success);
void writeRequestError(const QUuid &requestId, const QString &error); void writeRequestError(const QUuid &requestId, const QString &error);
void readRequestError(const QUuid &requestId, const QString &error);
void receivedCoil(uint slaveAddress, uint modbusRegister, const QVector<quint16> &values); void receivedCoil(uint slaveAddress, uint modbusRegister, const QVector<quint16> &values);
void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector<quint16> &values); void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector<quint16> &values);