Dashboard : corrige le rendu des tableaux markdown

Les cartes markdown utilisaient un bloc YAML replie (content: >), qui remplace
les retours a la ligne par des espaces : les tableaux markdown perdaient leur
structure et s'affichaient comme une ligne de texte avec des barres verticales.
Passage en bloc litteral (content: |) sur les six cartes, et le tableau des
profils emet desormais chaque ligne sur la meme ligne que la boucle, sinon
Jinja intercale une ligne vide entre chaque rangee et casse le tableau.
Ajout d'un repli lisible quand les profils ne sont pas encore publies.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-08-24 22:36:57 +02:00
parent a413f48f63
commit 686578ef9d

View File

@@ -16,7 +16,7 @@ views:
state_not: "ok" state_not: "ok"
card: card:
type: markdown type: markdown
content: > content: |
## ⚠️ Bilan indisponible ## ⚠️ Bilan indisponible
{{ states('input_text.evcs_balance_reason') }} {{ states('input_text.evcs_balance_reason') }}
@@ -26,15 +26,11 @@ views:
# --- LA comparaison qui décidera du câblage --------------------- # --- LA comparaison qui décidera du câblage ---------------------
- type: markdown - type: markdown
title: Seuil calculé contre seuil fixe title: Seuil calculé contre seuil fixe
content: > content: |
{% set req = states('input_number.evcs_balance_required_soc') | float(0) %} {% set req = states('input_number.evcs_balance_required_soc') | float(0) %}
{% set fixe = states('input_number.victron_grid_soc_off') | float(0) %} {% set fixe = states('input_number.victron_grid_soc_off') | float(0) %}
{% set soc = states('sensor.victron_battery_soc') | float(0) %} {% set soc = states('sensor.victron_battery_soc') | float(0) %}
{% set ecart = req - fixe %} {% set ecart = req - fixe %}
| | | | | |
|---|---:| |---|---:|
| SOC batterie **maintenant** | **{{ soc | round(0) }} %** | | SOC batterie **maintenant** | **{{ soc | round(0) }} %** |
@@ -93,7 +89,7 @@ views:
state_not: "0.0" state_not: "0.0"
card: card:
type: markdown type: markdown
content: > content: |
### 🔋 Stockage insuffisant pour cette traversée ### 🔋 Stockage insuffisant pour cette traversée
Il manque **{{ states('input_number.evcs_balance_storage_shortfall_kwh') }} kWh** Il manque **{{ states('input_number.evcs_balance_storage_shortfall_kwh') }} kWh**
@@ -106,7 +102,7 @@ views:
# --- Ce qu'on jette --------------------------------------------- # --- Ce qu'on jette ---------------------------------------------
- type: markdown - type: markdown
title: Production title: Production
content: > content: |
{% set bride = is_state('input_boolean.evcs_balance_pv_censored', 'on') %} {% set bride = is_state('input_boolean.evcs_balance_pv_censored', 'on') %}
{% if bride %} {% if bride %}
@@ -157,21 +153,18 @@ views:
- type: markdown - type: markdown
title: Profil horaire de consommation (kWh/h, hors véhicule) title: Profil horaire de consommation (kWh/h, hors véhicule)
content: > content: |
{% set p50 = states('input_text.evcs_balance_consumption_p50').split(',') %} {% set p50 = states('input_text.evcs_balance_consumption_p50').split(',') %}
{% set p80 = states('input_text.evcs_balance_consumption_p80').split(',') %} {% set p80 = states('input_text.evcs_balance_consumption_p80').split(',') %}
{% set env = states('input_text.evcs_balance_envelope').split(',') %} {% set env = states('input_text.evcs_balance_envelope').split(',') %}
{% set cen = states('input_text.evcs_balance_censorship_rate').split(',') %} {% set cen = states('input_text.evcs_balance_censorship_rate').split(',') %}
{% set ok = p50 | length == 24 and p80 | length == 24 and env | length == 24 and cen | length == 24 %}
{% if not ok %}Profils indisponibles — le recalcul quotidien n'a pas encore publié.
{% else %}
| h | conso typique | conso prudente | production max | censure | | h | conso typique | conso prudente | production max | censure |
|---:|---:|---:|---:|---:| |---:|---:|---:|---:|---:|
{% for i in range(24) %}| {{ '%02d' | format(i) }} | {{ p50[i] }} | {{ p80[i] }} | {{ env[i] }} | {{ (cen[i] | float(1) * 100) | round(0) }} % |
{% for i in range(24) %} {% endfor %}{% endif %}
| {{ '%02d' | format(i) }} | {{ p50[i] if p50 | length == 24 else '—' }} | {{ p80[i] if p80 | length == 24 else '—' }} | {{ env[i] if env | length == 24 else '—' }} | {{ (cen[i] | float(1) * 100) | round(0) if cen | length == 24 else '—' }} % |
{% endfor %}
*La colonne « censure » indique la part des jours où la batterie était *La colonne « censure » indique la part des jours où la batterie était
pleine à cette heure : au-delà de 25 %, la production maximale pleine à cette heure : au-delà de 25 %, la production maximale
@@ -193,7 +186,7 @@ views:
name: Explication name: Explication
- type: markdown - type: markdown
content: > content: |
### À propos ### À propos
Ce bilan remplace des seuils fixes par des grandeurs mesurées. Il Ce bilan remplace des seuils fixes par des grandeurs mesurées. Il