Fenetre d etablissement : ne plus decider sur les mesures du transitoire
A la fermeture du contacteur, PV, import et courant batterie ne decrivent aucun regime permanent pendant ~150 s (mesure du 31/08). La boucle de 30 s y prenait cinq decisions, et la moyenne PV 10 min en gardait la trace dix minutes de plus -- le systeme lisait "plus de soleil", en concluait qu il avait besoin du reseau, et confirmait sa propre premisse. Aucun seuil nouveau : le systeme publiait deja l horodatage de la transition et personne ne le lisait. Pendant la fenetre, on ne demarre pas et on ne laisse pas une charge s arreter sur ces mesures ; les step-down restent libres. Deux asymetries voulues : la fenetre ne s ouvre qu a l ARRIVEE du reseau (a sa disparition les onduleurs reprennent tout, les gardes doivent agir plus vite), et elle suspend le confort, jamais le risque. Golden 42 -> 48, chaque cas apparie a son contrefactuel hors fenetre. Mutation : gridSettling force a false -> 2 echecs cibles, restauration -> 48/48. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -249,6 +249,21 @@ const parsed = {
|
||||
(low(input.grid_state || 'off') === 'on') ||
|
||||
(num(input.victron_acin1_available ?? input.ac_in1_available, 0) === 1),
|
||||
|
||||
// FENETRE D'ETABLISSEMENT (31/08/2026) — age, en secondes, de la derniere
|
||||
// transition du reseau. On retient la plus RECENTE des deux sources : la
|
||||
// presence physique AC-IN (celle qui declenche reellement le transitoire) et
|
||||
// le contacteur (qui peut bouger sans qu'AC-IN suive, disjoncteur ouvert).
|
||||
// Horodatage absent ou nul => age tres grand => aucune fenetre, comportement
|
||||
// historique. On ne devine jamais une transition qu'on n'a pas observee.
|
||||
gridTransitionAgeSec: (() => {
|
||||
const ts = Math.max(
|
||||
num(input.acin1_last_changed_ts, 0),
|
||||
num(input.grid_switch_last_changed_ts, 0)
|
||||
);
|
||||
if (!(ts > 0)) return Number.POSITIVE_INFINITY;
|
||||
return Math.max(0, (nowMs / 1000) - ts);
|
||||
})(),
|
||||
|
||||
todayRemainingKwh: Math.max(0, num(input.today_remaining_kwh, 0)),
|
||||
tomorrowKwh: Math.max(0, num(input.tomorrow_kwh, 0)),
|
||||
|
||||
@@ -398,6 +413,12 @@ const params = {
|
||||
advisorStatusOk: cleanText(input.advisor_status).toLowerCase() === 'ok',
|
||||
advisorLastRunMs: parseAdvisorRunToMs(cleanText(input.advisor_last_run)),
|
||||
|
||||
// Duree de la fenetre d'etablissement. Valeur mesuree le 31/08/2026 : le
|
||||
// transitoire de fermeture dure ~150 s (import 1985 -> 25 W et 2600 -> 52 W,
|
||||
// deux campagnes), on prend 180 s de marge. Reglable sans redeploiement via
|
||||
// input_number.evcs_grid_settle_seconds ; absent => 180.
|
||||
gridSettleSeconds: clamp(num(input.grid_settle_seconds, 180), 0, 900),
|
||||
|
||||
probeEnabled: low(input.probe_enabled || 'off') === 'on',
|
||||
probeMinutes: Math.max(1, num(input.probe_minutes, 3)),
|
||||
probeRetryMinutes: Math.max(5, num(input.probe_retry_minutes, 45)),
|
||||
|
||||
Reference in New Issue
Block a user