La reponse du proprietaire pilote le selecteur, et deux ecrivains cessent de se battre
Corriger le selecteur a la main ne corrige rien : « demain si je dis JEEP il va rester sur VW, donc la solution c'est de le piloter quand je reponds ». Le selecteur n'est pas qu'une etiquette. Le CONTROLEUR n8n le lit pour en deduire l'heure de depart (VW 08:50, JEEP 06:30), donc minutesUntilDeparture, donc batteryRecoveryUrgent — qui coupe P12 et ferme EDF trente minutes avant le depart suppose. Mesure de cette nuit : selecteur reste sur JEEP alors que la VW etait branchee et confirmee par WhatsApp a 19:56 => EDF se serait ferme a 06:00 pour rien, la voiture etant pleine depuis 05:30 et la batterie a 51 %. Deux correctifs, indissociables. 1. piloterSelecteurVehicule() : une reponse du proprietaire ecrit input_select.victron_evcs_vehicle. UNE SEULE FOIS par reponse — la fonction appelante est idempotente par confirmed_at — donc le dernier mot reste a l'humain quel que soit le canal. Seulement pour les labels qui SONT des options du selecteur : MEGANE, INVITE et ZERO n'y figurent pas, et l'heure de depart n'a aucun sens pour un vehicule de passage. 2. ecrireSession() n'ecrase plus une session confirmee. Cette ligne reecrivait le vehicule depuis le selecteur a CHAQUE CYCLE d'une session ouverte, pendant que appliquerEtiquettesEnAttente remettait l'etiquette juste apres : deux ecrivains sur la meme colonne toutes les 60 s, et une ligne de journal a chaque passe — une soixantaine le 15/09. Le drapeau vehicule_sur dit « un humain a confirme » : quand il est vrai, le selecteur n'a plus voix au chapitre. Preuve du diagnostic, par l'experience : le dernier « Etiquette VW posee » est a 01:40:58, le selecteur passe a VW a 01:41:59, et plus une seule ligne ensuite. La bagarre s'arrete a la seconde ou les deux ecrivains s'accordent. Preuve du correctif 2, en lecture seule sur les lignes reelles : sur les deux sessions VW, l'expression d'avant ecrirait JEEP, la nouvelle garde VW ; sur les sessions JEEP les deux concordent. Et sur un cas synthetique non confirme, la nouvelle expression suit bien le selecteur — la garde est ciblee. DEFAUT TROUVE EN RELISANT LA SORTIE DU PREMIER ESSAI A BLANC : sans garde, un --dry-run aurait pilote le selecteur pour de vrai. Seule l'egalite fortuite actuel === label avait evite l'ecriture. Garde posee, puis eprouvee en mettant le selecteur sur JEEP : la sortie annonce « [blanc] piloterait JEEP -> VW » et le selecteur est reste JEEP. MANUEL : capacite des vehicules. La VW annonce 10 kWh de plaque pour 42 km ; la reference MESUREE au compteur de la borne est 7,70 kWh pour une charge menee a son terme (15/09 01:25-03:41). C'est ce chiffre qui dimensionne une nuit, pas la plaque. La JEEP n'est pas mesuree de la meme facon : ne pas lui appliquer les 7,70 kWh. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -305,3 +305,107 @@ views:
|
||||
une écriture sort de ce périmètre.
|
||||
|
||||
Détail de la démarche : `docs/CHANTIER_BILAN_ENERGETIQUE.md`.
|
||||
|
||||
# =====================================================
|
||||
# PREVISION CONTRE REEL (15/09/2026)
|
||||
# =====================================================
|
||||
# Les trois series viennent de `sensor.evcs_prevision_contre_reel`, publie
|
||||
# toutes les dix minutes par le service d'historisation depuis PostgreSQL —
|
||||
# Home Assistant ne garde aucun historique des previsions, ses input_text
|
||||
# etant ecrases a chaque publication.
|
||||
- title: Prévision vs réel
|
||||
path: prevision
|
||||
icon: mdi:chart-timeline-variant
|
||||
cards:
|
||||
|
||||
- type: markdown
|
||||
content: >
|
||||
## Comment lire cette courbe
|
||||
|
||||
|
||||
⚠️ **Une heure bridée n'est pas comparable.** Quand la batterie est
|
||||
pleine et qu'aucun preneur ne se présente, la production se cale sur
|
||||
la consommation : elle passe sous la prévision sans que la prévision
|
||||
soit fausse. La bande grise du bas dit quand c'est le cas.
|
||||
|
||||
|
||||
Le chiffre en tête — l'écart moyen — ne compte **que les heures non
|
||||
bridées**. C'est le seul qui juge vraiment la prévision.
|
||||
|
||||
|
||||
Deux exemples mesurés : le 13/09 à 15 h, prévu 5,32 kWh et réalisé
|
||||
1,82 avec 100 % de bridage — l'écart n'est pas météorologique. Le
|
||||
15/09 à 13 h, prévu 3,92 et réalisé 7,12 sans aucun bridage — là, la
|
||||
prévision **sous-estime** de 82 %.
|
||||
|
||||
- type: entities
|
||||
entities:
|
||||
- entity: sensor.evcs_prevision_contre_reel
|
||||
name: Écart moyen (heures comparables)
|
||||
- type: attribute
|
||||
entity: sensor.evcs_prevision_contre_reel
|
||||
attribute: heures_comparables
|
||||
name: Heures comparables
|
||||
- type: attribute
|
||||
entity: sensor.evcs_prevision_contre_reel
|
||||
attribute: heures_total
|
||||
name: Heures dans la fenêtre
|
||||
|
||||
- type: custom:apexcharts-card
|
||||
header:
|
||||
show: true
|
||||
title: Production prévue et réalisée, heure par heure
|
||||
show_states: false
|
||||
graph_span: 7d
|
||||
span:
|
||||
end: hour
|
||||
apex_config:
|
||||
chart:
|
||||
height: 340
|
||||
stroke:
|
||||
width: [2, 2]
|
||||
legend:
|
||||
position: top
|
||||
yaxis:
|
||||
- title: {text: kWh par heure}
|
||||
decimals: 1
|
||||
series:
|
||||
- entity: sensor.evcs_prevision_contre_reel
|
||||
name: Prévue
|
||||
type: line
|
||||
color: '#f0a202'
|
||||
data_generator: |
|
||||
return (entity.attributes.predite || []);
|
||||
- entity: sensor.evcs_prevision_contre_reel
|
||||
name: Réalisée
|
||||
type: area
|
||||
opacity: 0.25
|
||||
color: '#2d8cf0'
|
||||
data_generator: |
|
||||
return (entity.attributes.reelle || []);
|
||||
|
||||
- type: custom:apexcharts-card
|
||||
header:
|
||||
show: true
|
||||
title: Part de l'heure où la production était bridée
|
||||
show_states: false
|
||||
graph_span: 7d
|
||||
span:
|
||||
end: hour
|
||||
apex_config:
|
||||
chart:
|
||||
height: 150
|
||||
yaxis:
|
||||
- min: 0
|
||||
max: 100
|
||||
title: {text: '% de l heure'}
|
||||
legend:
|
||||
show: false
|
||||
series:
|
||||
- entity: sensor.evcs_prevision_contre_reel
|
||||
name: Bridage
|
||||
type: area
|
||||
opacity: 0.4
|
||||
color: '#9e9e9e'
|
||||
data_generator: |
|
||||
return (entity.attributes.bridage || []);
|
||||
|
||||
Reference in New Issue
Block a user