SunSpec: Fix #698 enable charging/discharging actions for energy storages

master
Simon Stürz 2025-04-10 14:32:20 +02:00
parent 8f47c12b23
commit b3d84e8374
1 changed files with 26 additions and 9 deletions

View File

@ -488,25 +488,42 @@ void IntegrationPluginSunSpec::executeAction(ThingActionInfo *info)
} }
info->finish(Thing::ThingErrorNoError); info->finish(Thing::ThingErrorNoError);
}); });
} else if (action.actionTypeId() == sunspecStorageEnableChargingActionTypeId || action.actionTypeId() == sunspecStorageEnableDischargingActionTypeId) { } else if (action.actionTypeId() == sunspecStorageEnableChargingActionTypeId) {
SunSpecStorageModel::Storctl_modFlags controlModeFlags; SunSpecStorageModel::Storctl_modFlags controlModeFlags = storage->storCtlMod();
if (action.param(sunspecStorageEnableChargingActionEnableChargingParamTypeId).value().toBool()) bool enabled = action.param(sunspecStorageEnableChargingActionEnableChargingParamTypeId).value().toBool();
controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modCharge); controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modCharge, enabled);
if (thing->stateValue(sunspecStorageEnableDischargingStateTypeId).toBool())
controlModeFlags.setFlag(SunSpecStorageModel::Storctl_modDiScharge);
QModbusReply *reply = storage->setStorCtlMod(controlModeFlags); QModbusReply *reply = storage->setStorCtlMod(controlModeFlags);
if (!reply) { if (!reply) {
info->finish(Thing::ThingErrorHardwareFailure); info->finish(Thing::ThingErrorHardwareFailure);
return; return;
} }
connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); 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) { if (reply->error() != QModbusDevice::NoError) {
info->finish(Thing::ThingErrorHardwareFailure); info->finish(Thing::ThingErrorHardwareFailure);
return; 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); info->finish(Thing::ThingErrorNoError);
}); });
} else if (action.actionTypeId() == sunspecStorageChargingRateActionTypeId) { } else if (action.actionTypeId() == sunspecStorageChargingRateActionTypeId) {