Added humidity and connected state
ModbusTCPMaster now emits readRequestError and writeRequestError, which trigger connected = false.master
parent
ad70d1d254
commit
375b7a9d5d
22
idm/idm.cpp
22
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue