workspace: niveau du vehicule par le concierge (option A), simulation par drapeau
- concierge-write.js : setVehicleLevel (entier 0-100, refus sans correction, relecture), ZERO dans SELECTOR_LABELS ; tests 13/13. - concierge-live.js answer : reconnait « NN % », ecrit le niveau, lignes « 🔋 Niveau noté » / « ⚠️ Niveau NON noté ». - Drapeau workspace/.simulation lu par concierge-live.js et airtria-ha-vehicule.js : aucune ecriture HA pendant un banc agent. - airtria-ha-vehicule.js : validation de tous les arguments avant ecriture. - AGENTS.md et reference-concierge.md : vehicule et niveau passent par le concierge. - Journaux de tri Orange et AIRTRIA, DREAMS.
This commit is contained in:
@@ -18,13 +18,20 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// ⚠️ Deux constantes, pas une de plus. Ne JAMAIS les rendre dynamiques.
|
||||
// ⚠️ Trois constantes, pas une de plus. Ne JAMAIS les rendre dynamiques.
|
||||
// La troisieme (niveau saisi) est une DECISION du proprietaire du 03/10/2026 :
|
||||
// le niveau annonce dans un message (« JEEP reste 70 % ») etait perdu, la regle
|
||||
// de fiche qui devait le faire ecrire n'etait appliquee qu'une fois sur trois,
|
||||
// et le modele avait « corrige » 150 en 100 avant de l'ecrire.
|
||||
const HELPER_ENTITY = 'input_text.airtria_vehicle_label';
|
||||
const SELECTOR_ENTITY = 'input_select.victron_evcs_vehicle';
|
||||
const LEVEL_ENTITY = 'input_number.victron_evcs_vehicle_level_pct';
|
||||
// Liste EN DUR, volontairement PAS lue depuis HA : le sélecteur ne pilote que
|
||||
// les deux véhicules du foyer (départs VW 08:50 / JEEP 06:30). Si une option
|
||||
// est ajoutée côté HA un jour (ZERO ?), l'ajouter ici est une DÉCISION.
|
||||
const SELECTOR_LABELS = ['VW', 'JEEP'];
|
||||
// 03/10/2026 : ZERO ajoutee (moto du foyer, option du selecteur depuis le 28/09,
|
||||
// et le concierge devient le seul chemin d'ecriture du vehicule).
|
||||
const SELECTOR_LABELS = ['VW', 'JEEP', 'ZERO'];
|
||||
// Le sélecteur ne s'écrit QUE sur confirmation humaine. La déduction
|
||||
// règle-puissance ne conclut jamais VW vs JEEP (indiscernables électriquement),
|
||||
// donc ne passe jamais ici — et ce garde le garantit même si ça changeait.
|
||||
@@ -100,7 +107,35 @@ async function setVehicleSelector(label, source) {
|
||||
return { entity: SELECTOR_ENTITY, option: label };
|
||||
}
|
||||
|
||||
// Niveau de la voiture branchee, ANNONCE par le proprietaire (aucun capteur ne
|
||||
// le donne). Entier de 0 a 100 SEULEMENT : une valeur invalide est REFUSEE, jamais
|
||||
// corrigee. Source humaine obligatoire. Relecture comme pour les deux autres.
|
||||
// La reference du compteur et la date de saisie sont memorisees par une
|
||||
// automatisation HA a chaque ecriture : on n'y touche pas.
|
||||
async function setVehicleLevel(niveau, source) {
|
||||
if (!HUMAN_SOURCES.includes(source)) {
|
||||
throw new Error(`niveau : source '${source}' non humaine — écriture interdite`);
|
||||
}
|
||||
if (!Number.isInteger(niveau) || niveau < 0 || niveau > 100) {
|
||||
throw new Error(`niveau : '${niveau}' invalide (entier de 0 à 100) — on n'écrit pas`);
|
||||
}
|
||||
const token = haToken();
|
||||
const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' };
|
||||
const res = await fetch(`${HA_BASE}/api/services/input_number/set_value`, {
|
||||
method: 'POST', headers,
|
||||
body: JSON.stringify({ entity_id: LEVEL_ENTITY, value: niveau }),
|
||||
});
|
||||
if (!res.ok) throw new Error(`set_value niveau HTTP ${res.status}`);
|
||||
const back = await fetch(`${HA_BASE}/api/states/${LEVEL_ENTITY}`, { headers });
|
||||
if (!back.ok) throw new Error(`relecture HTTP ${back.status}`);
|
||||
const state = Number((await back.json()).state);
|
||||
if (Math.round(state) !== niveau) {
|
||||
throw new Error(`relecture '${state}' != '${niveau}' — niveau refusé en silence par HA`);
|
||||
}
|
||||
return { entity: LEVEL_ENTITY, value: niveau };
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
publishLabel, setVehicleSelector,
|
||||
HELPER_ENTITY, SELECTOR_ENTITY, SELECTOR_LABELS, MAX_LEN,
|
||||
publishLabel, setVehicleSelector, setVehicleLevel,
|
||||
HELPER_ENTITY, SELECTOR_ENTITY, LEVEL_ENTITY, SELECTOR_LABELS, MAX_LEN,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user