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();
|
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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue