- helpers: input_select.victron_evcs_vehicle, departure_time_jeep (06:30), toggle allow_grid_departure_urgent (OFF) — package victron_evcs_vehicles.yaml - INPUT_PARSE: departureTimeMin par véhicule sélectionné - WINDOWS: fenêtre départ ≤120min hors HC → grid_hc_allowed (solar_only prioritaire), état collant departure_done_idle à la fin de charge - BCL: gridAllowedBySoc += departureUrgentActive - DECISION: branche collante departure_done_idle au-dessus des gardes - HA_SERVICE_CALLS: takeover helper tenu pendant P9 (ACM + hystérésis) - hystérésis: cut immédiat étendu à departure_done_idle (patch rejouable) - golden 29→33, HANDOFF §21
43 lines
1.5 KiB
JavaScript
43 lines
1.5 KiB
JavaScript
#!/usr/bin/env node
|
|
// Patch 09/08/2026 — P9 : étend la coupure immédiate (bypass min_on) à l'état
|
|
// collant 'departure_done_idle' (charge terminée pendant la fenêtre départ,
|
|
// jour). Même sûreté que night_recovery_done_idle : état collant, le takeover
|
|
// ne revient pas. Prérequis : patch-20260809-e2-recovery-done-cut.mjs.
|
|
// Rejouable.
|
|
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
const FILE = path.join(ROOT, 'workflows/victron-grid-hysteresis-v1.json');
|
|
|
|
const wf = JSON.parse(fs.readFileSync(FILE, 'utf8'));
|
|
const node = wf.nodes.find(n => n.name === 'Compute Grid Hysteresis');
|
|
if (!node) throw new Error('Node "Compute Grid Hysteresis" introuvable');
|
|
|
|
let code = node.parameters.jsCode;
|
|
|
|
if (code.includes("departure_done_idle")) {
|
|
console.log('Déjà appliqué — rien à faire.');
|
|
process.exit(0);
|
|
}
|
|
|
|
const anchor = ` evcsSurplusState === 'night_recovery_done_idle' &&
|
|
soc >= gridSocOff
|
|
) {`;
|
|
|
|
const insertion = ` (
|
|
evcsSurplusState === 'night_recovery_done_idle' ||
|
|
evcsSurplusState === 'departure_done_idle'
|
|
) &&
|
|
soc >= gridSocOff
|
|
) {`;
|
|
|
|
if (!code.includes(anchor)) throw new Error('Ancre E2 introuvable — appliquer d abord patch-20260809-e2-recovery-done-cut.mjs');
|
|
code = code.replace(anchor, insertion);
|
|
|
|
node.parameters.jsCode = code;
|
|
fs.writeFileSync(FILE, JSON.stringify(wf, null, 2) + '\n');
|
|
console.log('Patch appliqué →', FILE, `(jsCode ${code.length} chars)`);
|