Arbitre : alerte EDF demande mais reseau absent (tension d'entree 0 V), nuit du 12-13/10
This commit is contained in:
@@ -2403,5 +2403,11 @@ batterie a 32 A et JEEP (branchee 13:01, 52 %) qui ne demarre pas. SOC 47 % a 12
|
||||
- `tools/certificats.mjs` : lit le certificat REELLEMENT servi par le .50 pour chaque nom (poignee de main TLS, SNI, aucune requete HTTP) ; `sensor.evcs_certificats` = nombre d'alertes (expire / < 14 j / mauvais nom = importe mais pas associe / illisible), attributs alertes, certificats, prochaine, texte. Au demarrage puis toutes les heures (minute 8). Tests `node tests/certificats/run.mjs` 10/10, deux mutations qui mordent. Premier releve reel : 4 alertes. SPARK relaie par WhatsApp.
|
||||
- airtria.fr / airtria.com ne sont pas servis par le .50 (le proxy y renvoie son certificat par defaut) : hors liste (`DOMAINES`).
|
||||
|
||||
### 13/10 (nuit) — EDF ne se fermait pas : l'ordre n'arrivait pas au disjoncteur
|
||||
- Session de nuit engagee a 01:24 (bilan : 35,1 % requis au reveil, 4,1 kWh en HC). De 01:24 a 05:57 le contacteur « claque » chaque minute dans HA : `turn_on` de l'hysteresis a hh:mm:03, retour a « off » 1,5 s plus tard **avec le contexte de l'ordre de fermeture** (personne n'a demande l'ouverture). Preuve physique : **tension d'entree du MultiPlus a 0,0 V** tout du long, courant du disjoncteur 0 A, aucun claquement entendu par le proprietaire. L'ordre n'etait pas execute par le disjoncteur Tuya (Wi-Fi selon le proprietaire). Le petit « 1 » de `victron_ac_in1_available` a chaque essai n'etait PAS du courant : ne jamais s'y fier seul.
|
||||
- Batterie 31 -> 26 % pendant la HC. Hysteresis mise en pause 05:56:42 (accord du proprietaire), disjoncteur rearme au levier 05:57:44 (tient : 1,3 puis 2,6 kW, batterie +22 A), hysteresis reactivee 06:00:16.
|
||||
- **Alerte ajoutee** (`tools/arbitrage.mjs`, cas 0 `edf_ne_ferme_pas`, sans choix -> etat `alerte` de `sensor.evcs_arbitrage`, relais SPARK existant) : EDF DEMANDE (session HC engagee, ou verrou d'hysteresis) ET tension d'entree < 100 V ET reseau <= 100 W pendant 10 min. Tests arbitrage 25/25, deux mutations qui mordent. Aucune fausse alerte au redemarrage (222 V, 2,6 kW).
|
||||
- A suivre : la fermeture A DISTANCE marche-t-elle de nouveau ? Ce soir / prochaine session, verifier que la tension d'entree monte apres l'ordre.
|
||||
|
||||
---
|
||||
*Document mis a jour le : 10/10/2026 (~16:00) — conseiller relecteur de la journee (revue calculee + pistes) ; nuit : voiture qui profite d'EDF ferme pour la batterie, nuit qui prepare le soir les jours annonces faibles ; 08/10/2026 (~00:15) — jour faible : charge maximale en HC de midi (bilan 100 %, ACM plafond + solaire) ; 07/10/2026 (~22:45) — reprise de 16 h verifiee, EDF en HP a 18:03, bilan : reprise du soir et prevision recalee sur la matinee ; bilan HC de midi, reprise du soir apres coupure en pleine chauffe, mesure ECS sur 10 min ; recharge reseau HC : courant calcule (12 kVA) et consigne non tenue ; HC de midi : AUTO ne chauffe pas (BOOST), alerte v2, Jeep (contact, relecture, zone), recharge batterie bridee a 30 A par l'ACM ; jour faible = EDF les deux fenetres HC pour le chauffe-eau, alerte BOOST, Victron Mobile refait ; 1re decision jour faible en reel, mesure ECS reparee, douches 06:00/20:00, Grafana chauffe-eau, tableaux ECS ; chauffe-eau en HC de nuit les jours faibles (decision du bilan, workflow ECS sous controle du depot, VRM, V2.3 desactive) ; garde batterie reseau : voiture bridee a 6 A au lieu d'un arret ; garde-fou concierge 2 h ; allers-retours brefs de la borne retrouves dans l'historique HA (echange VW -> JEEP de 20 s), production 14,5 kWh contre 22 prevus, defaut garde batterie en mode reseau a trancher ; voiture a midi : la batterie n'est plus comptee comme du solaire (EDF automatique les jours de depart si le surplus ne couvre pas) ; nuit 05->06 : JEEP chargee sur EDF en complete (6,32 kWh), budget 0 du a la prevision, Windy/ECMWF contre VRM, a comparer ce soir ; concierge aligne sur la preuve fin de trajet ; a verifier : nuit 05->06 et mardi faible, comparaison VRM/Forecast.Solar ; JEEP identifiee aussi par sa fin de trajet, prevision de la nuit 05->06 ; identification JEEP reussie en reel, correction humaine qui prime (refus supprime), session du 04/10 coupee ; EVCS Master en quatre onglets ; Jeep lue par Uconnect et identifiee seule, capacite JEEP 10 kWh, concierge variante (a) ; releve par photo (SPARK), hass-uconnect en attente ; ecart semaine/week-end mesure (pas de profil week-end la nuit) ; nuit du budget : budget borne au plancher prudent, sans EDF = voiture bloquee meme EDF ferme (batterie seule) ; Energie : sauts corriges ; tableau Energie complete (Sud/Ouest, batterie par integration, borne ; aucun redemarrage HA) ; kilometrage des vehicules (km/kWh, capacite, releves de reference, agent cable 15/15) ; a verifier le 04/10 au matin : nuit du budget JEEP ; concierge : vehicule non confirme demande, heure de saisie ; Grafana vehicules en tableau ; Grafana vehicules : ZERO et Invite ajoutes, session 16:46 reetiquetee ZERO ; prevision SOC 10 h ~35 % ; concierge fiable : niveau note par le script, une ligne, dedoublonnage, simulation par drapeau ; agent : message incompris = question, bourse sur demande explicite (banc final 6/6) ; a verifier : nuit du samedi 03 au dimanche 04/10 (budget < besoin JEEP), cron orange-cloture lundi 05/10 apres 17:40, comparaison VRM / Forecast.Solar lundi 05/10*
|
||||
|
||||
@@ -34,5 +34,18 @@ ok('hors-session-rien', detecterSituation({ ...rech, sessionEngagee: false }) ==
|
||||
ok('choix-1', lireChoix('1', s.choix)?.cle === '1');
|
||||
ok('choix-texte', lireChoix('je prends le 2', s.choix)?.cle === '2');
|
||||
ok('choix-inconnu', lireChoix('5', s.choix) === null && lireChoix('oui', s.choix) === null);
|
||||
// Cas 0 : releve reel du 13/10 05:54 — session de nuit engagee, contacteur qui retombe,
|
||||
// tension d'entree 0 V, reseau 0 W, SOC 26 %.
|
||||
const nuit1310 = { fenetre: 'nuit', finFenetre: '07:24', contacteurOn: false, contacteurEtat: 'off', voitureBranchee: false, borneW: 0,
|
||||
sourceMode: 'Bloqué', etat: 'vehicle_not_connected', sessionEngagee: true, verrouHysteresis: true,
|
||||
tensionEntreeV: 0, reseauW: 0, soc: 26, batterieA: -18.2, manqueKwh: 2.74, dvccA: 30 };
|
||||
const z = detecterSituation(nuit1310);
|
||||
ok('edf-ne-ferme-pas-1310', z && z.cas === 'edf_ne_ferme_pas' && z.choix.length === 0 && /0 V/.test(z.question) && /26 %/.test(z.question) && /levier/.test(z.question), JSON.stringify(z));
|
||||
ok('edf-ne-ferme-pas-contacteur-affiche-on', detecterSituation({ ...nuit1310, contacteurOn: true, contacteurEtat: 'on' })?.cas === 'edf_ne_ferme_pas');
|
||||
ok('edf-arrive-pas-d-alerte-edf', detecterSituation({ ...nuit1310, contacteurOn: true, tensionEntreeV: 229, reseauW: 2300, batterieA: 21.8 }) === null);
|
||||
ok('tension-figee-mais-reseau-mesure', detecterSituation({ ...nuit1310, contacteurOn: true, tensionEntreeV: 0, reseauW: 1500, batterieA: 21.8 }) === null);
|
||||
ok('edf-pas-demande-rien', detecterSituation({ ...nuit1310, sessionEngagee: false, verrouHysteresis: false }) === null);
|
||||
ok('hysteresis-hors-hc-alerte', detecterSituation({ ...nuit1310, fenetre: null, sessionEngagee: false })?.cas === 'edf_ne_ferme_pas');
|
||||
ok('tension-illisible-pas-d-alerte', detecterSituation({ ...nuit1310, tensionEntreeV: NaN }) === null);
|
||||
console.log(f ? `\n${f} ECHEC(S)` : '\nARBITRAGE OK');
|
||||
process.exit(f ? 1 : 0);
|
||||
|
||||
@@ -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 »
|
||||
|
||||
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user