Files
EVCS/dashboards/evcs_master.yaml

841 lines
36 KiB
YAML
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
views:
- title: Session
path: default_view
icon: mdi:car-electric
cards:
- type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: EVCS Master
subtitle: Vue borne / session / stratégie / énergie
- type: conditional
conditions:
- entity: binary_sensor.victron_evcs_vehicle_connected
state: "off"
card:
type: markdown
content: |
## ℹ️ Véhicule non détecté
- type: conditional
conditions:
- entity: binary_sensor.victron_evcs_vehicle_connected
state: "on"
- entity: switch.victron_evcs_charging
state: "off"
- entity: input_text.victron_evcs_surplus_state
state_not: day_vehicle_full_idle
- entity: input_text.victron_evcs_surplus_state
state_not: night_recovery_done_idle
- entity: input_text.victron_evcs_surplus_state
state_not: night_session_done_idle
- entity: input_text.victron_evcs_surplus_state
state_not: departure_done_idle
card:
type: markdown
content: |
## ⏸️ Véhicule connecté, pas de charge en ce moment
{{ states('input_text.victron_evcs_surplus_reason')[:160] }}
# Vehicule plein (etats collants du controleur) : normal, pas une alerte (04/10).
- type: conditional
conditions:
- condition: or
conditions:
- condition: state
entity: input_text.victron_evcs_surplus_state
state: day_vehicle_full_idle
- condition: state
entity: input_text.victron_evcs_surplus_state
state: night_recovery_done_idle
- condition: state
entity: input_text.victron_evcs_surplus_state
state: night_session_done_idle
- condition: state
entity: input_text.victron_evcs_surplus_state
state: departure_done_idle
card:
type: markdown
content: |
## 🔋 Véhicule plein — la borne est en veille
- type: conditional
conditions:
- entity: switch.victron_evcs_charging
state: "on"
card:
type: markdown
content: |
## ✅ Charge EVCS active
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: État borne
subtitle: Statut global
- type: custom:mushroom-template-card
entity: sensor.victron_evcs_status_fr
primary: EVCS
secondary: >
{{ states('sensor.victron_evcs_status_fr') }}
• Mode {{ states('sensor.victron_evcs_mode_fr') }}
• {{ states('sensor.victron_evcs_current') | float(0) | round(1) }} A
multiline_secondary: true
icon: mdi:ev-station
icon_color: >
{% if is_state('switch.victron_evcs_charging', 'on') %}
green
{% elif is_state('binary_sensor.victron_evcs_vehicle_connected', 'on') %}
blue
{% else %}
grey
{% endif %}
- type: entities
show_header_toggle: false
entities:
- entity: sensor.victron_evcs_status_fr
name: Statut FR
- entity: sensor.victron_evcs_mode_fr
name: Mode FR
- entity: sensor.victron_evcs_status_raw
name: Statut brut
- entity: sensor.victron_evcs_mode_raw
name: Mode brut
- entity: binary_sensor.victron_evcs_device_connected
name: EVCS détecté
- entity: binary_sensor.victron_evcs_vehicle_connected
name: Véhicule connecté
- entity: sensor.victron_evcs_charging_time
name: Durée charge
- entity: input_boolean.victron_evcs_surplus_auto_enabled
name: Contrôleur surplus actif
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Session
subtitle: Courant / puissance / énergie
- type: custom:gauge-card-pro
entity: sensor.victron_evcs_current
header: Courant EVCS
min: 0
max: 32
needle: true
segments:
- from: 0
color: "#43a047"
- from: 6
color: "#fdd835"
- from: 16
color: "#fb8c00"
- from: 24
color: "#e53935"
- type: custom:mushroom-template-card
primary: >
{{ 'Charge en cours' if states('sensor.victron_evcs_ac_power') | float(0) > 100 else 'Pas de charge en ce moment' }}
secondary: >
{{ states('sensor.victron_evcs_ac_power') | float(0) | round(0) }} W
• {{ states('sensor.victron_evcs_current') | float(0) | round(1) }} A
• Consigne {{ states('sensor.victron_evcs_set_current') | float(0) | round(1) }} A
• {{ states('sensor.evcs_hq2239dnt7p_last_session_energy') | float(0) | round(1) }} kWh
• {{ 'durée ' if states('sensor.victron_evcs_ac_power') | float(0) > 100 else 'dernière session ' }}{{ states('sensor.victron_evcs_charging_time') }}
multiline_secondary: true
icon: mdi:flash
icon_color: amber
- type: entities
show_header_toggle: false
entities:
- entity: sensor.victron_evcs_ac_power
name: Puissance EVCS
- entity: sensor.victron_evcs_l1_power
name: Puissance L1
- entity: sensor.victron_evcs_current
name: Courant réel
- entity: sensor.victron_evcs_set_current
name: Consigne lue
- entity: number.victron_evcs_set_current_command
name: Consigne envoyée
- entity: sensor.victron_evcs_charging_time
name: Durée charge
- entity: sensor.evcs_hq2239dnt7p_last_session_energy
name: Énergie de la session (compteur borne)
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Historique EVCS
subtitle: 12 dernières heures
- type: custom:apexcharts-card
graph_span: 12h
header:
show: true
title: Session EVCS
show_states: false
series:
- entity: sensor.victron_evcs_current
name: Courant EVCS
color: "#42a5f5"
- entity: sensor.victron_evcs_set_current
name: Consigne lue
color: "#ffca28"
- entity: sensor.victron_evcs_ac_power
name: Puissance EVCS
color: "#66bb6a"
- entity: sensor.victron_pv_power_system
name: PV
color: "#fdd835"
- entity: sensor.victron_grid_power_l1
name: Réseau
color: "#ef5350"
- type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: 🤖 Conseiller IA — relecteur de la journée
subtitle: Les constats sont mesurés par le code ; le conseiller propose des pistes, il ne décide rien
- type: markdown
title: Revue de ce matin
content: |
{% set r = states.sensor.evcs_revue_jour %}
{% set a = states.sensor.evcs_advisor_revue %}
{% set auj = now().strftime('%Y-%m-%d') %}
{% if r is none %}
**Revue indisponible** (capteur absent : publiée à 07:30 par le service d'historisation).
{% else %}
**Revue du {{ r.state }}**{% if r.state != auj %} — ⚠️ pas celle d'aujourd'hui (publiée à 07:30){% endif %}
· 24 h jusqu'à la fin des heures creuses de nuit · **{{ r.attributes.a_examiner | default(0) }} point(s) à examiner**
{% for c in r.attributes.constats | default([]) %}
---
{% if c.gravite == 'a_examiner' %}🔶{% else %}ℹ️{% endif %} **{{ c.code }}**
{{ c.texte }}
{% if c.contexte %}<br><small>Raison publiée par le contrôleur à ce moment-là : <i>{{ c.contexte }}</i></small>{% endif %}
{% set ps = (a.attributes.pistes | default([]) | selectattr('code','eq',c.code) | list) if a is not none and a.state == r.state else [] %}
{% for p in ps %}
<br>💡 **Piste du conseiller** (avis, à vérifier) : {{ p.piste }}
{% endfor %}
{% set es = (a.attributes.ecartees | default([]) | selectattr('code','eq',c.code) | list) if a is not none and a.state == r.state else [] %}
{% for e in es %}
<br><small>🚫 Piste écartée ({{ e.motif }}) : <i>{{ e.piste }}</i></small>
{% endfor %}
{% endfor %}
{% if (r.attributes.constats | default([])) | length == 0 %}✅ {{ r.attributes.texte }}{% endif %}
{% endif %}
- type: markdown
title: Qui a répondu, et comment
content: |
{% set a = states.sensor.evcs_advisor_revue %}
{% if a is none %}
Le conseiller n'a encore publié aucune revue.
{% else %}
| | |
|---|---|
| Revue relue | {{ a.state }} ({{ a.attributes.constats_relus | default('?') }} constat(s)) |
| Modèle | {{ a.attributes.modele | default('?') }} |
| **Où** | {% if a.attributes.source == 'openrouter' %}☁️ **OpenRouter (cloud)**{% else %}🏠 **Spark (local)**{% endif %} |
| Pistes retenues | {{ a.attributes.pistes | default([]) | length }} |
| Pistes écartées | {{ a.attributes.rejetees | default(0) }} (chiffre inventé, code inconnu, doublon) |
{{ a.attributes.source_texte | default('') }}
{% endif %}
**Rôle d'OpenRouter** : solution de **secours seulement**. Le conseiller interroge d'abord le modèle local de la Spark ; si la Spark ne répond pas, les constats (textes ci-dessus, sans identifiants) sont envoyés à OpenRouter. Il n'a aucun autre rôle.
Statut du dernier passage : `{{ states('input_text.evcs_advisor_status') }}` · {{ states('input_text.evcs_advisor_last_run') }} · {{ states('input_text.evcs_advisor_model') }}
- type: markdown
title: Les 7 derniers jours
content: |
{% set h = states.sensor.evcs_revue_historique %}
{% if h is none or (h.attributes.jours | default([])) | length == 0 %}
Pas encore d'historique (la première revue est publiée le 08/10 à 07:30).
{% else %}
{% for j in h.attributes.jours %}
**{{ j.jour }}** — {{ j.constats | selectattr('gravite','eq','a_examiner') | list | length }} point(s), {{ j.pistes | selectattr('retenue') | list | length }} piste(s) retenue(s), {{ j.pistes | rejectattr('retenue') | list | length }} écartée(s){% if j.pistes | selectattr('source','eq','openrouter') | list | length > 0 %} · ☁️ OpenRouter{% endif %}
{% for c in j.constats %}
<br><small>• {{ c.texte }}</small>
{% endfor %}
{% endfor %}
{% endif %}
<small>Tout est gardé en base (`revue_constat`, `revue_piste`, avec les pistes écartées et leur motif) pour rejouer le conseiller plus tard et mesurer s'il progresse.</small>
- type: markdown
title: Dialoguer avec le conseiller
content: |
Pour l'instant, le dialogue passe par **OpenClaw** (WhatsApp ou vocal) : « qu'est-ce qui a cloché hier ? » — il lit la revue et les pistes ci-dessus, et présente les pistes comme des avis.
- type: entities
entities:
- entity: input_boolean.evcs_advisor_enabled
name: Conseiller actif (kill-switch)
- title: Véhicules
path: vehicules
icon: mdi:car-multiple
cards:
- type: entities
title: JEEP — lue par la voiture (Uconnect)
show_header_toggle: false
entities:
- entity: sensor.jeep_renegade_phev_hvbattery_charge
name: 🔋 Batterie (dernier état publié)
- entity: sensor.jeep_renegade_phev_extrapolated_battery
name: 🔋 Batterie estimée maintenant (extrapolée)
- entity: binary_sensor.jeep_renegade_phev_ev_charger
name: Câble branché
- entity: binary_sensor.jeep_renegade_phev_charging
name: En charge
- entity: sensor.jeep_renegade_phev_charging_rate
name: Vitesse de charge
- entity: sensor.jeep_renegade_phev_time_to_charge_l2
name: Temps restant jusqu'au plein
- entity: sensor.jeep_renegade_phev_driving_range
name: Autonomie électrique
- entity: sensor.jeep_renegade_phev_driving_range_gas
name: Autonomie essence
- entity: sensor.jeep_renegade_phev_odometer
name: Compteur kilométrique
- entity: sensor.jeep_renegade_phev_12v_battery
name: Batterie 12 V
- entity: sensor.jeep_renegade_phev_last_info_update_at
name: Dernier état publié par la voiture
format: relative
- type: section
label: "Au branchement, la JEEP s'identifie seule : étiquette, sélecteur et niveau posés automatiquement"
- type: entities
title: Véhicule branché et cette nuit
show_header_toggle: false
entities:
- entity: input_select.victron_evcs_vehicle
name: Véhicule branché
- entity: input_number.victron_evcs_vehicle_level_pct
name: 🔋 Niveau au branchement
- entity: input_datetime.victron_evcs_departure_ponctuel
name: 🕒 Repart aujourd'hui à (départ ponctuel, VW / ZERO)
- entity: input_select.victron_evcs_night_charge_mode
name: 🌙 Charge cette nuit (sans EDF = budget batterie seul)
- entity: input_number.evcs_balance_night_vehicle_budget_kwh
name: 🔋 Budget nuit
- entity: input_number.victron_evcs_required_energy_kwh
name: Énergie demandée
- entity: input_boolean.victron_evcs_departure_priority_enabled
name: Priorité départ
- type: entities
title: Relevé kilométrique (km par kWh et usure des batteries)
show_header_toggle: false
entities:
- entity: input_select.evcs_releve_vehicule
name: Véhicule
- entity: input_number.evcs_releve_km_valeur
name: Compteur (km)
- entity: input_number.evcs_releve_niveau
name: Niveau batterie (%, -1 = inconnu)
- type: button
name: Enregistrer le relevé
icon: mdi:content-save
action_name: Enregistrer
tap_action:
action: perform-action
perform_action: script.evcs_enregistrer_releve_km
- type: section
label: "Ou par WhatsApp : « JEEP 112694 km 54 % » — toujours avec le niveau"
- entity: input_number.victron_evcs_autonomie_jeep_km
name: JEEP réf.
- entity: input_number.victron_evcs_autonomie_vw_km
name: VW réf.
- entity: input_number.victron_evcs_autonomie_zero_km
name: ZERO réf.
- type: entities
title: Calendrier des départs
show_header_toggle: false
entities:
- entity: input_datetime.victron_evcs_departure_time
name: VW — départ du matin
- entity: input_datetime.victron_evcs_departure_time_jeep
name: JEEP — départ du matin
- entity: input_datetime.victron_evcs_departure_time_zero
name: ZERO — départ du matin
- entity: input_text.victron_evcs_jeep_morning_departure_days
name: JEEP — jours du matin (vide = tous)
- entity: input_text.victron_evcs_vw_morning_departure_days
name: VW — jours du matin (vide = tous)
- entity: input_text.victron_evcs_zero_morning_departure_days
name: ZERO — jours du matin (vide = tous)
- entity: input_datetime.victron_evcs_jeep_midday_departure
name: JEEP — repart l'après-midi
- entity: input_text.victron_evcs_jeep_midday_departure_days
name: JEEP — jours de l'après-midi
- entity: input_datetime.victron_evcs_vw_midday_departure
name: VW — repart l'après-midi
- entity: input_text.victron_evcs_vw_midday_departure_days
name: VW — jours de l'après-midi
- entity: input_datetime.victron_evcs_zero_midday_departure
name: ZERO — repart l'après-midi
- entity: input_text.victron_evcs_zero_midday_departure_days
name: ZERO — jours de l'après-midi
- type: entities
title: Capacités et puissances mesurées (borne)
show_header_toggle: false
entities:
- entity: input_number.victron_evcs_capacity_jeep_kwh
name: JEEP capacité
- entity: input_number.victron_evcs_charger_kw_jeep
name: JEEP puissance
- entity: input_number.victron_evcs_capacity_vw_kwh
name: VW capacité
- entity: input_number.victron_evcs_charger_kw_vw
name: VW puissance
- entity: input_number.victron_evcs_capacity_zero_kwh
name: ZERO capacité
- entity: input_number.victron_evcs_charger_kw_zero
name: ZERO puissance
- type: entities
title: "Voiture à midi : le réseau est-il justifié ? (verdict du bilan)"
show_header_toggle: false
entities:
- entity: input_boolean.evcs_balance_vehicle_grid_needed
name: Réseau justifié pour le véhicule à midi (verdict du bilan)
- entity: input_number.evcs_balance_vehicle_need_kwh
name: Besoin voiture avant départ
- entity: input_number.evcs_balance_vehicle_solar_kwh
name: Solaire disponible pour la voiture avant départ
- title: Pilotage
path: pilotage
icon: mdi:tune-variant
cards:
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Stratégie & décision
subtitle: Mode utilisateur / logique n8n
- type: custom:mushroom-template-card
primary: Mode utilisateur
secondary: >
Stratégie : {{ states('input_select.victron_evcs_strategy') }}
• Profil : {{ states('input_text.victron_evcs_operating_mode') }}
• Décision : {{ states('input_text.victron_evcs_surplus_current_decision') }}
• Source : {{ states('input_text.victron_evcs_source_mode') }}
multiline_secondary: true
icon: mdi:strategy
icon_color: >
{% if is_state('input_select.victron_evcs_strategy', 'force_grid_now') %}
red
{% elif is_state('input_select.victron_evcs_strategy', 'force_charge_now') %}
orange
{% elif is_state('input_select.victron_evcs_strategy', 'auto_solar_plus') %}
green
{% elif is_state('input_select.victron_evcs_strategy', 'auto_solar') %}
teal
{% else %}
grey
{% endif %}
# Un contournement manuel doit afficher son echeance, sinon
# « force_grid_now » se lit comme un etat permanent — c'est ce
# qui a laisse tourner une charge reseau au plein tarif le
# 17/09/2026.
- type: conditional
conditions:
- entity: input_select.victron_evcs_strategy
state: force_grid_now
card:
type: custom:mushroom-template-card
primary: Réseau forcé — échéance
secondary: >
{% set s = states.input_select.victron_evcs_strategy %}
{% set d = ((as_timestamp(now()) - as_timestamp(s.last_changed)) / 60) | round(0) %}
{% set p = states('input_number.evcs_force_grid_max_minutes') | float(180) %}
{% if is_state('input_boolean.evcs_expiration_force_grid_enabled', 'on') %}
Actif depuis {{ d }} min. S'arrête à la sortie de la fenêtre
d'heures creuses, ou après {{ p | round(0) }} min.
{% else %}
⚠️ Expiration DÉSACTIVÉE : il ne s'arrêtera pas tout seul.
Actif depuis {{ d }} min.
{% endif %}
multiline_secondary: true
icon: mdi:timer-sand
icon_color: >
{% if is_state('input_boolean.evcs_expiration_force_grid_enabled', 'on') %}orange{% else %}red{% endif %}
- type: entities
title: Décision contrôleur
show_header_toggle: false
entities:
- entity: input_text.victron_evcs_operating_mode
name: Profil actif
- entity: input_text.victron_evcs_surplus_state
name: État interne
- entity: input_text.victron_evcs_surplus_current_decision
name: Décision logique
- entity: input_text.victron_evcs_source_mode
name: Source autorisée
- entity: input_text.victron_evcs_surplus_reason
name: Raison courte
- entity: input_text.victron_evcs_last_block_reason
name: Dernier blocage
- entity: input_datetime.victron_evcs_blocked_until
name: Bloqué jusqu'à
- type: entities
title: Stratégie et autorisations réseau
show_header_toggle: false
entities:
- entity: input_boolean.victron_evcs_allow_grid_departure_urgent
name: ⚡ Réseau avant départ (P9)
- entity: input_select.victron_evcs_strategy
name: Stratégie EVCS
- entity: input_boolean.evcs_expiration_force_grid_enabled
name: └ ⏳ le réseau forcé expire tout seul
- entity: input_number.evcs_force_grid_max_minutes
name: " └ durée maximale"
- entity: input_text.evcs_force_grid_last_expiry
name: " └ dernière expiration"
- entity: input_boolean.victron_evcs_allow_grid_hc_night
name: Réseau HC nuit
- entity: input_boolean.victron_evcs_night_battery_charge
name: 🔋 Charge nuit sur batterie (P12)
- entity: input_boolean.victron_evcs_night_battery_done
name: └ surplus de la nuit épuisé
- entity: input_boolean.victron_evcs_allow_grid_hc_midday
name: Réseau HC midi
- entity: input_boolean.victron_evcs_surplus_auto_enabled
name: Contrôleur surplus actif
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Contexte énergie
subtitle: Batterie / PV / maison / réseau
- type: custom:mushroom-template-card
primary: Contexte instantané
secondary: >
SOC {{ states('sensor.victron_battery_soc') | float(0) | round(1) }} %
• PV {{ states('sensor.victron_pv_power_system') | float(0) | round(0) }} W
• Maison {{ states('sensor.victron_consumption_power_l1') | float(0) | round(0) }} W
• Grid {{ states('sensor.victron_grid_power_l1') | float(0) | round(0) }} W
multiline_secondary: true
icon: mdi:home-lightning-bolt
icon_color: >
{% set pv = states('sensor.victron_pv_power_system') | float(0) %}
{% if pv < 300 %} grey
{% elif pv < 1500 %} yellow
{% else %} green
{% endif %}
- type: entities
show_header_toggle: false
entities:
- entity: sensor.victron_battery_soc
name: SOC batterie
- entity: sensor.victron_battery_current
name: Courant batterie
- entity: sensor.victron_pv_power_system
name: Puissance PV
- entity: sensor.victron_consumption_power_l1
name: Charges maison
- entity: sensor.victron_grid_power_l1
name: Puissance réseau
# Lecture seule (04/10) : un appui ici fermait ou ouvrait le contacteur.
- type: simple-entity
entity: switch.edf_general_ok_switch
name: Réseau EDF (fermé = on)
tap_action:
action: none
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Actions rapides
subtitle: Contrôle direct EVCS
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: switch.victron_evcs_charging
name: Charge
icon: mdi:ev-station
show_state: true
state_display: >
[[[
if (!entity) return 'Inconnu';
if (entity.state === 'on') return 'ON';
if (entity.state === 'off') return 'OFF';
return entity.state;
]]]
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- border-radius: 18px
- padding: 12px
name:
- font-size: 15px
- font-weight: 600
state:
- font-size: 12px
state:
- value: "on"
color: "#43a047"
- value: "off"
color: "#757575"
- type: custom:button-card
entity: input_boolean.victron_evcs_surplus_auto_enabled
name: Contrôleur surplus
icon: mdi:robot
show_state: true
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- border-radius: 18px
- padding: 12px
name:
- font-size: 15px
- font-weight: 600
state:
- font-size: 12px
state:
- value: "on"
color: "#26a69a"
- value: "off"
color: "#757575"
- type: custom:button-card
entity: binary_sensor.victron_evcs_vehicle_connected
name: Véhicule
icon: mdi:car-electric
show_state: true
tap_action:
action: more-info
styles:
card:
- border-radius: 18px
- padding: 12px
name:
- font-size: 15px
- font-weight: 600
state:
- font-size: 12px
state:
- value: "on"
color: "#1e88e5"
- value: "off"
color: "#757575"
- type: custom:button-card
entity: number.victron_evcs_set_current_command
name: Courant demandé
icon: mdi:current-ac
show_state: true
tap_action:
action: more-info
hold_action:
action: more-info
styles:
card:
- border-radius: 18px
- padding: 12px
name:
- font-size: 15px
- font-weight: 600
state:
- font-size: 12px
- type: entities
title: Commandes manuelles
show_header_toggle: false
entities:
- entity: switch.victron_evcs_charging
name: Start / Stop charge
- entity: number.victron_evcs_set_current_command
name: Courant demandé
- entity: input_boolean.victron_evcs_charge_permission_now
name: Permission charge
- entity: input_boolean.victron_evcs_control_latch
name: Latch contrôle
- entity: switch.victron_evcs_auto_start
name: Auto Start borne (diagnostic)
- type: horizontal-stack
cards:
- type: button
entity: script.evcs_boost_edf
name: ⚡ BOOST EDF 28A
icon: mdi:flash
icon_height: 60px
tap_action:
action: call-service
service: script.turn_on
target:
entity_id: script.evcs_boost_edf
- type: button
entity: script.evcs_boost_off
name: Retour normal
icon: mdi:flash-off
icon_height: 60px
tap_action:
action: call-service
service: script.turn_on
target:
entity_id: script.evcs_boost_off
- type: entities
title: Plafonds courant EVCS
show_header_toggle: false
entities:
- entity: input_number.evcs_plafond_courant_edf_on
name: Plafond EDF ON (tous modes)
- entity: input_number.victron_evcs_current_max_auto_a
name: Plafond modes auto
- title: Diagnostic
path: diagnostic
icon: mdi:stethoscope
cards:
- type: custom:vertical-stack-in-card
cards:
- type: custom:mushroom-title-card
title: Diagnostic
subtitle: Identité / version / brut
- type: entities
show_header_toggle: false
entities:
- entity: sensor.victron_evcs_product_name
name: Produit
- entity: sensor.victron_evcs_custom_name
name: Nom borne
- entity: sensor.victron_evcs_serial
name: Numéro de série
- entity: sensor.victron_evcs_firmware_version
name: Firmware
- entity: sensor.victron_evcs_connected_raw
name: Connected brut
- entity: sensor.victron_evcs_status_raw
name: Statut brut
- entity: sensor.victron_evcs_mode_raw
name: Mode brut
- entity: switch.victron_evcs_auto_start
name: Auto Start borne
- entity: input_datetime.victron_evcs_last_start_at
name: Dernier start
- entity: input_datetime.victron_evcs_last_stop_at
name: Dernier stop
- entity: input_datetime.victron_evcs_last_current_change_at
name: Dernier changement courant
- entity: input_datetime.victron_evcs_probe_started_at
name: Début probe
- entity: input_datetime.victron_evcs_cloud_debt_started_at
name: Début cloud debt
- entity: input_number.victron_evcs_cloud_debt_kwh
name: Cloud debt
- entity: input_text.victron_evcs_control_last_signature
name: Signature
- type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: 🔌 Agents & surveillance
subtitle: Ce qui tourne tout seul, et de quoi le couper
- type: entities
title: Concierge véhicule (WhatsApp)
entities:
# ⚠️ Ce kill-switch existait depuis le 13/09 et n'était affiché
# sur AUCUN tableau de bord : il fallait passer par les outils de
# développement pour l'atteindre. Un interrupteur d'urgence hors
# de portée n'est pas un interrupteur d'urgence.
- entity: input_boolean.airtria_concierge_enabled
name: Appliquer les étiquettes de véhicule
icon: mdi:car-info
- entity: input_text.airtria_vehicle_label
name: Dernière réponse reçue
icon: mdi:label-outline
- type: divider
- entity: input_select.victron_evcs_vehicle
name: Véhicule branché (piloté par la réponse)
icon: mdi:car-multiple
- type: entities
title: Guichet d'ordres (pilotage)
entities:
# ⚠️ Interrupteur DISTINCT de celui du concierge, et c'est
# delibere : couper le pilotage ne doit pas couper l'etiquetage
# des vehicules. Deux rayons d'action tres differents.
# La liste blanche de ce qui est demandable vit dans le service
# d'historisation, jamais chez l'agent — il demande, il ne decide
# pas de ce qui est demandable.
- entity: input_boolean.airtria_ordres_enabled
name: Appliquer les ordres de pilotage
icon: mdi:remote
- entity: input_text.airtria_ordre
name: Dernier ordre demande
icon: mdi:gesture-tap-button
- type: entities
title: Service d'historisation (10.10.10.22)
entities:
# Le battement de cœur est la SEULE entité du système dont
# l'immobilité soit interprétable : son état est un horodatage,
# il change donc forcément à chaque écriture. La fraîcheur d'une
# entité métier ne dit rien — Home Assistant ne matérialise pas
# une écriture identique, et `last_reported` vaut `last_changed`.
- entity: binary_sensor.historisation_evcs_muette
name: État du service
icon: mdi:heart-pulse
- entity: sensor.historisation_evcs_age_du_battement
name: Âge du dernier battement
icon: mdi:timer-outline
- type: attribute
entity: binary_sensor.historisation_evcs_muette
attribute: cause
name: Cause du dernier échec
icon: mdi:alert-outline
# ----------------------------------------------------------------
# Interventions borne & alertes (19/09/2026)
# Le swap de vehicule trop rapide (14 s) fige la borne et bloque le
# nouveau vehicule. P11-bis (last_changed) le corrige tout seul ; ce
# bouton reste le filet MANUEL si la borne se coince malgre tout.
# L'alerte "branchee mais ne charge pas" est OPT-IN, seuils a calibrer.
# ----------------------------------------------------------------
- type: entities
title: Interventions borne & alertes
entities:
- entity: input_boolean.evcs_reset_borne
name: Reset borne (forcer un retest)
icon: mdi:restart-alert
- type: divider
- entity: input_boolean.evcs_alerte_charge_enabled
name: Envoyer les alertes WhatsApp
icon: mdi:bell-alert
- entity: input_text.evcs_alerte_charge
name: Alerte en cours (vide = rien)
icon: mdi:ev-station
secondary_info: last-changed