refactor(arbitre): IScheduler *m_strategy à côté de m_scheduler (brief 4 T0.5)

update() interroge désormais la stratégie par son interface. Sans endpoint d'optimiseur,
m_strategy pointe sur le rule-based : même objet, même appel. m_scheduler garde son type
concret — le rule-based restera le repli et le plan ombre d'une stratégie externe (T0 §0.1).
Aucun SocketScheduler.

Neutre : référence de décisions IDENTIQUE (23 739 lignes) ; suites inchangées
(simulation 211, loadmodel 135, charging 80, spotmarket 36 + 11 ignorés, 0 échec) ;
aucun nouveau gabarit de journal >= info.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-10-16 07:45:45 +02:00
parent d4b7d4dced
commit ab36143385
2 changed files with 12 additions and 2 deletions

View File

@ -48,6 +48,7 @@ EnergyArbitrator::EnergyArbitrator(EnergyManager *em, ThingManager *tm,
QObject *parent)
: SmartChargingManager(em, tm, sm, conf, parent)
, m_scheduler(new RuleBasedScheduler(this, this))
, m_strategy(m_scheduler)
, m_tm(tm)
{
// --- L2 : watchdog fraîcheur compteur (SAFETY.md §L2) ---
@ -404,7 +405,7 @@ void EnergyArbitrator::update(const QDateTime &currentDateTime)
// SCM : 1.updateManual 2.prepareInfo 3.verifyOverload 4.verifyRecovery
// 5.planSpot 6.planSurplus 7.adjustEv
// ETM : idem 1-4 ; insertions ETM entre 4 et 7 ;
// planSpot + planSurplus appelés via m_scheduler->getPlan() (position 5-6).
// planSpot + planSurplus appelés via m_strategy->getPlan() (position 5-6).
// 1-4 : préparation + sécurité (même ordre que l'amont)
updateManualSoCsWithoutMeter(currentDateTime);
@ -470,7 +471,7 @@ void EnergyArbitrator::update(const QDateTime &currentDateTime)
// que le contexte rapporte, et les survivantes y sont marquées avant que le plan ne soit
// fait. Les évaluer après le plan servirait un cycle de plus une dérogation déjà finie.
evaluerDerogations(ctx, currentDateTime);
Plan plan = m_scheduler->getPlan(ctx);
Plan plan = m_strategy->getPlan(ctx);
Slot slot = plan.slotCovering(currentDateTime);
// Le LIBELLÉ n'est pas dans le motif : il est substitué AU RENDU (cf. decisionreason.h).

View File

@ -1022,6 +1022,15 @@ private:
static bool telemetrySignificantlyDiffers(const QVariantMap &a, const QVariantMap &b);
RuleBasedScheduler *m_scheduler = nullptr;
/*!
* \brief La stratégie que update() interroge — c'est le SEUL appel de getPlan() du cycle.
*
* Sans endpoint d'optimiseur, elle pointe sur \c m_scheduler : même objet, même appel.
* \c m_scheduler garde son type concret parce que le rule-based est aussi le repli et le
* plan ombre d'une stratégie externe (brief 4 T0 §0.1 : ses effets de bord — actions du
* proxy, comptabilité éco, réserve batterie — doivent tourner à chaque cycle).
*/
IScheduler *m_strategy = nullptr;
QHash<QString, EvAdapter *> m_adapters; //!< loadId (ThingId string) → EvAdapter*.
/*!
* \brief [3g-2] Bornes commandées par le waterfall AU CYCLE COURANT.