sensor.evcs_import_jour_kwh : energie importee d'EDF depuis minuit (le « Depuis reseau » de VRM)
Le proprietaire veut que l'agent vocal lui evite d'ouvrir VRM. « Combien ai-je importe » est une quantite : delta des compteurs cumules AC-in du MultiPlus (vers ac_out + vers inverter) depuis leur valeur a minuit, lue une fois par jour dans l'historique HA. Compteur EDF publie en recoupement. Remise a zero -> indetermine, jamais d'import negatif. Les trois compteurs entrent aussi dans la table mesure (manque note au HANDOFF §76). Tests diagnostics 48 -> 54, deux 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:
@@ -160,7 +160,7 @@ export const RENDEMENTS_JOUR = [
|
||||
['v1', 'sensor.v1_yield_today'],
|
||||
];
|
||||
|
||||
function minuitLocal(maintenant) {
|
||||
export function minuitLocal(maintenant) {
|
||||
const jour = new Intl.DateTimeFormat('en-CA', { timeZone: 'Europe/Paris' }).format(maintenant);
|
||||
// Heure de Paris a minuit exprimee en UTC : on cherche le decalage du jour.
|
||||
const decalage = new Date(maintenant.toLocaleString('en-US', { timeZone: 'Europe/Paris' })) -
|
||||
@@ -410,3 +410,59 @@ export function etatReseau(st, maintenant = new Date()) {
|
||||
return verdict('raccorde',
|
||||
`Reseau EDF raccorde depuis ${attributs.depuis_heure ?? '?'}, import ${attributs.import_w} W.`);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// Energie importee d'EDF depuis minuit — le chiffre « Depuis reseau » de VRM
|
||||
// ---------------------------------------------------------------------
|
||||
// Demande du proprietaire le 26/09 : l'agent vocal doit lui eviter d'ouvrir VRM.
|
||||
// La question « combien ai-je importe » est une QUANTITE ; la puissance
|
||||
// instantanee (victron_grid_power_l1) n'y repond pas, elle vaut 0 des que le
|
||||
// contacteur est ouvert.
|
||||
// Source : les compteurs cumules AC-in du MultiPlus, sains et monotones (HANDOFF
|
||||
// §76 : 1,60 kWh la nuit du 24/09, recoupes par le compteur EDF a 1,53). Import
|
||||
// = vers la maison (ac_out) + vers la batterie (inverter). Le compteur du
|
||||
// contacteur EDF est publie a cote comme recoupement, pas additionne.
|
||||
// ⚠️ Compteurs sans last_reset : une valeur courante INFERIEURE a celle de
|
||||
// minuit est une remise a zero, pas un import negatif -> indetermine.
|
||||
export const COMPTEURS_IMPORT = [
|
||||
'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_ac_out',
|
||||
'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_inverter',
|
||||
];
|
||||
export const COMPTEUR_EDF = 'sensor.edf_general_ok_energie_totale';
|
||||
|
||||
// courant, minuit : { [entity_id]: nombre | null }
|
||||
export function importJour(courant, minuit) {
|
||||
const detail = {};
|
||||
const muets = [];
|
||||
let total = 0;
|
||||
for (const id of COMPTEURS_IMPORT) {
|
||||
const c = courant[id], m = minuit[id];
|
||||
const court = id.replace('sensor.airtria_mpii_v1_energy_from_ac_in_1_to_', 'vers_');
|
||||
if (!Number.isFinite(c) || !Number.isFinite(m)) { muets.push(court); detail[court] = null; continue; }
|
||||
if (c < m) {
|
||||
return { etat: 'indetermine', attributs: { statut: 'indetermine',
|
||||
explication: `Compteur ${court} remis a zero depuis minuit : import du jour inconnu.` } };
|
||||
}
|
||||
detail[court] = Math.round((c - m) * 100) / 100;
|
||||
total += c - m;
|
||||
}
|
||||
if (muets.length === COMPTEURS_IMPORT.length) {
|
||||
return { etat: 'indisponible', attributs: { statut: 'indisponible',
|
||||
explication: 'Compteurs d\'energie AC-in illisibles : import du jour inconnu.' } };
|
||||
}
|
||||
total = Math.round(total * 10) / 10;
|
||||
const ce = courant[COMPTEUR_EDF], me = minuit[COMPTEUR_EDF];
|
||||
const edf = Number.isFinite(ce) && Number.isFinite(me) && ce >= me ? Math.round((ce - me) * 10) / 10 : null;
|
||||
const partiel = muets.length > 0;
|
||||
return {
|
||||
etat: total,
|
||||
attributs: {
|
||||
statut: partiel ? 'partiel' : 'complet',
|
||||
detail_kwh: detail,
|
||||
compteur_edf_kwh: edf,
|
||||
explication: partiel
|
||||
? `Au moins ${total} kWh importes d'EDF depuis minuit (compteur ${muets.join(', ')} muet).`
|
||||
: `${total} kWh importes d'EDF depuis minuit.`,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user