add support for a connected smartmeter to collect totals
This commit is contained in:
parent
63387535cb
commit
1875a2361d
@ -247,6 +247,32 @@
|
|||||||
"defaultValue": "0",
|
"defaultValue": "0",
|
||||||
"access": "RO"
|
"access": "RO"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "powerMeterEnergyReturned",
|
||||||
|
"address": 37119,
|
||||||
|
"size": 2,
|
||||||
|
"type": "int32",
|
||||||
|
"registerType": "holdingRegister",
|
||||||
|
"readSchedule": "update",
|
||||||
|
"description": " Positive active electricity - To Grid",
|
||||||
|
"unit": "kWh",
|
||||||
|
"staticScaleFactor": -2,
|
||||||
|
"defaultValue": "0",
|
||||||
|
"access": "RO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "powerMeterEnergyAquired",
|
||||||
|
"address": 37121,
|
||||||
|
"size": 2,
|
||||||
|
"type": "int32",
|
||||||
|
"registerType": "holdingRegister",
|
||||||
|
"readSchedule": "update",
|
||||||
|
"description": "Reverse active power - From Grid",
|
||||||
|
"unit": "kWh",
|
||||||
|
"staticScaleFactor": -2,
|
||||||
|
"defaultValue": "0",
|
||||||
|
"access": "RO"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "lunaBattery1Status",
|
"id": "lunaBattery1Status",
|
||||||
"address": 37000,
|
"address": 37000,
|
||||||
|
|||||||
@ -330,6 +330,32 @@
|
|||||||
"defaultValue": "0",
|
"defaultValue": "0",
|
||||||
"access": "RO"
|
"access": "RO"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "powerMeterEnergyReturned",
|
||||||
|
"address": 37119,
|
||||||
|
"size": 2,
|
||||||
|
"type": "int32",
|
||||||
|
"registerType": "holdingRegister",
|
||||||
|
"readSchedule": "update",
|
||||||
|
"description": " Positive active electricity - To Grid",
|
||||||
|
"unit": "kWh",
|
||||||
|
"staticScaleFactor": -2,
|
||||||
|
"defaultValue": "0",
|
||||||
|
"access": "RO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "powerMeterEnergyAquired",
|
||||||
|
"address": 37121,
|
||||||
|
"size": 2,
|
||||||
|
"type": "int32",
|
||||||
|
"registerType": "holdingRegister",
|
||||||
|
"readSchedule": "update",
|
||||||
|
"description": "Reverse active power - From Grid",
|
||||||
|
"unit": "kWh",
|
||||||
|
"staticScaleFactor": -2,
|
||||||
|
"defaultValue": "0",
|
||||||
|
"access": "RO"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "lunaBattery1Status",
|
"id": "lunaBattery1Status",
|
||||||
"address": 37000,
|
"address": 37000,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2022, nymea GmbH
|
* Copyright 2013 - 2022, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
@ -71,6 +71,8 @@ bool HuaweiFusionSolar::update()
|
|||||||
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterLunaBattery2Power);
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterLunaBattery2Power);
|
||||||
|
|
||||||
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterPowerMeterActivePower);
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterPowerMeterActivePower);
|
||||||
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterPowerMeterEnergyReturned);
|
||||||
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterPowerMeterEnergyAquired);
|
||||||
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterInverterEnergyProduced);
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterInverterEnergyProduced);
|
||||||
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterInverterDeviceStatus);
|
m_registersQueue.enqueue(HuaweiFusionModbusTcpConnection::RegisterInverterDeviceStatus);
|
||||||
|
|
||||||
@ -330,6 +332,96 @@ void HuaweiFusionSolar::readNextRegister()
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case HuaweiFusionModbusTcpConnection::RegisterPowerMeterEnergyReturned: {
|
||||||
|
// Update registers from Power meter active power
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Power meter Positive active electricity\" register:" << 37119 << "size:" << 2;
|
||||||
|
QModbusReply *reply = readPowerMeterEnergyReturned();
|
||||||
|
if (!reply) {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Power meter Positive active electricity\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
|
||||||
|
finishRequest();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply->isFinished()) {
|
||||||
|
reply->deleteLater(); // Broadcast reply returns immediatly
|
||||||
|
finishRequest();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
|
||||||
|
connect(reply, &QModbusReply::finished, this, [this, reply](){
|
||||||
|
handleModbusError(reply->error());
|
||||||
|
if (reply->error() == QModbusDevice::NoError) {
|
||||||
|
const QModbusDataUnit unit = reply->result();
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Positive active electricity\" register" << 37119 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count();
|
||||||
|
if (!valuesAreVaild(unit.values(), 2)) {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
|
||||||
|
} else {
|
||||||
|
processPowerMeterEnergyReturnedRegisterValues(unit.values());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finishRequest();
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){
|
||||||
|
if (reply->error() == QModbusDevice::ProtocolError) {
|
||||||
|
QModbusResponse response = reply->rawResult();
|
||||||
|
if (response.isException()) {
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter Positive active electricity\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter Positive active electricity\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
case HuaweiFusionModbusTcpConnection::RegisterPowerMeterEnergyAquired: {
|
||||||
|
// Update registers from Power meter active power
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Power meter Reverse active power\" register:" << 37121 << "size:" << 2;
|
||||||
|
QModbusReply *reply = readPowerMeterEnergyAquired();
|
||||||
|
if (!reply) {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Power meter Reverse active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
|
||||||
|
finishRequest();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reply->isFinished()) {
|
||||||
|
reply->deleteLater(); // Broadcast reply returns immediatly
|
||||||
|
finishRequest();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
|
||||||
|
connect(reply, &QModbusReply::finished, this, [this, reply](){
|
||||||
|
handleModbusError(reply->error());
|
||||||
|
if (reply->error() == QModbusDevice::NoError) {
|
||||||
|
const QModbusDataUnit unit = reply->result();
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Reverse active power\" register" << 37121 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count();
|
||||||
|
if (!valuesAreVaild(unit.values(), 2)) {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
|
||||||
|
} else {
|
||||||
|
processPowerMeterEnergyAquiredRegisterValues(unit.values());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finishRequest();
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){
|
||||||
|
if (reply->error() == QModbusDevice::ProtocolError) {
|
||||||
|
QModbusResponse response = reply->rawResult();
|
||||||
|
if (response.isException()) {
|
||||||
|
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter Reverse active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter Reverse active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
case HuaweiFusionModbusTcpConnection::RegisterLunaBattery1Status: {
|
case HuaweiFusionModbusTcpConnection::RegisterLunaBattery1Status: {
|
||||||
// Update registers from Luna 2000 Battery 1 status
|
// Update registers from Luna 2000 Battery 1 status
|
||||||
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 status\" register:" << 37000 << "size:" << 1;
|
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 status\" register:" << 37000 << "size:" << 1;
|
||||||
|
|||||||
@ -241,6 +241,22 @@ void IntegrationPluginHuawei::setupThing(ThingSetupInfo *info)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(connection, &HuaweiModbusRtuConnection::powerMeterEnergyReturnedChanged, thing, [this, thing](qint32 powerMeterEnergyReturned){
|
||||||
|
Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(huaweiMeterThingClassId);
|
||||||
|
if (!meterThings.isEmpty()) {
|
||||||
|
qCDebug(dcHuawei()) << "Meter Total Energy Returned changed" << powerMeterEnergyReturned << "KWh";
|
||||||
|
meterThings.first()->setStateValue(huaweiMeterTotalEnergyProducedStateTypeId, powerMeterEnergyReturned);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(connection, &HuaweiModbusRtuConnection::powerMeterEnergyAquiredChanged, thing, [this, thing](qint32 powerMeterEnergyAquired){
|
||||||
|
Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(huaweiMeterThingClassId);
|
||||||
|
if (!meterThings.isEmpty()) {
|
||||||
|
qCDebug(dcHuawei()) << "Meter power Energy Aquired changed" << powerMeterEnergyAquired << "KWh";
|
||||||
|
meterThings.first()->setStateValue(huaweiMeterTotalEnergyConsumedStateTypeId, powerMeterEnergyAquired);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Battery 1
|
// Battery 1
|
||||||
connect(connection, &HuaweiModbusRtuConnection::lunaBattery1StatusChanged, thing, [this, thing](HuaweiModbusRtuConnection::BatteryDeviceStatus lunaBattery1Status){
|
connect(connection, &HuaweiModbusRtuConnection::lunaBattery1StatusChanged, thing, [this, thing](HuaweiModbusRtuConnection::BatteryDeviceStatus lunaBattery1Status){
|
||||||
qCDebug(dcHuawei()) << "Battery 1 status changed" << lunaBattery1Status;
|
qCDebug(dcHuawei()) << "Battery 1 status changed" << lunaBattery1Status;
|
||||||
@ -526,6 +542,20 @@ void IntegrationPluginHuawei::setupFusionSolar(ThingSetupInfo *info)
|
|||||||
meterThings.first()->setStateValue(huaweiMeterCurrentPowerStateTypeId, -powerMeterActivePower);
|
meterThings.first()->setStateValue(huaweiMeterCurrentPowerStateTypeId, -powerMeterActivePower);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
connect(connection, &HuaweiFusionSolar::powerMeterEnergyReturnedReadFinished, thing, [this, thing](qint32 powerMeterEnergyReturned){
|
||||||
|
Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(huaweiMeterThingClassId);
|
||||||
|
if (!meterThings.isEmpty()) {
|
||||||
|
qCDebug(dcHuawei()) << "Meter power Returned changed" << powerMeterEnergyReturned << "kWh";
|
||||||
|
meterThings.first()->setStateValue(huaweiMeterTotalEnergyProducedStateTypeId, powerMeterEnergyReturned);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connect(connection, &HuaweiFusionSolar::powerMeterEnergyAquiredReadFinished, thing, [this, thing](qint32 powerMeterEnergyAquired){
|
||||||
|
Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(huaweiMeterThingClassId);
|
||||||
|
if (!meterThings.isEmpty()) {
|
||||||
|
qCDebug(dcHuawei()) << "Meter power Aquired changed" << powerMeterEnergyAquired << "kWh";
|
||||||
|
meterThings.first()->setStateValue(huaweiMeterTotalEnergyConsumedStateTypeId, powerMeterEnergyAquired);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Battery 1
|
// Battery 1
|
||||||
connect(connection, &HuaweiFusionSolar::lunaBattery1StatusReadFinished, thing, [this, thing](HuaweiFusionSolar::BatteryDeviceStatus lunaBattery1Status){
|
connect(connection, &HuaweiFusionSolar::lunaBattery1StatusReadFinished, thing, [this, thing](HuaweiFusionSolar::BatteryDeviceStatus lunaBattery1Status){
|
||||||
|
|||||||
Reference in New Issue
Block a user