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 %}
Raison publiée par le contrôleur à ce moment-là : {{ c.contexte }}{% 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 %}
💡 **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 %}
🚫 Piste écartée ({{ e.motif }}) : {{ e.piste }}
{% 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 %}
• {{ c.texte }}
{% endfor %}
{% endfor %}
{% endif %}
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.
- type: markdown
title: ⚖️ Arbitrage (cas non prévus par les règles)
content: |
{% set a = states.sensor.evcs_arbitrage %}
{% if a is none or a.state == 'aucun' %}
Aucune question en attente.{% if a is not none and a.attributes.dernier_cas %} Dernier arbitrage : {{ a.attributes.dernier_cas }} ({{ a.attributes.derniere_issue }}).{% endif %}
{% else %}
{% if a.state == 'question' %}❓ **Question envoyée par WhatsApp**{% elif a.state == 'alerte' %}⚠️ **Alerte envoyée par WhatsApp** (rien à répondre){% else %}✅ **Réponse reçue**{% endif %} (depuis {{ as_timestamp(a.attributes.depuis) | timestamp_custom('%H:%M') if a.attributes.depuis else '?' }})
{{ a.attributes.question }}
{% for c in a.attributes.choix | default([]) %}
**{{ c.cle }}.** {{ c.libelle }}
{% endfor %}
{% if a.state == 'repondu' %}
Réponse : **{{ a.attributes.reponse }}** → {{ a.attributes.application }}
{% endif %}
{% endif %}
Le code détecte la situation et propose des choix fermés ; seul l'ordre du choix retenu est appliqué (liste blanche). Appliquer : {{ states('input_boolean.evcs_arbitrage_enabled') }}.
- type: entities
entities:
- entity: input_boolean.evcs_arbitrage_enabled
name: Arbitrage — appliquer ma réponse
- type: entities
title: 💬 Poser une question au conseiller
entities:
- entity: input_text.evcs_conseiller_question
name: Ta question (Entrée pour envoyer)
- type: markdown
content: |
{% set r = states.sensor.evcs_conseiller_reponse %}
{% set q = states('input_text.evcs_conseiller_question') %}
{% if r is none %}
Pas encore de réponse. Écris une question ci-dessus : le conseiller répond en une à deux minutes (il lit l'état du système, la revue du jour et ses pistes).
{% else %}
{% set en_attente = (as_timestamp(states.input_text.evcs_conseiller_question.last_changed) | int(0)) > (r.attributes.question_at | int(0)) %}
{% if en_attente %}⏳ **Question en cours de traitement…** (« {{ q }} »)
---
{% endif %}
**Question** ({{ r.state }}) : _{{ r.attributes.question }}_
{% if r.attributes.avertissement %}⚠️ **{{ r.attributes.avertissement }}**
{% endif %}
{{ r.attributes.reponse }}
{% if r.attributes.source == 'openrouter' %}☁️ Réponse d'**OpenRouter** (cloud, secours : la Spark n'a pas répondu){% else %}🏠 Réponse du modèle local de la **Spark** ({{ r.attributes.modele }}){% endif %} · le conseiller explique, il ne commande rien.
{% endif %}
Aussi par **OpenClaw** (WhatsApp ou vocal) : « qu'est-ce qui a cloché hier ? »
- 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