// EVCS Energy Balance — BUILD_HA_CALLS_PROFILES // ===================================================================== // Publie les quatre profils recalculés dans leurs helpers input_text. // // MÊME GARANTIE DE PÉRIMÈTRE que le workflow de bilan : ce nœud n'écrit que // vers des entités `evcs_balance_*`, plus une trace logbook. La suite de tests // échoue si une écriture en sort. // // Refus explicite de publier un profil douteux : si l'historique est trop court // pour couvrir les 24 heures, on n'écrase PAS les profils en place. Mieux vaut // un profil un peu ancien qu'un profil creux. // ===================================================================== const profiles = $input.first().json; function stampParis() { const p = new Intl.DateTimeFormat('fr-FR', { timeZone: 'Europe/Paris', day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false, }).formatToParts(new Date()); const g = t => p.find(x => x.type === t)?.value || ''; return `${g('day')}/${g('month')} ${g('hour')}:${g('minute')}`; } const calls = []; function setText(entity, value) { calls.push({ json: { domain: 'input_text', service: 'set_value', data: { entity_id: entity, value: (value ?? '').toString().slice(0, 250) }, } }); } if (!profiles.complete) { setText('input_text.evcs_balance_status', `profils NON mis à jour : ${profiles.quality.unreliableHours.length} h sans assez de jours observés`); calls.push({ json: { domain: 'logbook', service: 'log', data: { name: 'EVCS Bilan — profils quotidiens', message: `Recalcul refusé : historique insuffisant (${profiles.days} jour(s), heures creuses : ${profiles.quality.unreliableHours.join(', ')}). Profils précédents conservés.`, entity_id: 'input_text.evcs_balance_status', }, } }); return calls; } setText('input_text.evcs_balance_consumption_p50', profiles.csv.p50); setText('input_text.evcs_balance_consumption_p80', profiles.csv.p80); setText('input_text.evcs_balance_envelope', profiles.csv.envelope); setText('input_text.evcs_balance_censorship_rate', profiles.csv.censorshipRate); setText('input_text.evcs_balance_last_run', stampParis()); calls.push({ json: { domain: 'logbook', service: 'log', data: { name: 'EVCS Bilan — profils quotidiens', message: `Profils recalculés sur ${profiles.days} jours (${profiles.quality.hoursUsed} h de consommation, ${profiles.quality.pvHoursUsed} h de production, ${profiles.quality.countersReset} remise(s) à zéro écartée(s)). Consommation typique ${profiles.totals.typicalDailyKwh} kWh/j, prudente ${profiles.totals.prudentDailyKwh} kWh/j. Production démontrée ${profiles.production.demonstratedDailyKwh} kWh/j, ${profiles.production.censoredDayHours} heure(s) de jour censurée(s).`, entity_id: 'input_text.evcs_balance_consumption_p50', }, } }); return calls;