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();
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) {
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);
break;
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]);
}
/* Everything read without an error
* -> set connected to true */
m_info->m_connected = true;
emit statusUpdated(m_info);
break;
}
}
void Idm::onModbusError()
{
if (m_info == nullptr) {
m_info = new IdmInfo;
}
m_info->m_connected = false;
emit statusUpdated(m_info);
}
void Idm::onRequestStatus()
{
m_info = new IdmInfo;

View File

@ -103,7 +103,7 @@ private:
HeatPumpOperatingMode = 1090, // Betriebsart Wärmepumpe
SummationFaultHeatPump = 1099, // Summenstörung Wärepumpe
RoomTemperatureHKA = 1364, // Heizkreis A Raumtemperature (B61)
Humiditysensor = 1392, // Feuchtesensor
HumiditySensor = 1392, // Feuchtesensor
RoomTemperatureTargetHeatingHKA = 1401, // Raumsolltemperatur Heizen Normal HK A
ExternalOutsideTemperature = 1690, // Externe Außentemperatur
ExternalHumidity = 1692, // Externe Feuchte
@ -155,6 +155,7 @@ signals:
void statusUpdated(IdmInfo *info);
public slots:
void onModbusError();
void onRequestStatus();
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.
*/
struct IdmInfo {
/** Set to true, if register values can be read,
* false in case of communication problems */
bool m_connected;
bool m_power;
/** RegisterList::OutsideTemperature */
@ -56,6 +59,9 @@ struct IdmInfo {
/** RegisterList::TargetHotWaterTemperature */
double m_targetWaterTemperature;
/** RegisterList::HumiditySensor */
double m_humidity;
/** RegisterList::OperationModeSystem */
QString m_mode;

View File

@ -13,7 +13,7 @@
"displayName": "Navigator 2.0",
"id": "1c95ac91-4eca-4cbf-b0f4-d60d35d069ed",
"createMethods": ["User","Discovery"],
"interfaces": ["heating", "temperaturesensor", "connectable"],
"interfaces": ["thermostat", "temperaturesensor", "humiditysensor", "connectable"],
"paramTypes": [
{
"id": "05714e5c-d66a-4095-bbff-a0eb96fb035b",
@ -69,6 +69,15 @@
"unit": "DegreeCelsius",
"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",
"name": "targetTemperature",

View File

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

View File

@ -82,6 +82,7 @@ signals:
void writeRequestExecuted(const QUuid &requestId, bool success);
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 receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector<quint16> &values);