48 lines
2.5 KiB
JavaScript
48 lines
2.5 KiB
JavaScript
// =====================================================
|
|
// EVCS ADVISOR — BUILD_HA_CALLS (relecteur, 08/10/2026)
|
|
// GARANTIE : ce node n'ecrit QUE des entites advisor (input_text.evcs_advisor_*,
|
|
// sensor.evcs_advisor_revue) et le logbook. AUCUN switch, AUCUNE strategie,
|
|
// AUCUNE commande. Ne pas ajouter d'autres entites ici.
|
|
// Les items `state_entity` sont envoyes a /api/states (capteur avec attributs),
|
|
// les autres a /api/services/<domain>/<service>.
|
|
// =====================================================
|
|
|
|
const { status, detail, pistes, rejetees, ecartees, source, modelUsed, context } = $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 = [];
|
|
const push = (domain, service, data) => calls.push({ json: { domain, service, data } });
|
|
const setText = (entity, value) => push('input_text', 'set_value', { entity_id: entity, value: (value ?? '').toString().slice(0, 250) });
|
|
|
|
setText('input_text.evcs_advisor_status', status + (detail ? `: ${detail}` : ''));
|
|
setText('input_text.evcs_advisor_last_run', stampParis());
|
|
setText('input_text.evcs_advisor_model', `${modelUsed} (${source === 'openrouter' ? 'OpenRouter, cloud' : 'local Spark'})`);
|
|
|
|
if (status === 'ok' && Array.isArray(pistes)) {
|
|
calls.push({ json: { state_entity: 'sensor.evcs_advisor_revue', data: {
|
|
state: context.jour,
|
|
attributes: { friendly_name: 'Revue du conseiller IA', pistes, rejetees, ecartees: ecartees || [], modele: modelUsed,
|
|
source,
|
|
source_texte: source === 'openrouter'
|
|
? 'Repli OpenRouter (cloud) : le modele local de la Spark n a pas repondu, les constats ont ete envoyes a OpenRouter.'
|
|
: 'Modele local de la Spark : rien n est sorti de la maison.',
|
|
constats_relus: context.constats.length,
|
|
avertissement: 'Avis a verifier, pas des faits. Les constats chiffres sont dans sensor.evcs_revue_jour.' },
|
|
} } });
|
|
setText('input_text.evcs_advisor_reason',
|
|
`Revue du ${context.jour} : ${pistes.length} piste(s)${rejetees ? `, ${rejetees} ecartee(s)` : ''}`);
|
|
push('logbook', 'log', {
|
|
name: 'EVCS Advisor (relecteur)',
|
|
message: pistes.map((p) => `[${p.code}] ${p.piste}`).join(' || ') || 'aucune piste retenue',
|
|
entity_id: 'input_text.evcs_advisor_reason',
|
|
});
|
|
}
|
|
|
|
return calls;
|