sensor.evcs_reseau : verdict de raccordement conscient du contacteur (un 0 fige n'est pas une panne quand EDF est ouvert)
Incident du 26/09 : l'agent vocal a annonce le capteur reseau bloque a 07:24, alors que le contacteur s'etait ouvert a la fin des heures creuses. Le verdict ne juge l'age de la mesure que contacteur ferme ; ouvert, c'est non_raccorde. Tests diagnostics 37 -> 48, trois mutations qui mordent. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011xd7aRDEChdShwsECohnDN
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
// Les cas PV reprennent les gammes du banc OpenClaw (HANDOFF §77) : G3, G4, G5, G7.
|
||||
// node tests/diagnostics-agent/run.mjs
|
||||
import fs from 'node:fs';
|
||||
import { diagnosticPv, etatCellules, productionJour, chargeSolaire, bilanNuit, MPPT_MODES, ORIGINE_PAR_SOURCE } from '../../tools/diagnostics-agent.mjs';
|
||||
import { diagnosticPv, etatCellules, productionJour, chargeSolaire, bilanNuit, etatReseau, MPPT_MODES, ORIGINE_PAR_SOURCE } from '../../tools/diagnostics-agent.mjs';
|
||||
|
||||
const LIM = 'voltage_current_limited', ACT = 'mppt_active';
|
||||
function st({ pv, conso, reseau, soc = 80, courant = 0, edf = 'off', modes }) {
|
||||
@@ -177,6 +177,52 @@ for (const [nom, r, test] of bn) {
|
||||
console.log(`${ok ? 'OK ' : 'KO '} ${nom}`);
|
||||
}
|
||||
|
||||
const n = cas.length + cel.length + prod.length + charge.length + 1 + bn.length;
|
||||
// Raccordement reseau. Cas de reference : 26/09 11:38, contacteur ouvert a 07:24.
|
||||
const T = new Date('2026-09-26T09:38:00Z');
|
||||
function rs({ sw = 'off', swA = '2026-09-26T05:24:03Z', ac = 0, gp = 0, gpA = '2026-09-26T05:24:05Z', settle }) {
|
||||
const m = new Map();
|
||||
const put = (id, v, at) => m.set(id, { entity_id: id, state: v === null ? 'unavailable' : String(v), last_changed: at });
|
||||
put('switch.edf_general_ok_switch', sw, swA);
|
||||
put('sensor.victron_ac_in1_available', ac, swA);
|
||||
put('sensor.airtria_mpii_v1_active_ac_input', ac ? 'ac_input_1' : 'not_connected', swA);
|
||||
put('sensor.victron_grid_power_l1', gp, gpA);
|
||||
if (settle !== undefined) put('input_number.evcs_grid_settle_seconds', settle, swA);
|
||||
return m;
|
||||
}
|
||||
const res = [
|
||||
['INCIDENT 26/09 : contacteur ouvert a 07:24, 0 W inchange depuis 4 h -> non_raccorde, PAS muet',
|
||||
etatReseau(rs({}), T), (r) => r.etat === 'non_raccorde' && r.attributs.import_w === 0 && r.attributs.depuis_heure === '07:24'],
|
||||
['contacteur ferme, reseau vu, mesure fraiche -> raccorde avec import',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:00:00Z', ac: 1, gp: 850, gpA: '2026-09-26T09:37:50Z' }), T),
|
||||
(r) => r.etat === 'raccorde' && r.attributs.import_w === 850],
|
||||
['contacteur ferme depuis 38 min, MultiPlus ne voit pas le reseau -> mesure_muette',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:00:00Z', ac: 0 }), T),
|
||||
(r) => r.etat === 'mesure_muette' && r.attributs.import_w === null],
|
||||
['contacteur ferme, reseau vu, puissance inchangee depuis 30 min -> mesure_muette',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:00:00Z', ac: 1, gp: 0, gpA: '2026-09-26T09:08:00Z' }), T),
|
||||
(r) => r.etat === 'mesure_muette'],
|
||||
['contacteur ferme, puissance unavailable -> mesure_muette',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:00:00Z', ac: 1, gp: null }), T), (r) => r.etat === 'mesure_muette'],
|
||||
['fermeture il y a 60 s, ac_in pas encore la -> etablissement, pas muet',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:37:00Z', ac: 0 }), T), (r) => r.etat === 'etablissement'],
|
||||
['helper d etablissement lu : 30 s -> au-dela, ac_in 0 = muet',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:37:00Z', ac: 0, settle: 30 }), T), (r) => r.etat === 'mesure_muette'],
|
||||
['fermeture il y a 5 min, puissance inchangee depuis : pas encore figee',
|
||||
etatReseau(rs({ sw: 'on', swA: '2026-09-26T09:33:00Z', ac: 1, gp: 40, gpA: '2026-09-26T09:34:00Z' }), T),
|
||||
(r) => r.etat === 'raccorde'],
|
||||
['contacteur ouvert mais reseau vu -> incoherent',
|
||||
etatReseau(rs({ ac: 1 }), T), (r) => r.etat === 'incoherent'],
|
||||
['contacteur ouvert mais import 900 W -> incoherent',
|
||||
etatReseau(rs({ gp: 900, gpA: '2026-09-26T09:37:00Z' }), T), (r) => r.etat === 'incoherent'],
|
||||
['contacteur unavailable -> indetermine',
|
||||
etatReseau(rs({ sw: null }), T), (r) => r.etat === 'indetermine'],
|
||||
];
|
||||
for (const [nom, r, test] of res) {
|
||||
const ok = test(r);
|
||||
if (!ok) { ko++; console.log(JSON.stringify(r)); }
|
||||
console.log(`${ok ? 'OK ' : 'KO '} ${nom}`);
|
||||
}
|
||||
|
||||
const n = cas.length + cel.length + prod.length + charge.length + 1 + bn.length + res.length;
|
||||
console.log(`\n${n - ko}/${n}`);
|
||||
process.exit(ko ? 1 : 0);
|
||||
|
||||
Reference in New Issue
Block a user