Le conseiller passe de planificateur a observateur
Idee du proprietaire, et elle est meilleure que la mienne : ce systeme n a pas besoin qu on lui suggere une strategie de plus, il a besoin que quelqu un VOIE que « je coupe EDF, non je remets, et hop je coupe » est absurde. Cinq automates ecrivent sur la meme installation, chacun localement correct, aucun ne voit les autres. Leurs pannes sont des CONTRADICTIONS, et elles ne se lisent que dans la SUITE des evenements — jamais dans un instantane. Le 12/09 au matin le contacteur reseau a bascule toutes les 4 minutes pendant dix minutes : une automatisation HA coupait a 35 % de SOC, l hysteresis rallumait. Aucun automate ne l a vu ; un humain oui. Sortie elargie : `constat`, `gravite` (aucune/faible/moyenne/haute) et `ce_qui_cloche`, valides strictement, publies dans trois helpers et dans le logbook. Le snapshot porte desormais l anciennete des cinq transitions cles (contacteur, verrou, takeover, etat EVCS, mode ACM). ⚠️ VALIDATION SCINDEE. Essai sur l oscillation reelle : le modele a produit un constat JUSTE et un `current_max_a` de 100, hors bornes. La validation tout-ou-rien jetait le diagnostic avec le champ fautif — c est-a-dire exactement ce qu on lui demande, perdu a cause de ce qu on ne lui demande plus. Les champs d ACTION gardent leurs bornes mais sont NEUTRALISES au lieu de faire echouer l observation ; `actionUtilisable` est le seul drapeau qui autoriserait un jour un cablage, et les compteurs ne comptent que lui. Tests advisor : +6. Deux attendus mis a la nouvelle semantique dans le meme commit (hors bornes -> observation gardee, action neutralisee). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -34,10 +34,19 @@ setText('input_text.evcs_advisor_last_run', stampParis());
|
||||
setText('input_text.evcs_advisor_model', modelUsed);
|
||||
|
||||
if (status === 'ok' && advice) {
|
||||
// Observation — la sortie principale desormais.
|
||||
setText('input_text.evcs_advisor_constat', advice.constat);
|
||||
setText('input_text.evcs_advisor_gravite', advice.gravite);
|
||||
setText('input_text.evcs_advisor_ce_qui_cloche', advice.ceQuiCloche || 'rien de signale');
|
||||
|
||||
// Recommandations
|
||||
setText('input_text.evcs_advisor_strategy', advice.strategy);
|
||||
setNumber('input_number.evcs_advisor_night_target_soc', advice.nightTargetSoc);
|
||||
setNumber('input_number.evcs_advisor_current_max_a', advice.currentMaxA);
|
||||
// Les champs d action ne sont publies que s ils sont exploitables : un
|
||||
// helper numerique ne doit jamais porter une valeur hors bornes.
|
||||
if (advice.actionUtilisable) {
|
||||
setNumber('input_number.evcs_advisor_night_target_soc', advice.nightTargetSoc);
|
||||
setNumber('input_number.evcs_advisor_current_max_a', advice.currentMaxA);
|
||||
}
|
||||
setText('input_text.evcs_advisor_ev_charge_tonight', advice.evChargeTonight);
|
||||
setText('input_text.evcs_advisor_reason', `[${Math.round(advice.confidence * 100)}%] ${advice.reason}`);
|
||||
|
||||
@@ -63,7 +72,7 @@ if (status === 'ok' && advice) {
|
||||
// reference, pas contre la valeur appliquee qui peut elle-meme etre fausse.
|
||||
// Bilan indisponible => on ne compte rien plutot que de compter faux.
|
||||
const refSoc = Number(context.balanceRequiredSoc);
|
||||
const bilanUtilisable = context.balanceStatus === 'ok' && Number.isFinite(refSoc);
|
||||
const bilanUtilisable = advice.actionUtilisable && context.balanceStatus === 'ok' && Number.isFinite(refSoc);
|
||||
if (bilanUtilisable) {
|
||||
const ecart = Math.abs(advice.nightTargetSoc - refSoc);
|
||||
if (ecart <= 5) {
|
||||
@@ -81,7 +90,7 @@ if (status === 'ok' && advice) {
|
||||
// Trace logbook pour l'historique long terme
|
||||
push('logbook', 'log', {
|
||||
name: 'EVCS Advisor (ombre)',
|
||||
message: `${advice.strategy} | cible nuit ${advice.nightTargetSoc}% | ${advice.evChargeTonight === 'oui' ? 'charge VE cette nuit' : advice.evChargeTonight === 'non' ? 'pas de charge nuit' : 'VE sans objet'} | ${divergenceText} | ${advice.reason}`,
|
||||
message: `[${advice.gravite}] ${advice.constat}${advice.ceQuiCloche ? ` || ${advice.ceQuiCloche}` : ''} || ${advice.strategy} | cible nuit ${advice.nightTargetSoc}% | ${advice.evChargeTonight === 'oui' ? 'charge VE cette nuit' : advice.evChargeTonight === 'non' ? 'pas de charge nuit' : 'VE sans objet'} | ${divergenceText} | ${advice.reason}`,
|
||||
entity_id: 'input_text.evcs_advisor_strategy',
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user