SDB : capteur muet et garde batterie (workflow sous controle du depot) ; alertes de piles des capteurs

This commit is contained in:
Tallagrand Thierry
2026-10-10 00:30:06 +02:00
parent 1bbb54ae6e
commit 16658304c7
12 changed files with 1970 additions and 1 deletions

View File

@@ -33,6 +33,7 @@ import { creerSchemaKm, ingererReleves, ingererNiveauSaisi, ingererJeep } from '
import { texteRapport, envoyer, donneesNuit, texteDepuis } from './rapport-nuit.mjs';
import { donneesRevue, constatsRevue } from './revue-jour.mjs';
import { detecterSituation, lireChoix, DUREE_MIN as ARBITRAGE_DUREE_MIN } from './arbitrage.mjs';
import { pilesAAlerter } from './piles.mjs';
import { diagnosticPv, etatCellules, productionJour, chargeSolaire, bilanNuit, etatReseau, importJour, minuitLocal, COMPTEURS_IMPORT, COMPTEUR_EDF, consoJour, COMPTEURS_CONSO, projectionSoir, previsionNuit, vrmVersCourbes, nuitMaisonPrevue } from './diagnostics-agent.mjs';
import { transitionsDansSerie } from './allers-retours.mjs';
import { energieSur24h, energieDepuis, COMPTEUR_CHAUFFE_EAU } from './chauffe-eau.mjs';
@@ -2064,6 +2065,28 @@ async function appliquerOrdreAirtria(sql, client, st) {
return 1;
}
// ---------------------------------------------------------------------
// PILES DES CAPTEURS (10/10/2026, tools/piles.mjs) : toutes les 15 min,
// sensor.evcs_piles = nombre d'alertes ; attributs alertes [{entite, nom,
// statut faible|muet, niveau, depuis, texte}] et texte. SPARK previent par
// WhatsApp. input_text.evcs_piles_ignorees (liste separee par des virgules)
// pour faire taire un appareil.
let pilesPubliees = false;
async function publierPiles() {
const r = await fetch(`${HA_URL}/api/states`, { headers: { Authorization: `Bearer ${HA_TOKEN}` }, signal: AbortSignal.timeout(15000) });
if (!r.ok) throw new Error(`HA ${r.status}`);
const etats = await r.json();
const ign = String(etats.find((x) => x.entity_id === 'input_text.evcs_piles_ignorees')?.state || '')
.split(',').filter((x) => x && x !== 'unknown');
const p = pilesAAlerter(etats, Date.now(), ign);
await publierCapteur('sensor.evcs_piles', p.alertes.length, {
friendly_name: 'Piles des capteurs a changer', icon: 'mdi:battery-alert-variant-outline',
alertes: p.alertes, texte: p.texte, ignorees: ign,
});
pilesPubliees = true;
return 1;
}
// ---------------------------------------------------------------------
// ARBITRE ENCADRE (08/10/2026, tools/arbitrage.mjs)
// ---------------------------------------------------------------------
@@ -2633,6 +2656,9 @@ async function cycle(client) {
rapport: DRY ? 0 : await envoyerRapportDuMatin(sql, client).catch((e) => {
console.error('rapport de nuit :', e.message); return 0;
}),
piles: (DRY || (pilesPubliees && new Date().getMinutes() % 15 !== 6)) ? 0 : await publierPiles().catch((e) => {
console.error('piles :', e.message); return 0;
}),
arbitrage: DRY ? 0 : await arbitrer(sql, client, st).catch((e) => {
console.error('arbitrage :', e.message); return 0;
}),