Sungrow: Fix battery calculations and add device type string

This commit is contained in:
Simon Stürz 2025-04-15 15:16:14 +02:00
parent 6e1101ec06
commit 64169bc5db
4 changed files with 132 additions and 8 deletions

View File

@ -52,12 +52,15 @@ void IntegrationPluginSungrow::discoverThings(ThingDiscoveryInfo *info)
SungrowDiscovery *discovery = new SungrowDiscovery(hardwareManager()->networkDeviceDiscovery(), m_modbusTcpPort, m_modbusSlaveAddress, info);
connect(discovery, &SungrowDiscovery::discoveryFinished, info, [=](){
foreach (const SungrowDiscovery::SungrowDiscoveryResult &result, discovery->discoveryResults()) {
QString title = "Sungrow " + QString::number(result.nominalOutputPower) + "kW Inverter";
QString title = "Sungrow " + result.model;
if (!result.serialNumber.isEmpty())
title.append(" " + result.serialNumber);
title.append(" - " + result.serialNumber);
ThingDescriptor descriptor(sungrowInverterTcpThingClassId, title, result.networkDeviceInfo.address().toString());
QString description(QString::number(result.nominalOutputPower)+ "kW Inverter - " + result.networkDeviceInfo.address().toString());
ThingDescriptor descriptor(sungrowInverterTcpThingClassId, title, description);
qCInfo(dcSungrow()) << "Discovered:" << descriptor.title() << descriptor.description();
ParamList params;
@ -158,6 +161,9 @@ void IntegrationPluginSungrow::setupThing(ThingSetupInfo *info)
child->setStateValue(sungrowMeterCurrentPhaseAStateTypeId, 0);
child->setStateValue(sungrowMeterCurrentPhaseBStateTypeId, 0);
child->setStateValue(sungrowMeterCurrentPhaseCStateTypeId, 0);
child->setStateValue(sungrowMeterVoltagePhaseAStateTypeId, 0);
child->setStateValue(sungrowMeterVoltagePhaseBStateTypeId, 0);
child->setStateValue(sungrowMeterVoltagePhaseCStateTypeId, 0);
child->setStateValue(sungrowMeterApparentPowerPhaseAStateTypeId, 0);
child->setStateValue(sungrowMeterApparentPowerPhaseBStateTypeId, 0);
child->setStateValue(sungrowMeterApparentPowerPhaseCStateTypeId, 0);

View File

@ -66,6 +66,7 @@ private:
Thing *getMeterThing(Thing *parentThing);
Thing *getBatteryThing(Thing *parentThing);
};
#endif // INTEGRATIONPLUGINSUNGROW_H

View File

@ -60,6 +60,115 @@ void SungrowDiscovery::startDiscovery()
});
}
QString SungrowDiscovery::deviceCodeToString(quint16 deviceTypeCode)
{
QString deviceType;
switch (deviceTypeCode) {
// SH3.0-6.0RS
case 0xD17:
deviceType = "SH3.0RS";
break;
case 0xD0D:
deviceType = "SH3.6RS";
break;
case 0xD18:
deviceType = "SH4.0RS";
break;
case 0xD0F:
deviceType = "SH5.0RS";
break;
case 0xD10:
deviceType = "SH5.0RS";
break;
// SH8.0-10RS
case 0xD1A:
deviceType = "SH8.0RS";
break;
case 0xD1B:
deviceType = "SH10RS";
break;
// SH5.0-10RT
case 0xE00:
deviceType = "SH5.0RT";
break;
case 0xE01:
deviceType = "SH6.0RT";
break;
case 0xE02:
deviceType = "SH8.0RT";
break;
case 0xE03:
deviceType = "SH10RT";
break;
case 0xE10:
deviceType = "SH5.0RT-20";
break;
case 0xE11:
deviceType = "SH6.0RT-20";
break;
case 0xE12:
deviceType = "SH8.0RT-20";
break;
case 0xE13:
deviceType = "SH10RT-20";
break;
case 0xE0C:
deviceType = "SH5.0RT-V112";
break;
case 0xE0D:
deviceType = "SH6.0RT-V112";
break;
case 0xE0E:
deviceType = "SH8.0RT-V112";
break;
case 0xE0F:
deviceType = "SH10RT-V112";
break;
case 0xE08:
deviceType = "SH5.0RT-V122";
break;
case 0xE09:
deviceType = "SH6.0RT-V122";
break;
case 0xE0A:
deviceType = "SH8.0RT-V122";
break;
case 0xE0B:
deviceType = "SH10RT-V122";
break;
// SH5-25T
case 0xE20:
deviceType = "SH5T-V11";
break;
case 0xE21:
deviceType = "SH6T-V11";
break;
case 0xE22:
deviceType = "SH8T-V11";
break;
case 0xE23:
deviceType = "SH10T-V11";
break;
case 0xE24:
deviceType = "SH12T-V11";
break;
case 0xE25:
deviceType = "SH15T-V11";
break;
case 0xE26:
deviceType = "SH20T-V11";
break;
case 0xE28:
deviceType = "SH25T-V11";
break;
}
return deviceType;
}
QList<SungrowDiscovery::SungrowDiscoveryResult> SungrowDiscovery::discoveryResults() const
{
return m_discoveryResults;
@ -93,14 +202,19 @@ void SungrowDiscovery::checkNetworkDevice(const QHostAddress &address)
return;
}
qCDebug(dcSungrow()) << "Discovery: Initialized successfully" << address.toString() << connection->serialNumber();
qCDebug(dcSungrow()) << " - Protocol number:" << connection->protocolNumber();
qCDebug(dcSungrow()) << " - Protocol version:" << connection->protocolVersion();
qCDebug(dcSungrow()) << " - ARM software version:" << connection->armSoftwareVersion();
qCDebug(dcSungrow()) << " - DSP software version:" << connection->dspSoftwareVersion();
if (connection->deviceTypeCode() >= 0xd00 && connection->deviceTypeCode() <= 0xeff) {
qCDebug(dcSungrow()) << "Discovery: Initialized successfully" << address.toString() << connection->serialNumber();
qCDebug(dcSungrow()) << " - Model:" << deviceCodeToString(connection->deviceTypeCode());
qCDebug(dcSungrow()) << " - Protocol number:" << connection->protocolNumber();
qCDebug(dcSungrow()) << " - Protocol version:" << connection->protocolVersion();
qCDebug(dcSungrow()) << " - ARM software version:" << connection->armSoftwareVersion();
qCDebug(dcSungrow()) << " - DSP software version:" << connection->dspSoftwareVersion();
SungrowDiscoveryResult result;
result.model = deviceCodeToString(connection->deviceTypeCode());
result.address = address;
result.serialNumber = connection->serialNumber();
result.nominalOutputPower = connection->nominalOutputPower();

View File

@ -44,6 +44,7 @@ class SungrowDiscovery : public QObject
public:
explicit SungrowDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, quint16 port = 502, quint16 modbusAddress = 1, QObject *parent = nullptr);
typedef struct SungrowDiscoveryResult {
QString model;
QString serialNumber;
QHostAddress address;
NetworkDeviceInfo networkDeviceInfo;
@ -55,6 +56,8 @@ public:
QList<SungrowDiscoveryResult> discoveryResults() const;
static QString deviceCodeToString(quint16 deviceTypeCode);
signals:
void discoveryFinished();