From 1906d2116aaf800ea9d16c5b99c1829eda4b0cd3 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Thu, 27 Aug 2026 10:09:08 +0200 Subject: [PATCH] =?UTF-8?q?[upstream-fix]=20le=20repli=20sur=20ChargingMod?= =?UTF-8?q?eEco=20emportait=20des=20modes=20sans=20=C3=A9ch=C3=A9ance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit prepareInformation() repliait sur ChargingModeEco toute borne dont nextEndTime() est invalide, dès lors que son mode n'était pas ChargingModeNormal. Or ce repli n'a de sens que pour les modes qui EXIGENT une échéance — c'est bien ce que font les deux autres sites du même repli (planSpotMarketCharging, planSurplusCharging), qui testent explicitement EcoWithTargetTime / EcoMinWithTargetTime. C'est ce site-ci qui a perdu la garde en 2070b0d, quand les deux modes ETM ont été ajoutés. Deux conséquences, toutes deux silencieuses : - ChargingModeEcoWithMinCurrent était réécrit en ChargingModeEco au cycle suivant, PERSISTÉ et notifié par chargingInfoChanged. Le mode « éco + courant minimum garanti » ne survivait donc jamais à un cycle, et la branche d'adjustEvChargers() qui l'applique était morte. Du point de vue de l'app, un réglage posé par l'utilisateur disparaissait tout seul. - ChargingModeEco était « replié » sur lui-même à CHAQUE cycle : setChargingMode, storeChargingInfo (écriture disque) et une notification chargingInfoChanged, sans qu'aucune valeur ne change. Un *Changed qui ne change rien, à chaque tour, pour chaque borne en éco. Trouvé en écrivant le test d'aller-retour de SetChargingInfo, qui échouait sur la réécriture du mode. Suite charging 16/16, simulation `run` 16/16. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_017TVywtayEeoRJ2yWUW4iZj --- energyplugin/smartchargingmanager.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/energyplugin/smartchargingmanager.cpp b/energyplugin/smartchargingmanager.cpp index 22a9e48..2661116 100644 --- a/energyplugin/smartchargingmanager.cpp +++ b/energyplugin/smartchargingmanager.cpp @@ -577,17 +577,31 @@ void SmartChargingManager::prepareInformation(const QDateTime ¤tDateTime) continue; } + // [ETM] Le repli ne concerne QUE les modes qui EXIGENT une échéance. La condition + // portait sur « mode != Normal », donc elle emportait aussi les deux modes qui n'ont + // jamais eu d'échéance : + // - ChargingModeEcoWithMinCurrent était réécrit en ChargingModeEco au cycle suivant, + // PERSISTÉ et notifié — le mode « éco + courant minimum garanti » ne survivait + // donc jamais à un cycle, et la branche 4 d'adjustEvChargers() qui l'applique + // était morte. Réglage détruit en silence, du point de vue de l'app. + // - ChargingModeEco était « replié » sur lui-même à CHAQUE cycle : setChargingMode, + // storeChargingInfo (écriture disque) et chargingInfoChanged (notification) sans + // qu'aucune valeur ne change. Un *Changed qui ne change rien (invariant 11). + // Les deux autres sites du même repli (planSpotMarketCharging, planSurplusCharging) + // portent déjà cette garde ; c'est ce site-ci qui l'avait perdue en 7588473. + const ChargingInfo::ChargingMode currentMode = m_chargingInfos.value(evCharger->id()).chargingMode(); + const bool exigeUneEcheance = currentMode == ChargingInfo::ChargingModeEcoWithTargetTime + || currentMode == ChargingInfo::ChargingModeEcoMinWithTargetTime; + QDateTime endDateTime = m_chargingInfos.value(evCharger->id()).nextEndTime(currentDateTime); - if (!endDateTime.isValid() && m_chargingInfos.value(evCharger->id()).chargingMode() != ChargingInfo::ChargingModeNormal) { + if (!endDateTime.isValid() && exigeUneEcheance) { qCDebug(dcNymeaEnergy()).nospace() << "No valid target time set for " << evCharger->name(); - const ChargingInfo::ChargingMode currentMode = m_chargingInfos.value(evCharger->id()).chargingMode(); ChargingInfo::ChargingMode fallbackMode; if (currentMode == ChargingInfo::ChargingModeEcoMinWithTargetTime) { qCDebug(dcNymeaEnergy()) << "Resetting to ECO with min current mode."; fallbackMode = ChargingInfo::ChargingModeEcoWithMinCurrent; } else { - if (currentMode == ChargingInfo::ChargingModeEcoWithTargetTime) - qCDebug(dcNymeaEnergy()) << "Resetting to ECO mode without time."; + qCDebug(dcNymeaEnergy()) << "Resetting to ECO mode without time."; fallbackMode = ChargingInfo::ChargingModeEco; } m_chargingInfos[evCharger->id()].setChargingMode(fallbackMode);