sensor.evcs_bilan_nuit : le bilan de nuit de l'agent vient du code du rapport du matin

Incident 25/09 11:49 : l'agent sans source avait invente 0,56 kWh / zero
reseau / 35 % pour une nuit a 7,9 kWh dont 2,2 reseau. donneesNuit() extrait
de rapport-nuit.mjs (texte identique sur 5 nuits), publie pour l'agent.
Tests 37/37.

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:31:35 +02:00
parent beed8028ca
commit c75d2ffcb8
5 changed files with 184 additions and 52 deletions

View File

@@ -29,8 +29,8 @@ import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import pg from 'pg';
import { texteRapport, envoyer } from './rapport-nuit.mjs';
import { diagnosticPv, etatCellules, productionJour, chargeSolaire } from './diagnostics-agent.mjs';
import { texteRapport, envoyer, donneesNuit, texteDepuis } from './rapport-nuit.mjs';
import { diagnosticPv, etatCellules, productionJour, chargeSolaire, bilanNuit } from './diagnostics-agent.mjs';
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
const ONCE = process.argv.includes('--once');
@@ -1848,6 +1848,20 @@ async function publierDiagnosticPv(st) {
return 1;
}
// Bilan de la nuit pour l'agent vocal : les donnees du rapport du matin (meme
// code, donc memes chiffres que le courriel). Toutes les 5 min suffit.
let bilanNuitPublie = false; // publie des le premier cycle, puis toutes les 5 min
async function publierBilanNuit(client) {
if (DRY || !client) return 0;
const d = await donneesNuit(client);
const bn = bilanNuit(d, texteDepuis(d));
await publierCapteur('sensor.evcs_bilan_nuit', bn.etat, {
friendly_name: 'EVCS — bilan de la derniere nuit', icon: 'mdi:weather-night', ...bn.attributs,
calcule_a: new Date().toISOString(),
});
return 1;
}
async function publierCellulesHelpers(client) {
if (DRY) return 0;
// Base injoignable : on publie « muet » plutot que de laisser au capteur son
@@ -1926,6 +1940,9 @@ async function cycle(client) {
: await publierPrevisionContreReel(client).catch((e) => {
console.error(`prevision contre reel : ${e.message}`); return 0;
}),
bilanNuit: (DRY || (bilanNuitPublie && new Date().getMinutes() % 5 !== 1)) ? 0 : await publierBilanNuit(client).then((n) => { bilanNuitPublie = true; return n; }).catch((e) => {
console.error(`bilan de nuit : ${e.message}`); return 0;
}),
rapport: DRY ? 0 : await envoyerRapportDuMatin(sql, client).catch((e) => {
console.error('rapport de nuit :', e.message); return 0;
}),