X2 only accepts read requests 2 registers long

master
trinnes 2023-01-27 20:16:33 +01:00
parent 4173d9bb4a
commit 4d3f24d203
1 changed files with 210 additions and 243 deletions

View File

@ -315,92 +315,21 @@ void IntegrationPluginDrexelUndWeiss::updateStates(Thing *thing)
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::BrauchwasserSolltermperatur);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::Auszenluft);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::Summenstoerung);
readX2Power(thing, modbus, slaveAddress);
readX2Energy(thing, modbus, slaveAddress);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::LeistungKompressor);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::LeistungWarmwasser);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::LeistungRaumheizung);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::LeistungLuftvorwaermung);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::EnergieKompressor);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::EnergieWarmwasser);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::EnergieRaumheizung);
readHoldingRegister(thing, modbus, slaveAddress, ModbusRegisterX2::EnergieLuftvorerwarrmung);
}
}
void IntegrationPluginDrexelUndWeiss::readX2Power(Thing *thing, ModbusRtuMaster *modbus, uint slaveAddress)
void IntegrationPluginDrexelUndWeiss::readHoldingRegister(Thing *thing, ModbusRtuMaster *modbus, uint slaveAddress, uint modbusRegister)
{
ModbusRtuReply *reply = modbus->readHoldingRegister(slaveAddress, ModbusRegisterX2::LeistungKompressor, 8);
connect(reply, &ModbusRtuReply::finished, reply, &ModbusRtuReply::deleteLater);
connect(reply, &ModbusRtuReply::finished, this, [reply, thing] {
if (reply->error() != ModbusRtuReply::Error::NoError) {
qCWarning(dcDrexelUndWeiss()) << "Modbus error" << reply->errorString();
return;
}
if (reply->result().length() != 8) {
return;
}
if (reply->registerAddress() != ModbusRegisterX2::LeistungKompressor) {
return;
}
//LeistungKompressor = 4000,
float value = (static_cast<uint32_t>(reply->result()[0])<<16 | reply->result()[1])/1000.00;
thing->setStateValue(x2wpPowerCompressorStateTypeId, value);
float totalPower = value;
//LeistungRaumheizung = 4002
value = (static_cast<uint32_t>(reply->result()[2])<<16 | reply->result()[3])/1000.00;
thing->setStateValue(x2wpPowerRoomHeatingStateTypeId, value);
//LeistungWarmwasser = 4004
value = (static_cast<uint32_t>(reply->result()[4])<<16 | reply->result()[5])/1000.00;
thing->setStateValue(x2wpPowerWaterHeatingStateTypeId, value);
//LeistungLuftvorerwarrmung = 4006
value = (static_cast<uint32_t>(reply->result()[6])<<16 | reply->result()[7])/1000.00;
thing->setStateValue(x2wpPowerAirPreheatingStateTypeId, value);
totalPower += value; //power compressor plus power air pre-heating
thing->setStateValue(x2wpCurrentPowerStateTypeId, totalPower);
});
}
void IntegrationPluginDrexelUndWeiss::readX2Energy(Thing *thing, ModbusRtuMaster *modbus, uint slaveAddress)
{
ModbusRtuReply *reply = modbus->readHoldingRegister(slaveAddress, ModbusRegisterX2::EnergieKompressor, 8);
connect(reply, &ModbusRtuReply::finished, reply, &ModbusRtuReply::deleteLater);
connect(reply, &ModbusRtuReply::finished, this, [reply, thing] {
if (reply->error() != ModbusRtuReply::Error::NoError) {
qCWarning(dcDrexelUndWeiss()) << "Modbus error" << reply->errorString();
return;
}
if (reply->result().length() != 8) {
return;
}
if (reply->registerAddress() != ModbusRegisterX2::EnergieKompressor) {
return;
}
//EnergieKompressor = 4500
float value = (static_cast<uint32_t>(reply->result()[0])<<16 | reply->result()[1])/1000.00;
thing->setStateValue(x2wpEnergyCompressorStateTypeId, value);
float totalEnergy = value;
//EnergieRaumheizung = 4502
value = (static_cast<uint32_t>(reply->result()[2])<<16 | reply->result()[3])/1000.00;
thing->setStateValue(x2wpEnergyRoomHeatingStateTypeId, value);
//EnergieWarmwasser = 4504
value = (static_cast<uint32_t>(reply->result()[4])<<16 | reply->result()[5])/1000.00;
thing->setStateValue(x2wpEnergyWaterHeatingStateTypeId, value);
//EnergieLuftvorerwarrmung = 4506
value = (static_cast<uint32_t>(reply->result()[6])<<16 | reply->result()[7])/1000.00;
thing->setStateValue(x2wpEnergyAirPreheatingStateTypeId, value);
totalEnergy += value; //energy compressor plus energy air pre-heating
thing->setStateValue(x2wpTotalEnergyConsumedStateTypeId, totalEnergy);
});
}
void IntegrationPluginDrexelUndWeiss::readHoldingRegister(Thing *thing, ModbusRtuMaster *modbus, uint slaveAddress, uint modbusRegister)
{
ModbusRtuReply *reply = modbus->readHoldingRegister(slaveAddress, modbusRegister); // min 2 registers must be read
ModbusRtuReply *reply = modbus->readHoldingRegister(slaveAddress, modbusRegister, 2); // min 2 registers must be read
connect(reply, &ModbusRtuReply::finished, reply, &ModbusRtuReply::deleteLater);
connect(reply, &ModbusRtuReply::finished, this, [reply, thing, this] {
if (reply->error() != ModbusRtuReply::Error::NoError) {
@ -551,6 +480,44 @@ void IntegrationPluginDrexelUndWeiss::readX2Energy(Thing *thing, ModbusRtuMaster
thing->setStateValue(x2wpErrorStateTypeId, "Supply air fan");
break;
case ModbusRegisterX2::LeistungKompressor:
thing->setStateValue(x2wpPowerCompressorStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::LeistungWarmwasser:
thing->setStateValue(x2wpPowerWaterHeatingStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::LeistungRaumheizung:
thing->setStateValue(x2wpPowerRoomHeatingStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::LeistungLuftvorwaermung: {
float power = value/1000.00;
thing->setStateValue(x2wpPowerAirPreheatingStateTypeId, power);
power += thing->stateValue(x2wpPowerCompressorStateTypeId).toFloat();
thing->setStateValue(x2wpCurrentPowerStateTypeId, power);
break;
}
case ModbusRegisterX2::EnergieKompressor:
thing->setStateValue(x2wpEnergyCompressorStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::EnergieWarmwasser:
thing->setStateValue(x2wpEnergyWaterHeatingStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::EnergieRaumheizung:
thing->setStateValue(x2wpEnergyRoomHeatingStateTypeId, value/1000.00);
break;
case ModbusRegisterX2::EnergieLuftvorerwarrmung: {
float energy = value/1000.00;
thing->setStateValue(x2wpEnergyAirPreheatingStateTypeId, energy);
energy += thing->stateValue(x2wpEnergyCompressorStateTypeId).toFloat();
thing->setStateValue(x2wpTotalEnergyConsumedStateTypeId, energy);
break;
}
default:
break;
}
@ -586,10 +553,10 @@ void IntegrationPluginDrexelUndWeiss::readX2Energy(Thing *thing, ModbusRtuMaster
}
}
});
}
}
VentilationMode IntegrationPluginDrexelUndWeiss::getVentilationModeFromString(const QString &modeString)
{
VentilationMode IntegrationPluginDrexelUndWeiss::getVentilationModeFromString(const QString &modeString)
{
if (modeString == "Manual level 0") {
return VentilationMode::ManuellStufe0;
} else if(modeString == "Manual level 1") {
@ -606,11 +573,11 @@ void IntegrationPluginDrexelUndWeiss::readX2Energy(Thing *thing, ModbusRtuMaster
qCWarning(dcDrexelUndWeiss()) << "Unknown ventilation mode string" << modeString;
}
return VentilationMode::ManuellStufe0;
}
}
void IntegrationPluginDrexelUndWeiss::onPluginConfigurationChanged(const ParamTypeId &paramTypeId, const QVariant &value)
{
void IntegrationPluginDrexelUndWeiss::onPluginConfigurationChanged(const ParamTypeId &paramTypeId, const QVariant &value)
{
// Check refresh schedule
if (paramTypeId == drexelUndWeissPluginUpdateIntervalParamTypeId) {
if (m_refreshTimer) {
@ -619,13 +586,13 @@ void IntegrationPluginDrexelUndWeiss::readX2Energy(Thing *thing, ModbusRtuMaster
m_refreshTimer->startTimer(refreshTime);
}
}
}
}
void IntegrationPluginDrexelUndWeiss::onConnectionStateChanged(bool status)
{
void IntegrationPluginDrexelUndWeiss::onConnectionStateChanged(bool status)
{
ModbusRtuMaster *modbusRtuMaster = static_cast<ModbusRtuMaster *>(sender());
Thing *thing = m_modbusRtuMasters.key(modbusRtuMaster);
if (!thing)
return;
thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), status);
}
}