Update huawei plugin to libnyma-modbus
This commit is contained in:
parent
f3ea2c9c04
commit
6d794dd7b9
@ -1,4 +1,5 @@
|
||||
{
|
||||
"className": "Huawei",
|
||||
"protocol": "TCP",
|
||||
"endianness": "BigEndian",
|
||||
"enums": [
|
||||
|
||||
@ -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
|
||||
|
||||
@ -98,11 +98,7 @@ void HuaweiFusionSolar::readNextRegister()
|
||||
const QModbusDataUnit unit = reply->result();
|
||||
const QVector<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << values;
|
||||
InverterDeviceStatus receivedInverterDeviceStatus = static_cast<InverterDeviceStatus>(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<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << values;
|
||||
BatteryDeviceStatus receivedLunaBattery1Status = static_cast<BatteryDeviceStatus>(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<quint16> 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<quint16> 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<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << values;
|
||||
BatteryDeviceStatus receivedLunaBattery2Status = static_cast<BatteryDeviceStatus>(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<quint16> 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<quint16> 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();
|
||||
});
|
||||
|
||||
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 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<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << values;
|
||||
InverterDeviceStatus receivedInverterDeviceStatus = static_cast<InverterDeviceStatus>(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<quint16> 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<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << values;
|
||||
BatteryDeviceStatus receivedLunaBattery1Status = static_cast<BatteryDeviceStatus>(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<quint16> 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<quint16> 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<quint16> values = unit.values();
|
||||
qCDebug(dcHuaweiModbusTcpConnection()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << values;
|
||||
BatteryDeviceStatus receivedLunaBattery2Status = static_cast<BatteryDeviceStatus>(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<quint16> 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<quint16> 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();
|
||||
}
|
||||
|
||||
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 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 <QObject>
|
||||
|
||||
#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<QModbusReply *> m_pendingInitReplies;
|
||||
|
||||
void verifyInitFinished();
|
||||
|
||||
|
||||
};
|
||||
|
||||
QDebug operator<<(QDebug debug, HuaweiModbusTcpConnection *huaweiModbusTcpConnection);
|
||||
|
||||
#endif // HUAWEIMODBUSTCPCONNECTION_H
|
||||
Reference in New Issue
Block a user