diff --git a/huawei/huawei-registers.json b/huawei/huawei-registers.json index 0e559d1..e0b585d 100644 --- a/huawei/huawei-registers.json +++ b/huawei/huawei-registers.json @@ -1,4 +1,5 @@ { + "className": "Huawei", "protocol": "TCP", "endianness": "BigEndian", "enums": [ diff --git a/huawei/huawei.pro b/huawei/huawei.pro index 194853d..d5d9324 100644 --- a/huawei/huawei.pro +++ b/huawei/huawei.pro @@ -1,17 +1,14 @@ include(../plugins.pri) -QT += network serialbus +# Generate modbus connection +MODBUS_CONNECTIONS += huawei-registers.json +#MODBUS_TOOLS_CONFIG += VERBOSE +include(../modbus.pri) HEADERS += \ huaweifusionsolar.h \ - huaweimodbustcpconnection.h \ - integrationpluginhuawei.h \ - ../modbus/modbustcpmaster.h \ - ../modbus/modbusdatautils.h + integrationpluginhuawei.h SOURCES += \ huaweifusionsolar.cpp \ - huaweimodbustcpconnection.cpp \ - integrationpluginhuawei.cpp \ - ../modbus/modbustcpmaster.cpp \ - ../modbus/modbusdatautils.cpp + integrationpluginhuawei.cpp diff --git a/huawei/huaweifusionsolar.cpp b/huawei/huaweifusionsolar.cpp index 3374c2a..e11c9e7 100644 --- a/huawei/huaweifusionsolar.cpp +++ b/huawei/huaweifusionsolar.cpp @@ -98,11 +98,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter active power\" register" << 32080 << "size:" << 2 << values; - float receivedInverterActivePower = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian) * 1.0 * pow(10, -3); - if (m_inverterActivePower != receivedInverterActivePower) { - m_inverterActivePower = receivedInverterActivePower; - emit inverterActivePowerChanged(m_inverterActivePower); - } + processInverterActivePowerRegisterValues(values); } finishRequest(); }); @@ -133,12 +129,8 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << values; - InverterDeviceStatus receivedInverterDeviceStatus = static_cast(ModbusDataUtils::convertToUInt16(values)); - qCDebug(dcHuaweiFusionSolar()) << "Inverter status" << receivedInverterDeviceStatus; - if (m_inverterDeviceStatus != receivedInverterDeviceStatus) { - m_inverterDeviceStatus = receivedInverterDeviceStatus; - emit inverterDeviceStatusChanged(m_inverterDeviceStatus); - } + processInverterDeviceStatusRegisterValues(values); + qCDebug(dcHuaweiFusionSolar()) << "Inverter status" << inverterDeviceStatus(); } finishRequest(); }); @@ -169,11 +161,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter energy produced\" register" << 32106 << "size:" << 2 << values; - float receivedInverterEnergyProduced = ModbusDataUtils::convertToUInt32(values, ModbusDataUtils::ByteOrderBigEndian) * 1.0 * pow(10, -2); - if (m_inverterEnergyProduced != receivedInverterEnergyProduced) { - m_inverterEnergyProduced = receivedInverterEnergyProduced; - emit inverterEnergyProducedChanged(m_inverterEnergyProduced); - } + processInverterEnergyProducedRegisterValues(values); } finishRequest(); }); @@ -204,18 +192,13 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << values; - BatteryDeviceStatus receivedLunaBattery1Status = static_cast(ModbusDataUtils::convertToUInt16(values)); - qCDebug(dcHuaweiFusionSolar()) << "Battery 1 status" << receivedLunaBattery1Status; - if (receivedLunaBattery1Status == BatteryDeviceStatusOffline) { + processLunaBattery1StatusRegisterValues(values); + qCDebug(dcHuaweiFusionSolar()) << "Battery 1 status" << m_lunaBattery1Status; + if (m_lunaBattery1Status == BatteryDeviceStatusOffline) { m_battery1Available = false; } else { m_battery1Available = true; } - - if (m_lunaBattery1Status != receivedLunaBattery1Status) { - m_lunaBattery1Status = receivedLunaBattery1Status; - emit lunaBattery1StatusChanged(m_lunaBattery1Status); - } } finishRequest(); }); @@ -246,11 +229,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 power\" register" << 37001 << "size:" << 2 << values; - qint32 receivedLunaBattery1Power = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_lunaBattery1Power != receivedLunaBattery1Power) { - m_lunaBattery1Power = receivedLunaBattery1Power; - emit lunaBattery1PowerChanged(m_lunaBattery1Power); - } + processLunaBattery1PowerRegisterValues(values); } finishRequest(); }); @@ -281,11 +260,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 state of charge\" register" << 37004 << "size:" << 1 << values; - float receivedLunaBattery1Soc = ModbusDataUtils::convertToUInt16(values) * 1.0 * pow(10, -1); - if (m_lunaBattery1Soc != receivedLunaBattery1Soc) { - m_lunaBattery1Soc = receivedLunaBattery1Soc; - emit lunaBattery1SocChanged(m_lunaBattery1Soc); - } + processLunaBattery1SocRegisterValues(values); } finishRequest(); }); @@ -316,11 +291,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter active power\" register" << 37113 << "size:" << 2 << values; - qint32 receivedPowerMeterActivePower = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_powerMeterActivePower != receivedPowerMeterActivePower) { - m_powerMeterActivePower = receivedPowerMeterActivePower; - emit powerMeterActivePowerChanged(m_powerMeterActivePower); - } + processPowerMeterActivePowerRegisterValues(values); } finishRequest(); }); @@ -351,17 +322,13 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << values; - BatteryDeviceStatus receivedLunaBattery2Status = static_cast(ModbusDataUtils::convertToUInt16(values)); - qCDebug(dcHuaweiFusionSolar()) << "Battery 2 status" << receivedLunaBattery2Status; - if (receivedLunaBattery2Status == BatteryDeviceStatusOffline) { + processLunaBattery2StatusRegisterValues(values); + qCDebug(dcHuaweiFusionSolar()) << "Battery 2 status" << m_lunaBattery2Status; + if (m_lunaBattery2Status == BatteryDeviceStatusOffline) { m_battery2Available = false; } else { m_battery2Available = true; } - if (m_lunaBattery2Status != receivedLunaBattery2Status) { - m_lunaBattery2Status = receivedLunaBattery2Status; - emit lunaBattery2StatusChanged(m_lunaBattery2Status); - } } finishRequest(); }); @@ -392,11 +359,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 power\" register" << 37743 << "size:" << 2 << values; - qint32 receivedLunaBattery2Power = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_lunaBattery2Power != receivedLunaBattery2Power) { - m_lunaBattery2Power = receivedLunaBattery2Power; - emit lunaBattery2PowerChanged(m_lunaBattery2Power); - } + processLunaBattery2PowerRegisterValues(values); } finishRequest(); }); @@ -427,11 +390,7 @@ void HuaweiFusionSolar::readNextRegister() const QModbusDataUnit unit = reply->result(); const QVector values = unit.values(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 state of charge\" register" << 37738 << "size:" << 1 << values; - float receivedLunaBattery2Soc = ModbusDataUtils::convertToUInt16(values) * 1.0 * pow(10, -1); - if (m_lunaBattery2Soc != receivedLunaBattery2Soc) { - m_lunaBattery2Soc = receivedLunaBattery2Soc; - emit lunaBattery2SocChanged(m_lunaBattery2Soc); - } + processLunaBattery2SocRegisterValues(values); } finishRequest(); }); diff --git a/huawei/huaweimodbustcpconnection.cpp b/huawei/huaweimodbustcpconnection.cpp deleted file mode 100644 index cca8e02..0000000 --- a/huawei/huaweimodbustcpconnection.cpp +++ /dev/null @@ -1,523 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2022, nymea GmbH -* Contact: contact@nymea.io -* -* This fileDescriptor is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include "huaweimodbustcpconnection.h" -#include "loggingcategories.h" - -NYMEA_LOGGING_CATEGORY(dcHuaweiModbusTcpConnection, "HuaweiModbusTcpConnection") - -HuaweiModbusTcpConnection::HuaweiModbusTcpConnection(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent) : - ModbusTCPMaster(hostAddress, port, parent), - m_slaveId(slaveId) -{ - -} - -float HuaweiModbusTcpConnection::inverterActivePower() const -{ - return m_inverterActivePower; -} - -HuaweiModbusTcpConnection::InverterDeviceStatus HuaweiModbusTcpConnection::inverterDeviceStatus() const -{ - return m_inverterDeviceStatus; -} - -float HuaweiModbusTcpConnection::inverterEnergyProduced() const -{ - return m_inverterEnergyProduced; -} - -qint32 HuaweiModbusTcpConnection::powerMeterActivePower() const -{ - return m_powerMeterActivePower; -} - -HuaweiModbusTcpConnection::BatteryDeviceStatus HuaweiModbusTcpConnection::lunaBattery1Status() const -{ - return m_lunaBattery1Status; -} - -qint32 HuaweiModbusTcpConnection::lunaBattery1Power() const -{ - return m_lunaBattery1Power; -} - -float HuaweiModbusTcpConnection::lunaBattery1Soc() const -{ - return m_lunaBattery1Soc; -} - -HuaweiModbusTcpConnection::BatteryDeviceStatus HuaweiModbusTcpConnection::lunaBattery2Status() const -{ - return m_lunaBattery2Status; -} - -qint32 HuaweiModbusTcpConnection::lunaBattery2Power() const -{ - return m_lunaBattery2Power; -} - -float HuaweiModbusTcpConnection::lunaBattery2Soc() const -{ - return m_lunaBattery2Soc; -} - -void HuaweiModbusTcpConnection::initialize() -{ - // No init registers defined. Nothing to be done and we are finished. - emit initializationFinished(); -} - -void HuaweiModbusTcpConnection::update() -{ - updateInverterActivePower(); - updateInverterDeviceStatus(); - updateInverterEnergyProduced(); - updatePowerMeterActivePower(); - updateLunaBattery1Status(); - updateLunaBattery1Power(); - updateLunaBattery1Soc(); - updateLunaBattery2Status(); - updateLunaBattery2Power(); - updateLunaBattery2Soc(); -} - -void HuaweiModbusTcpConnection::updateInverterActivePower() -{ - // Update registers from Inverter active power - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Inverter active power\" register:" << 32080 << "size:" << 2; - QModbusReply *reply = readInverterActivePower(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Inverter active power\" register" << 32080 << "size:" << 2 << values; - float receivedInverterActivePower = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian) * 1.0 * pow(10, -3); - if (m_inverterActivePower != receivedInverterActivePower) { - m_inverterActivePower = receivedInverterActivePower; - emit inverterActivePowerChanged(m_inverterActivePower); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Inverter active 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Inverter active power\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateInverterDeviceStatus() -{ - // Update registers from Inverter device status - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Inverter device status\" register:" << 32089 << "size:" << 1; - QModbusReply *reply = readInverterDeviceStatus(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << values; - InverterDeviceStatus receivedInverterDeviceStatus = static_cast(ModbusDataUtils::convertToUInt16(values)); - if (m_inverterDeviceStatus != receivedInverterDeviceStatus) { - m_inverterDeviceStatus = receivedInverterDeviceStatus; - emit inverterDeviceStatusChanged(m_inverterDeviceStatus); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Inverter device status\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Inverter device status\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateInverterEnergyProduced() -{ - // Update registers from Inverter energy produced - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Inverter energy produced\" register:" << 32106 << "size:" << 2; - QModbusReply *reply = readInverterEnergyProduced(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Inverter energy produced\" register" << 32106 << "size:" << 2 << values; - float receivedInverterEnergyProduced = ModbusDataUtils::convertToUInt32(values, ModbusDataUtils::ByteOrderBigEndian) * 1.0 * pow(10, -2); - if (m_inverterEnergyProduced != receivedInverterEnergyProduced) { - m_inverterEnergyProduced = receivedInverterEnergyProduced; - emit inverterEnergyProducedChanged(m_inverterEnergyProduced); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Inverter energy produced\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Inverter energy produced\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updatePowerMeterActivePower() -{ - // Update registers from Power meter active power - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Power meter active power\" register:" << 37113 << "size:" << 2; - QModbusReply *reply = readPowerMeterActivePower(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Power meter active power\" register" << 37113 << "size:" << 2 << values; - qint32 receivedPowerMeterActivePower = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_powerMeterActivePower != receivedPowerMeterActivePower) { - m_powerMeterActivePower = receivedPowerMeterActivePower; - emit powerMeterActivePowerChanged(m_powerMeterActivePower); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Power meter active 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Power meter active power\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery1Status() -{ - // Update registers from Luna 2000 Battery 1 status - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 1 status\" register:" << 37000 << "size:" << 1; - QModbusReply *reply = readLunaBattery1Status(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << values; - BatteryDeviceStatus receivedLunaBattery1Status = static_cast(ModbusDataUtils::convertToUInt16(values)); - m_lunaBattery1Status = receivedLunaBattery1Status; - emit lunaBattery1StatusChanged(m_lunaBattery1Status); - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 status\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 1 status\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery1Power() -{ - // Update registers from Luna 2000 Battery 1 power - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 1 power\" register:" << 37001 << "size:" << 2; - QModbusReply *reply = readLunaBattery1Power(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 1 power\" register" << 37001 << "size:" << 2 << values; - qint32 receivedLunaBattery1Power = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_lunaBattery1Power != receivedLunaBattery1Power) { - m_lunaBattery1Power = receivedLunaBattery1Power; - emit lunaBattery1PowerChanged(m_lunaBattery1Power); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 1 power\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery1Soc() -{ - // Update registers from Luna 2000 Battery 1 state of charge - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 1 state of charge\" register:" << 37004 << "size:" << 1; - QModbusReply *reply = readLunaBattery1Soc(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 1 state of charge\" register" << 37004 << "size:" << 1 << values; - float receivedLunaBattery1Soc = ModbusDataUtils::convertToUInt16(values) * 1.0 * pow(10, -1); - if (m_lunaBattery1Soc != receivedLunaBattery1Soc) { - m_lunaBattery1Soc = receivedLunaBattery1Soc; - emit lunaBattery1SocChanged(m_lunaBattery1Soc); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 state of charge\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 1 state of charge\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery2Status() -{ - // Update registers from Luna 2000 Battery 2 status - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 2 status\" register:" << 37741 << "size:" << 1; - QModbusReply *reply = readLunaBattery2Status(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << values; - BatteryDeviceStatus receivedLunaBattery2Status = static_cast(ModbusDataUtils::convertToUInt16(values)); - m_lunaBattery2Status = receivedLunaBattery2Status; - emit lunaBattery2StatusChanged(m_lunaBattery2Status); - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 status\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 2 status\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery2Power() -{ - // Update registers from Luna 2000 Battery 2 power - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 2 power\" register:" << 37743 << "size:" << 2; - QModbusReply *reply = readLunaBattery2Power(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 2 power\" register" << 37743 << "size:" << 2 << values; - qint32 receivedLunaBattery2Power = ModbusDataUtils::convertToInt32(values, ModbusDataUtils::ByteOrderBigEndian); - if (m_lunaBattery2Power != receivedLunaBattery2Power) { - m_lunaBattery2Power = receivedLunaBattery2Power; - emit lunaBattery2PowerChanged(m_lunaBattery2Power); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 2 power\" registers from" << hostAddress().toString() << errorString(); - } -} - -void HuaweiModbusTcpConnection::updateLunaBattery2Soc() -{ - // Update registers from Luna 2000 Battery 2 state of charge - qCDebug(dcHuaweiModbusTcpConnection()) << "--> Read \"Luna 2000 Battery 2 state of charge\" register:" << 37738 << "size:" << 1; - QModbusReply *reply = readLunaBattery2Soc(); - 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 values = unit.values(); - qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 2 state of charge\" register" << 37738 << "size:" << 1 << values; - float receivedLunaBattery2Soc = ModbusDataUtils::convertToUInt16(values) * 1.0 * pow(10, -1); - if (m_lunaBattery2Soc != receivedLunaBattery2Soc) { - m_lunaBattery2Soc = receivedLunaBattery2Soc; - emit lunaBattery2SocChanged(m_lunaBattery2Soc); - } - } - }); - - connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){ - qCWarning(dcHuaweiModbusTcpConnection()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 state of charge\" 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(dcHuaweiModbusTcpConnection()) << "Error occurred while reading \"Luna 2000 Battery 2 state of charge\" registers from" << hostAddress().toString() << errorString(); - } -} - -QModbusReply *HuaweiModbusTcpConnection::readInverterActivePower() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 32080, 2); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readInverterDeviceStatus() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 32089, 1); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readInverterEnergyProduced() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 32106, 2); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readPowerMeterActivePower() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37113, 2); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery1Status() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37000, 1); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery1Power() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37001, 2); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery1Soc() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37004, 1); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery2Status() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37741, 1); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery2Power() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37743, 2); - return sendReadRequest(request, m_slaveId); -} - -QModbusReply *HuaweiModbusTcpConnection::readLunaBattery2Soc() -{ - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, 37738, 1); - return sendReadRequest(request, m_slaveId); -} - -void HuaweiModbusTcpConnection::verifyInitFinished() -{ - if (m_pendingInitReplies.isEmpty()) { - qCDebug(dcHuaweiModbusTcpConnection()) << "Initialization finished of HuaweiModbusTcpConnection" << hostAddress().toString(); - emit initializationFinished(); - } -} - -QDebug operator<<(QDebug debug, HuaweiModbusTcpConnection *huaweiModbusTcpConnection) -{ - debug.nospace().noquote() << "HuaweiModbusTcpConnection(" << huaweiModbusTcpConnection->hostAddress().toString() << ":" << huaweiModbusTcpConnection->port() << ")" << "\n"; - debug.nospace().noquote() << " - Inverter active power:" << huaweiModbusTcpConnection->inverterActivePower() << " [kW]" << "\n"; - debug.nospace().noquote() << " - Inverter device status:" << huaweiModbusTcpConnection->inverterDeviceStatus() << "\n"; - debug.nospace().noquote() << " - Inverter energy produced:" << huaweiModbusTcpConnection->inverterEnergyProduced() << " [kWh]" << "\n"; - debug.nospace().noquote() << " - Power meter active power:" << huaweiModbusTcpConnection->powerMeterActivePower() << " [W]" << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 1 status:" << huaweiModbusTcpConnection->lunaBattery1Status() << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 1 power:" << huaweiModbusTcpConnection->lunaBattery1Power() << " [W]" << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 1 state of charge:" << huaweiModbusTcpConnection->lunaBattery1Soc() << " [%]" << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 2 status:" << huaweiModbusTcpConnection->lunaBattery2Status() << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 2 power:" << huaweiModbusTcpConnection->lunaBattery2Power() << " [W]" << "\n"; - debug.nospace().noquote() << " - Luna 2000 Battery 2 state of charge:" << huaweiModbusTcpConnection->lunaBattery2Soc() << " [%]" << "\n"; - return debug.quote().space(); -} - diff --git a/huawei/huaweimodbustcpconnection.h b/huawei/huaweimodbustcpconnection.h deleted file mode 100644 index 40ce1b3..0000000 --- a/huawei/huaweimodbustcpconnection.h +++ /dev/null @@ -1,194 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2022, nymea GmbH -* Contact: contact@nymea.io -* -* This fileDescriptor is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef HUAWEIMODBUSTCPCONNECTION_H -#define HUAWEIMODBUSTCPCONNECTION_H - -#include - -#include "../modbus/modbusdatautils.h" -#include "../modbus/modbustcpmaster.h" - -class HuaweiModbusTcpConnection : public ModbusTCPMaster -{ - Q_OBJECT -public: - enum Registers { - RegisterInverterActivePower = 32080, - RegisterInverterDeviceStatus = 32089, - RegisterInverterEnergyProduced = 32106, - RegisterLunaBattery1Status = 37000, - RegisterLunaBattery1Power = 37001, - RegisterLunaBattery1Soc = 37004, - RegisterPowerMeterActivePower = 37113, - RegisterLunaBattery2Soc = 37738, - RegisterLunaBattery2Status = 37741, - RegisterLunaBattery2Power = 37743 - }; - Q_ENUM(Registers) - - enum InverterDeviceStatus { - InverterDeviceStatusStandbyInitializing = 0, - InverterDeviceStatusStandbyDetectingInsulationResistance = 1, - InverterDeviceStatusStandbyDetectingIrradiation = 2, - InverterDeviceStatusStandbyDridDetecting = 3, - InverterDeviceStatusStarting = 256, - InverterDeviceStatusOnGrid = 512, - InverterDeviceStatusPowerLimited = 513, - InverterDeviceStatusSelfDerating = 514, - InverterDeviceStatusShutdownFault = 768, - InverterDeviceStatusShutdownCommand = 769, - InverterDeviceStatusShutdownOVGR = 770, - InverterDeviceStatusShutdownCommunicationDisconnected = 771, - InverterDeviceStatusShutdownPowerLimit = 772, - InverterDeviceStatusShutdownManualStartupRequired = 773, - InverterDeviceStatusShutdownInputUnderpower = 774, - InverterDeviceStatusGridSchedulingPCurve = 1025, - InverterDeviceStatusGridSchedulingQUCurve = 1026, - InverterDeviceStatusGridSchedulingPFUCurve = 1027, - InverterDeviceStatusGridSchedulingDryContact = 1028, - InverterDeviceStatusGridSchedulingQPCurve = 1029, - InverterDeviceStatusSpotCheckReady = 1280, - InverterDeviceStatusSpotChecking = 1281, - InverterDeviceStatusInspecting = 1536, - InverterDeviceStatusAfciSelfCheck = 1792, - InverterDeviceStatusIVScanning = 2048, - InverterDeviceStatusDCInputDetection = 2304, - InverterDeviceStatusRunningOffGridCharging = 2560, - InverterDeviceStatusStandbyNoIrradiation = 40960 - }; - Q_ENUM(InverterDeviceStatus) - - enum BatteryDeviceStatus { - BatteryDeviceStatusOffline = 0, - BatteryDeviceStatusStandby = 1, - BatteryDeviceStatusRunning = 1, - BatteryDeviceStatusFault = 1, - BatteryDeviceStatusSleepMode = 1 - }; - Q_ENUM(BatteryDeviceStatus) - - explicit HuaweiModbusTcpConnection(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent = nullptr); - ~HuaweiModbusTcpConnection() = default; - - /* Inverter active power [kW] - Address: 32080, Size: 2 */ - float inverterActivePower() const; - - /* Inverter device status - Address: 32089, Size: 1 */ - InverterDeviceStatus inverterDeviceStatus() const; - - /* Inverter energy produced [kWh] - Address: 32106, Size: 2 */ - float inverterEnergyProduced() const; - - /* Power meter active power [W] - Address: 37113, Size: 2 */ - qint32 powerMeterActivePower() const; - - /* Luna 2000 Battery 1 status - Address: 37000, Size: 1 */ - BatteryDeviceStatus lunaBattery1Status() const; - - /* Luna 2000 Battery 1 power [W] - Address: 37001, Size: 2 */ - qint32 lunaBattery1Power() const; - - /* Luna 2000 Battery 1 state of charge [%] - Address: 37004, Size: 1 */ - float lunaBattery1Soc() const; - - /* Luna 2000 Battery 2 status - Address: 37741, Size: 1 */ - BatteryDeviceStatus lunaBattery2Status() const; - - /* Luna 2000 Battery 2 power [W] - Address: 37743, Size: 2 */ - qint32 lunaBattery2Power() const; - - /* Luna 2000 Battery 2 state of charge [%] - Address: 37738, Size: 1 */ - float lunaBattery2Soc() const; - - - virtual void initialize(); - virtual void update(); - - void updateInverterActivePower(); - void updateInverterDeviceStatus(); - void updateInverterEnergyProduced(); - void updatePowerMeterActivePower(); - void updateLunaBattery1Status(); - void updateLunaBattery1Power(); - void updateLunaBattery1Soc(); - void updateLunaBattery2Status(); - void updateLunaBattery2Power(); - void updateLunaBattery2Soc(); - -signals: - void initializationFinished(); - - void inverterActivePowerChanged(float inverterActivePower); - void inverterDeviceStatusChanged(InverterDeviceStatus inverterDeviceStatus); - void inverterEnergyProducedChanged(float inverterEnergyProduced); - void powerMeterActivePowerChanged(qint32 powerMeterActivePower); - void lunaBattery1StatusChanged(BatteryDeviceStatus lunaBattery1Status); - void lunaBattery1PowerChanged(qint32 lunaBattery1Power); - void lunaBattery1SocChanged(float lunaBattery1Soc); - void lunaBattery2StatusChanged(BatteryDeviceStatus lunaBattery2Status); - void lunaBattery2PowerChanged(qint32 lunaBattery2Power); - void lunaBattery2SocChanged(float lunaBattery2Soc); - -protected: - QModbusReply *readInverterActivePower(); - QModbusReply *readInverterDeviceStatus(); - QModbusReply *readInverterEnergyProduced(); - QModbusReply *readPowerMeterActivePower(); - QModbusReply *readLunaBattery1Status(); - QModbusReply *readLunaBattery1Power(); - QModbusReply *readLunaBattery1Soc(); - QModbusReply *readLunaBattery2Status(); - QModbusReply *readLunaBattery2Power(); - QModbusReply *readLunaBattery2Soc(); - - float m_inverterActivePower = 0; - InverterDeviceStatus m_inverterDeviceStatus = InverterDeviceStatusStandbyInitializing; - float m_inverterEnergyProduced = 0; - qint32 m_powerMeterActivePower = 0; - BatteryDeviceStatus m_lunaBattery1Status = BatteryDeviceStatusOffline; - qint32 m_lunaBattery1Power = 0; - float m_lunaBattery1Soc = 0; - BatteryDeviceStatus m_lunaBattery2Status = BatteryDeviceStatusOffline; - qint32 m_lunaBattery2Power = 0; - float m_lunaBattery2Soc = 0; - -private: - quint16 m_slaveId = 1; - QVector m_pendingInitReplies; - - void verifyInitFinished(); - - -}; - -QDebug operator<<(QDebug debug, HuaweiModbusTcpConnection *huaweiModbusTcpConnection); - -#endif // HUAWEIMODBUSTCPCONNECTION_H