Capteur de charge : origine explicite par libelle (incident 25/09, batterie publiee en solaire)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011uJ47NxgfpGnuuMr3f2n7Z
This commit is contained in:
Tallagrand Thierry
2026-09-25 12:05:04 +02:00
parent 13d9640130
commit beed8028ca
3 changed files with 65 additions and 6 deletions

View File

@@ -208,6 +208,29 @@ export function productionJour(st, maintenant = new Date()) {
// l'expliquer (excedent, chargeurs brides), sans decider.
export const SEUIL_CHARGE_W = 300; // meme seuil que les sessions de charge
// ⚠️ Correspondance EXPLICITE, libelle par libelle, de la table
// `sourceModeLabel` de src/nodes/HA_SERVICE_CALLS_OUTPUT.js. Defaut du
// 25/09 : la premiere version classait « tout ce qui n'est pas Reseau » comme
// solaire, et a publie `en_charge_solaire` de 01:25 a 06:00 pendant que la JEEP
// chargeait sur la BATTERIE en pleine nuit (« Assistance batterie nuit »). L'agent
// l'a repete fidelement. Un libelle inconnu donne `en_charge` sans origine :
// on ne devine jamais d'ou vient l'energie.
export const ORIGINE_PAR_SOURCE = {
'Solaire': 'en_charge_solaire',
'Potentiel solaire': 'en_charge_solaire',
'Probe hybride': 'en_charge_sonde',
'Assistance batterie nuit': 'en_charge_batterie',
'Réseau HC autorisé': 'en_charge_reseau',
'Réseau forcé': 'en_charge_reseau',
};
const PHRASE_ORIGINE = {
en_charge_solaire: 'sur le solaire',
en_charge_sonde: 'en essai court pour provoquer la production solaire',
en_charge_batterie: 'sur la batterie de la maison (assistance de nuit)',
en_charge_reseau: 'sur le reseau EDF',
en_charge: 'depuis une source que le controleur ne precise pas',
};
export function chargeSolaire(st) {
const txt = (id) => { const s = st.get(id)?.state; return s === undefined || s === 'unavailable' || s === 'unknown' ? null : String(s); };
const branche = txt('binary_sensor.victron_evcs_vehicle_connected');
@@ -235,9 +258,10 @@ export function chargeSolaire(st) {
return r('non_branchee', 'Aucun vehicule branche. Une fois branche, le controleur decidera lui-meme.');
}
if (puissance > SEUIL_CHARGE_W) {
const reseau = /^R[ée]seau/.test(source);
return r(reseau ? 'en_charge_reseau' : 'en_charge_solaire',
`La voiture charge (${Math.round(puissance)} W), source decidee par le controleur : ${source}.`);
const etat = ORIGINE_PAR_SOURCE[source] || 'en_charge';
return r(etat,
`La voiture charge (${Math.round(puissance)} W) ${PHRASE_ORIGINE[etat]} ` +
`(source decidee par le controleur : ${source}).`);
}
return r('en_attente',
`Voiture branchee mais pas en charge. Le controleur dit : ${raison || 'sans raison publiee'} (source : ${source}).`);