Bilan : reserve d orage, en mode ombre
Une coupure reseau n arrete pas l installation : le solaire et la batterie continuent, seul le filet de secours disparait. La reserve a tenir est donc la couverture prudente p80 que le bilan calcule deja — aucune constante nouvelle. En deficit c est la fenetre traversee, en surplus la prochaine, car a 15 h la reponse « rien a couvrir » est exacte et inutile. Le seuil d activation est la vigilance orange, echelle officielle de Meteo-France et non un nombre choisi ici. Le snapshot lit l alerte sans connaitre la commune, donc le code marche des l installation de l integration et publie « indisponible » en attendant. Tests 38 -> 42. Le fixture du test de perimetre ombre ne contenait pas storm : les nouvelles ecritures n etaient pas couvertes. Corrige, assertion explicite, preuve par mutation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -88,6 +88,14 @@ const SUMMARIZE = {
|
||||
nextDeficitEnergyKwh: o.nextDeficit.found ? o.nextDeficit.energyKwh : null,
|
||||
nextDeficitRequiredSocPct: o.nextDeficit.found ? o.nextDeficit.requiredSocAtStartPct : null,
|
||||
storageShortfallKwh: o.nextDeficit.found ? Math.round(o.nextDeficit.storageShortfallKwh * 100) / 100 : null,
|
||||
// Réserve d'orage : niveau lu, activation, et le chiffre qui compte —
|
||||
// ce qu'il faut en batterie pour traverser sans réseau.
|
||||
stormLevel: o.storm.level,
|
||||
stormActive: o.storm.active,
|
||||
stormReserveKwh: o.storm.reserveKwh,
|
||||
stormReserveSocPct: o.storm.reserveSocPct,
|
||||
stormCovered: o.storm.covered,
|
||||
stormShortfallKwh: o.storm.shortfallKwh,
|
||||
}) : ({ usable: false, missing: o.missing.join(',') }),
|
||||
};
|
||||
|
||||
@@ -101,6 +109,9 @@ SUMMARIZE.BUILD_HA_CALLS = (calls) => {
|
||||
outOfScope: entities.filter(e => !/^(input_text|input_number|input_boolean)\.evcs_balance_/.test(e)).join(','),
|
||||
wroteRequiredSoc: entities.includes('input_number.evcs_balance_required_soc'),
|
||||
wroteGridNeeded: entities.includes('input_boolean.evcs_balance_grid_needed'),
|
||||
// Les 5 écritures de la réserve d'orage sont-elles bien émises ET dans le
|
||||
// périmètre ombre ? (outOfScope les attraperait si elles en sortaient).
|
||||
wroteStorm: entities.filter(e => /evcs_balance_storm_/.test(e)).length,
|
||||
hasLogbook: calls.some(c => c.json.domain === 'logbook'),
|
||||
wroteProfiles: entities.includes('input_text.evcs_balance_consumption_p50'),
|
||||
status: (calls.find(c => c.json.data.entity_id === 'input_text.evcs_balance_status') || { json: { data: {} } }).json.data.value,
|
||||
|
||||
Reference in New Issue
Block a user