Revue : EDF absent en session, voiture payee par la batterie, interventions, kWh sur la puissance ; piles : hysteresis et acquittement
This commit is contained in:
@@ -8,6 +8,10 @@
|
||||
// =====================================================================
|
||||
|
||||
export const SEUIL_PCT = 20; // pile faible a 20 % et moins
|
||||
// HYSTERESIS (13/10) : une alerte ne retombe qu'a 40 % et plus (en pratique : un
|
||||
// changement de piles). GRENIER 13 -> 19 -> 6 % et Chambre Gerard ont fait
|
||||
// partir 5 messages le 13/10, l'alerte disparaissant puis revenant autour de 20 %.
|
||||
export const SEUIL_RETOUR_PCT = 40;
|
||||
export const MUET_H = 24; // indisponible depuis plus de 24 h
|
||||
// Pas des piles de capteurs : parc Victron, voiture, telephones, reglages GX.
|
||||
const EXCLUS = /^(sensor|number|binary_sensor)\.(victron_|gx_device_|airtria_8_|jeep_|iphone_|ipad_|samsung_)/;
|
||||
@@ -17,8 +21,31 @@ const EXCLUS = /^(sensor|number|binary_sensor)\.(victron_|gx_device_|airtria_8_|
|
||||
* @param {number} maintenantMs
|
||||
* @param {string[]} ignorees entites que le proprietaire a demande d'ignorer
|
||||
*/
|
||||
export function pilesAAlerter(etats, maintenantMs, ignorees = []) {
|
||||
// ACQUITTEMENT (13/10, demande du proprietaire) : « j'ai compris, je change les
|
||||
// piles dans N jours » -> plus de rappel pour cet appareil jusqu'a la date dite.
|
||||
// input_text.evcs_piles_acquittees = « cle:AAAA-MM-JJ,cle:AAAA-MM-JJ », cle =
|
||||
// entite sans « sensor. » ; valable jusqu'a la fin de ce jour (heure de Paris).
|
||||
// Ecrit par le concierge (SPARK) ; une cle d'un appareil qui n'est plus en
|
||||
// alerte (piles changees) est simplement sans effet.
|
||||
export function lireAcquittements(texte) {
|
||||
const out = {};
|
||||
for (const part of String(texte || '').split(',')) {
|
||||
const m = /^\s*([a-z0-9_]+)\s*:\s*(\d{4}-\d{2}-\d{2})\s*$/.exec(part);
|
||||
if (!m) continue;
|
||||
const fin = Date.parse(`${m[2]}T23:59:59+02:00`);
|
||||
if (Number.isFinite(fin)) out[`sensor.${m[1]}`] = { jusquAu: m[2], finMs: fin };
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {object} opts precedentes : entites en alerte au passage precedent (hysteresis)
|
||||
* acquittements : resultat de lireAcquittements
|
||||
*/
|
||||
export function pilesAAlerter(etats, maintenantMs, ignorees = [], opts = {}) {
|
||||
const ign = new Set(ignorees.map((x) => x.trim()).filter(Boolean));
|
||||
const prec = new Set(opts.precedentes || []);
|
||||
const acq = opts.acquittements || {};
|
||||
const alertes = [];
|
||||
for (const s of etats) {
|
||||
const id = s.entity_id;
|
||||
@@ -38,15 +65,30 @@ export function pilesAAlerter(etats, maintenantMs, ignorees = []) {
|
||||
}
|
||||
if (enPct) {
|
||||
const n = Number(v);
|
||||
if (Number.isFinite(n) && n <= SEUIL_PCT) alertes.push({ entite: id, nom, statut: 'faible', niveau: n, depuis: s.last_changed,
|
||||
if (Number.isFinite(n) && (n <= SEUIL_PCT || (prec.has(id) && n < SEUIL_RETOUR_PCT))) alertes.push({ entite: id, nom, statut: 'faible', niveau: n, depuis: s.last_changed,
|
||||
texte: `${nom} : pile a ${n} %` });
|
||||
} else if (v === 'low') {
|
||||
} else if (v === 'low' || (v === 'middle' && prec.has(id))) {
|
||||
// Meme hysteresis pour les etats : Chambre Gerard battait entre low et
|
||||
// middle le 13/10 (deux messages). L'alerte ne retombe qu'a « high ».
|
||||
alertes.push({ entite: id, nom, statut: 'faible', niveau: 'low', depuis: s.last_changed, texte: `${nom} : pile faible` });
|
||||
}
|
||||
}
|
||||
alertes.sort((x, y) => (x.statut === y.statut ? x.nom.localeCompare(y.nom) : x.statut === 'faible' ? -1 : 1));
|
||||
for (const a of alertes) {
|
||||
const k = acq[a.entite];
|
||||
a.acquittee = !!(k && k.finMs >= maintenantMs);
|
||||
if (a.acquittee) a.jusqu_au = k.jusquAu;
|
||||
a.cle = a.entite.replace(/^sensor\./, '');
|
||||
}
|
||||
const aRappeler = alertes.filter((a) => !a.acquittee);
|
||||
const acquittees = alertes.filter((a) => a.acquittee);
|
||||
const jour = (iso) => iso.split('-').reverse().slice(0, 2).join('/');
|
||||
return {
|
||||
alertes,
|
||||
texte: alertes.length ? alertes.map((x) => `- ${x.texte}`).join('\n') : 'Toutes les piles des capteurs sont bonnes.',
|
||||
a_rappeler: aRappeler,
|
||||
acquittees,
|
||||
texte: !alertes.length ? 'Toutes les piles des capteurs sont bonnes.'
|
||||
: [...aRappeler.map((x) => `- ${x.texte}`),
|
||||
...(acquittees.length ? [`Deja vues, pas de rappel avant la date dite : ${acquittees.map((x) => `${x.nom} (jusqu'au ${jour(x.jusqu_au)})`).join(', ')}.`] : [])].join('\n'),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user