Arbitre : alerte EDF demande mais reseau absent (tension d'entree 0 V), nuit du 12-13/10

This commit is contained in:
Tallagrand Thierry
2026-10-13 06:07:08 +02:00
parent 4e144739ee
commit 3146093b05
4 changed files with 44 additions and 0 deletions

View File

@@ -28,10 +28,31 @@ const VOITURE_ABSENTE_OU_PLEINE = /not_connected|done|full|complete|charged/i;
* vehicule : selecteur (VW, JEEP, ZERO)
* modeNuit : 'sans_edf' | 'complete'
* sessionEngagee, manqueKwh, soc, batterieA, dvccA : recharge de la batterie (cas 2)
* verrouHysteresis, tensionEntreeV, reseauW, contacteurEtat : EDF demande mais absent (cas 0)
* @returns {null | { cas, question, choix: [{ cle, libelle, ordre: null | { ordre, valeur } }] }}
* choix vide = ALERTE : rien a decider, seulement a signaler.
*/
export function detecterSituation(e) {
// CAS 0 — ALERTE (13/10/2026) : EDF est DEMANDE (session HC engagee, ou verrou
// d'hysteresis) mais le reseau N'ARRIVE PAS. Nuit du 12-13/10 : session de
// nuit engagee a 01:24, ordre de fermeture envoye chaque minute, le
// disjoncteur connecte n'a jamais ferme (tension d'entree du MultiPlus a
// 0 V, aucun claquement ; HA affichait « on » par anticipation puis le module
// renvoyait « off ») : batterie 31 -> 26 % en 4 h 30, sans que personne le
// sache. Rearme au levier a 05:57, il a tenu. Ni la commande ni la mesure
// ne suffisent seules : on juge sur la TENSION reelle d'entree et la
// puissance reseau. Les 10 min de DUREE_MIN couvrent l'etablissement normal.
const edfDemande = (e.fenetre && e.sessionEngagee) || e.verrouHysteresis;
if (edfDemande && Number.isFinite(Number(e.tensionEntreeV)) && Number(e.tensionEntreeV) < 100
&& !(Number(e.reseauW) > 100)) {
const pourquoi = e.fenetre && e.sessionEngagee ? `la session d'heures creuses de ${e.fenetre} est engagee` : `l'hysteresis demande EDF (batterie basse)`;
return {
cas: 'edf_ne_ferme_pas',
question: `EDF ne se ferme pas : ${pourquoi}, mais le reseau n'arrive pas (tension d'entree ${Math.round(Number(e.tensionEntreeV))} V, contacteur affiche « ${e.contacteurEtat || 'inconnu'} »). `
+ `L'ordre de fermeture n'est pas execute par le disjoncteur EDF GENERAL OK (Wi-Fi ?). La batterie ${Number.isFinite(Number(e.soc)) ? `est a ${Math.round(Number(e.soc))} % et ` : ''}se vide : va le rearmer au levier, puis previens la session EVCS.`,
choix: [],
};
}
// CAS 1 — voiture branchee, non pleine, qui NE CHARGE PAS alors qu'EDF est deja
// ferme en heures creuses. Nuit du 07-08/10 : VW « bloquee » (sans EDF) de 01:24
// a 05:14. Elargi le 10/10 : HC de midi du 09/10, JEEP en « Reseau HC autorise »

View File

@@ -2216,6 +2216,10 @@ async function arbitrer(sql, client, st) {
soc: Number(st.get('sensor.victron_battery_soc')?.state),
batterieA: Number(st.get('sensor.victron_battery_current')?.state),
dvccA: Number(st.get('sensor.victron_max_charge_current_setting')?.state),
verrouHysteresis: txt(st.get('input_boolean.victron_grid_hysteresis_latch')?.state) === 'on',
tensionEntreeV: Number(st.get('sensor.airtria_mpii_v1_input_voltage_l1')?.state),
reseauW: Number(st.get('sensor.victron_grid_power_l1')?.state),
contacteurEtat: txt(st.get('switch.edf_general_ok_switch')?.state),
});
const { rows: [ouvert] } = await client.query(`SELECT * FROM arbitrage WHERE ferme IS NULL ORDER BY ouvert DESC LIMIT 1`);
const publier = (etat, a) => publierCapteur('sensor.evcs_arbitrage', etat, { friendly_name: 'Arbitrage demande au proprietaire', ...a });