diff --git a/idm/idm.cpp b/idm/idm.cpp index a948bfd..3c5f7ee 100644 --- a/idm/idm.cpp +++ b/idm/idm.cpp @@ -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; diff --git a/idm/idm.h b/idm/idm.h index 152acc5..4832eb0 100644 --- a/idm/idm.h +++ b/idm/idm.h @@ -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 &value); }; diff --git a/idm/idminfo.h b/idm/idminfo.h index e43438f..7b51380 100644 --- a/idm/idminfo.h +++ b/idm/idminfo.h @@ -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; diff --git a/idm/integrationpluginidm.json b/idm/integrationpluginidm.json index edc139d..69a4715 100644 --- a/idm/integrationpluginidm.json +++ b/idm/integrationpluginidm.json @@ -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", diff --git a/modbus/modbustcpmaster.cpp b/modbus/modbustcpmaster.cpp index 88eacb7..3220842 100644 --- a/modbus/modbustcpmaster.cpp +++ b/modbus/modbustcpmaster.cpp @@ -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 &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(); }); diff --git a/modbus/modbustcpmaster.h b/modbus/modbustcpmaster.h index 86aa28c..bede700 100644 --- a/modbus/modbustcpmaster.h +++ b/modbus/modbustcpmaster.h @@ -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 &values); void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector &values);