From b3d84e8374d0451b913f12d26350d1dd782f4c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Thu, 10 Apr 2025 14:32:20 +0200 Subject: [PATCH] SunSpec: Fix #698 enable charging/discharging actions for energy storages --- sunspec/integrationpluginsunspec.cpp | 35 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/sunspec/integrationpluginsunspec.cpp b/sunspec/integrationpluginsunspec.cpp index 25ccd80..fb62eb6 100644 --- a/sunspec/integrationpluginsunspec.cpp +++ b/sunspec/integrationpluginsunspec.cpp @@ -488,25 +488,42 @@ void IntegrationPluginSunSpec::executeAction(ThingActionInfo *info) } info->finish(Thing::ThingErrorNoError); }); - } else if (action.actionTypeId() == sunspecStorageEnableChargingActionTypeId || action.actionTypeId() == sunspecStorageEnableDischargingActionTypeId) { - SunSpecStorageModel::Storctl_modFlags controlModeFlags; - if (action.param(sunspecStorageEnableChargingActionEnableChargingParamTypeId).value().toBool()) - controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modCharge); - - if (thing->stateValue(sunspecStorageEnableDischargingStateTypeId).toBool()) - controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modDiScharge); - + } else if (action.actionTypeId() == sunspecStorageEnableChargingActionTypeId) { + SunSpecStorageModel::Storctl_modFlags controlModeFlags = storage->storCtlMod(); + bool enabled = action.param(sunspecStorageEnableChargingActionEnableChargingParamTypeId).value().toBool(); + controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modCharge, enabled); QModbusReply *reply = storage->setStorCtlMod(controlModeFlags); if (!reply) { info->finish(Thing::ThingErrorHardwareFailure); return; } connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); - connect(reply, &QModbusReply::finished, info, [info, reply]{ + connect(reply, &QModbusReply::finished, info, [info, reply, enabled]{ if (reply->error() != QModbusDevice::NoError) { info->finish(Thing::ThingErrorHardwareFailure); return; } + + info->thing()->setStateValue(sunspecStorageEnableChargingStateTypeId, enabled); + info->finish(Thing::ThingErrorNoError); + }); + } else if (action.actionTypeId() == sunspecStorageEnableDischargingActionTypeId) { + SunSpecStorageModel::Storctl_modFlags controlModeFlags = storage->storCtlMod(); + bool enabled = action.param(sunspecStorageEnableDischargingActionEnableDischargingParamTypeId).value().toBool(); + controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modDiScharge, enabled); + QModbusReply *reply = storage->setStorCtlMod(controlModeFlags); + if (!reply) { + info->finish(Thing::ThingErrorHardwareFailure); + return; + } + connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); + connect(reply, &QModbusReply::finished, info, [info, reply, enabled]{ + if (reply->error() != QModbusDevice::NoError) { + info->finish(Thing::ThingErrorHardwareFailure); + return; + } + + info->thing()->setStateValue(sunspecStorageEnableDischargingStateTypeId, enabled); info->finish(Thing::ThingErrorNoError); }); } else if (action.actionTypeId() == sunspecStorageChargingRateActionTypeId) {