This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-plugins-modbus/huawei/huaweifusionsolar.cpp
2022-02-05 23:48:24 +01:00

78 lines
3.4 KiB
C++

#include "huaweifusionsolar.h"
#include "extern-plugininfo.h"
HuaweiFusionSolar::HuaweiFusionSolar(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent) :
HuaweiModbusTcpConnection(hostAddress, port, slaveId, parent)
{
}
void HuaweiFusionSolar::initialize()
{
// No init registers defined. Nothing to be done and we are finished.
emit initializationFinished();
}
void HuaweiFusionSolar::update()
{
// Make sure there is not an update still running
if (!m_registersQueue.isEmpty())
return;
// Add the requests
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterInverterDCPower);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterInverterActivePower);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterLunaBattery1Power);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterLunaBattery1Soc);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterPowerMeterActivePower);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterLunaBattery2Soc);
m_registersQueue.enqueue(HuaweiModbusTcpConnection::RegisterLunaBattery2Power);
// Note: since huawei can only process one request at the time, we need to queue the requests
readNextRegister();
}
void HuaweiFusionSolar::readNextRegister()
{
// Check if currently a reply is pending
if (m_currentRegisterRequest >= 0)
return;
switch (m_currentRegisterRequest) {
case HuaweiModbusTcpConnection::RegisterInverterDCPower:
// Update registers from Inverter DC power
qCDebug(dcHuawei()) << "--> Read \"Inverter DC power\" register:" << 32064 << "size:" << 2;
QModbusReply *reply = readInverterDCPower();
if (reply) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
connect(reply, &QModbusReply::finished, this, [this, reply](){
if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result();
const QVector<quint16> values = unit.values();
qCDebug(dcHuawei()) << "<-- Response from \"Inverter DC power\" register" << 32064 << "size:" << 2 << values;
float receivedInverterDCPower = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian) * 1.0 * pow(10, -3);
if (m_inverterDCPower != receivedInverterDCPower) {
m_inverterDCPower = receivedInverterDCPower;
emit inverterDCPowerChanged(m_inverterDCPower);
}
}
});
connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){
qCWarning(dcHuawei()) << "Modbus reply error occurred while updating \"Inverter DC power\" registers from" << hostAddress().toString() << error << reply->errorString();
emit reply->finished(); // To make sure it will be deleted
});
} else {
delete reply; // Broadcast reply returns immediatly
}
} else {
qCWarning(dcHuawei()) << "Error occurred while reading \"Inverter DC power\" registers from" << hostAddress().toString() << errorString();
}
break;
}
}