RTE Tempo : carte

Bonjour à toutes et à toutes.

Je suis passé à l’offre TEMPO d’EDF, j’ai ajouté l’intégration RTE Tempo en suivant ce tutoriel
J’ai configuré une carte basée sur plusieurs cartes glanées entre autre ici : RTE Tempo couleur demain et sur Intégration Tarif EDF

Bon, elle est en dev mais le but est d’afficher les prix HP et HC du jour et du lendemain.
Il semblerait que @MilesTEG1 utilise les variables suivantes :
sensor.edf_tempo_prix_actuel_hp
sensor.edf_tempo_prix_actuel_hc
sensor.edf_tempo_prix_demain_hp
sensor.edf_tempo_prix_demain_hc

Or je ne trouve pas d’intégration EDF TEMPO, ces variables n’existent pas ni dans RTE Tempo, ni dans Tarif EDF. Dans Tarif EDF, j’ai juste :
sensor.tarif_tempo_heures_creuses_ttc
sensor.tarif_tempo_heures_pleines_ttc

Donc, soit je n’ai pas compris un truc, soit il va falloir faire autrement.
Mon idée est de créer 6 variables : tarifs HP / HC pour les jours rouges / blancs / bleus.
Par défaut, elles sont vides.
Si la variables du jour (en fonction de la couleur) est vide => la mettre à jour avec sensor.tarif_tempo_heures_creuses_ttc et sensor.tarif_tempo_heures_pleines_ttc
Si la variable n’est pas vide et que le prix a changé => mettre à jour la variable correspondante et effacer les autres tarifs car le tarif Tempo a dû changer.

Question : est-il possible de créer les les variables via un script ? Genre si elle n’existe pas, alors la créer ? Ca éviterait de se les taper à la main !!
L’idée c’est de créer ces 6 variables.
input_text.tarif_tempo_heures_creuses_ttc_bleu
input_text.tarif_tempo_heures_pleines_ttc_bleu
input_text.tarif_tempo_heures_creuses_ttc_blanc
input_text.tarif_tempo_heures_pleines_ttc_blanc
input_text.tarif_tempo_heures_creuses_ttc_rouge
input_text.tarif_tempo_heures_pleines_ttc_rouge

Le but ensuite étant de gérer ces variables dans la carte, puis de gérer les cas (si vide) :

var color = states['sensor.rte_tempo_couleur_actuelle'].state;
var tarifs_hc = states['input_text.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state;
var tarifs_hp = states['input_text.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state;

C’est un bon début où je démarre mal ?

Salut ,
Avant que je te partage mes sensors, as-tu vu cette intégration ?

Elle donne les tarifs EDF :blush:

Je l’ai utilisée mais elle ne donne que :
sensor.tarif_tempo_heures_creuses_ttc
sensor.tarif_tempo_heures_pleines_ttc

Donc le jour courant, pas le suivant, surtout s’il n’est pas de la même couleur !
J’ai raté un truc ?

Il te manque les templates sensors pour la carte,
tu trouveras tout ce qu’il faut sur le github de l’integration GitHub - hekmon/rtetempo: RTE Tempo days calendar and sensors for Home Assistant tout en bas tu as des exemples avec les fichiers yaml pour template et input_number.

@Feneck91
Alors voilà ce que j’ai comme template et sensors :
(Je fais un copié collé d’une réponse faite à @David_CLAVERIE :rofl:)

Alors, déjà pour les tarifs, il faut te créer des sensors de type input_numbers :
(chez moi c’est dans un fichier yaml séparé, mis en include dans le configuration.yaml de HA :

utility_meter: !include_dir_merge_named /config/YAML/utility_meters
# Source : https://github.com/hekmon/rtetempo?tab=readme-ov-file#exemples-de-cartes-lovelace
# EDF Tarif Bleu Option Base
tarif_edf_base:
  name: EDF Base
  initial: 0.2516
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
# EDF Tarif Bleu Option HP/HC
tarif_edf_base_hc:
  name: EDF Base HC
  initial: 0.2068
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_base_hp:
  name: EDF Base HP
  initial: 0.2700
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
# EDF Tarif Bleu Option Tempo
tarif_edf_tempo_bleu_hc:
  name: EDF Tempo Bleu HC
  initial: 0.1296
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_tempo_bleu_hp:
  name: EDF Tempo Bleu HP
  initial: 0.1609
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_tempo_blanc_hc:
  name: EDF Tempo Blanc HC
  initial: 0.1486
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_tempo_blanc_hp:
  name: EDF Tempo Blanc HP
  initial: 0.1894
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_tempo_rouge_hc:
  name: EDF Tempo Rouge HC
  initial: 0.1568
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_tempo_rouge_hp:
  name: EDF Tempo Rouge HP
  initial: 0.7562
  min: 0
  max: 1
  step: 0.0001
  mode: box
  unit_of_measurement: "€ /kWh"
  icon: mdi:cash-lock
tarif_edf_abonnement_tempo_9kva:
  name: EDF Tempo Abonnement mensuel 9kVA
  initial: 16.16
  min: 0
  max: 100
  step: 0.01
  mode: box
  unit_of_measurement: "€ TTC /mois"
  icon: mdi:cash-lock

Ensuite, dans le dashboard Énergie, tu places tes sensors de ton ZLinky pour les heures creuses et pleines de couleurs.


Quand tu ajoutes tes senors ici, tu peux choisir les tarifs que tu as créé avant.

Après, pour les cartes Tempo, j’ai des template qui génèrent les valeurs affichées :

# ╔══════════════════════════════════════════════════════════════════════════╗
# ║ Configuration pour les prix TEMPO EDF                                    ║
# ╚══════════════════════════════════════════════════════════════════════════╝
- sensor:
    - name: "EDF Tempo Prix Actuel"
      unique_id: "tempo_time_prices_current"
      device_class: "monetary"
      unit_of_measurement: "c€/kWh"
      icon: "mdi:cash-check"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- endif %}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
          {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- endif %}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prochain Prix"
      unique_id: "tempo_time_prices_next"
      device_class: "monetary"
      unit_of_measurement: "c€/kWh"
      icon: "mdi:cash-clock"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
          {%- if is_state('sensor.rte_tempo_prochaine_couleur', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- else %}
          {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float * 100 }}
          {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float * 100 }}
          {%- else %}
            0
          {%- endif %}
        {%- endif %}



  # ╔══════════════════════════════════════════════════════════════════════════╗
  # ║ Variables avec les prix des HC et HP pour le jour actuel et demain       ║
  # ╚══════════════════════════════════════════════════════════════════════════╝
    - name: "EDF Tempo Prix Actuel HP"
      unique_id: "tempo_time_prices_current_hp"
      device_class: "monetary"
      unit_of_measurement: "€/kWh"
      icon: "mdi:cash-check"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float }}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float  }}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float }}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prix Actuel HC"
      unique_id: "tempo_time_prices_current_hc"
      device_class: "monetary"
      unit_of_measurement: "€/kWh"
      icon: "mdi:cash-check"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_couleur_actuelle'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_couleur_actuelle', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float }}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float  }}
        {%- elif is_state('sensor.rte_tempo_couleur_actuelle', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float }}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prix Demain HP"
      unique_id: "tempo_time_prices_tomorrow_hp"
      device_class: "monetary"
      unit_of_measurement: "€/kWh"
      icon: "mdi:cash-check"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_prochaine_couleur', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hp') | float }}
        {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hp') | float  }}
        {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hp') | float }}
        {%- else %}
          0
        {%- endif %}
    - name: "EDF Tempo Prix Demain HC"
      unique_id: "tempo_time_prices_tomorrow_hc"
      device_class: "monetary"
      unit_of_measurement: "€/kWh"
      icon: "mdi:cash-check"
      availability: >
        {{ not 'unavailable' in
          [
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
          ] and not 'unknown' in
          [
            states('sensor.rte_tempo_prochaine_couleur'),
            states('binary_sensor.rte_tempo_heures_creuses'),
            states('input_number.tarif_edf_tempo_bleu_hp'),
            states('input_number.tarif_edf_tempo_bleu_hc'),
            states('input_number.tarif_edf_tempo_blanc_hp'),
            states('input_number.tarif_edf_tempo_blanc_hc'),
            states('input_number.tarif_edf_tempo_rouge_hp'),
            states('input_number.tarif_edf_tempo_rouge_hc')
          ]
        }}
      state: >
        {%- if is_state('sensor.rte_tempo_prochaine_couleur', "Bleu") %}
            {{ states('input_number.tarif_edf_tempo_bleu_hc') | float }}
        {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Blanc") %}
            {{ states('input_number.tarif_edf_tempo_blanc_hc') | float  }}
        {%- elif is_state('sensor.rte_tempo_prochaine_couleur', "Rouge") %}
            {{ states('input_number.tarif_edf_tempo_rouge_hc') | float }}
        {%- else %}
          0
        {%- endif %}

Ensuite, quand tu dis que tu veux récupérer les consos de chaque jour, tu veux dire dans le dashboard énergie ? ou ailleurs avec des cartes ?
Si c’est le premier, voir plus haut.
Si c’est le deuxième, il te faut des utility_meters :

# ========================================================================================
# =============== Fichier contenant les utility_meter pour le ZLinky_TIC =================
# ========================================================================================

# ╔════════════════════════════════════════════════════════════════════════════╗
# ║ Utility Meter : Consommation totale ZLinky                                 ║
# ║   - pendant 1 heure ;                                                      ║
# ║   - pendant 1 jour ;                                                       ║
# ║   - pendant 1 mois ;                                                       ║
# ║   - pendant 1 année.                                                       ║
# ╚════════════════════════════════════════════════════════════════════════════╝
zlinky_energy_hourly:
  source: sensor.zlinky_tic_east
  cycle: hourly
zlinky_energy_daily:
  source: sensor.zlinky_tic_east
  cycle: daily
zlinky_energy_weekly:
  source: sensor.zlinky_tic_east
  cycle: weekly
zlinky_energy_monthly:
  source: sensor.zlinky_tic_east
  cycle: monthly
zlinky_energy_yearly:
  source: sensor.zlinky_tic_east
  cycle: yearly

# Essai avec template totale conso toutes couleurs
zlinky_somme_toutes_couleurs_energy_hourly:
  source: sensor.zlinky_somme_conso_hc_hp_toutes_couleurs
  cycle: hourly

zlinky_somme_toutes_couleurs_energy_daily:
  source: sensor.zlinky_somme_conso_hc_hp_toutes_couleurs
  cycle: daily

Wahoo quelle réponse !!!
En plus je débute donc là il y a des termes que je ne comprend pas. Je vais examiner toute cette mine d’information calmement !

J’ai pas de ZLinky, c’est quoi ? Il faut un boîtier dans le Linky ?
Pour les consos j’ai mes panneaux photovoltaïques qui donnent la conso de la maison.

D’après ce que j’ai lu, tout est claqué en dur !
La ce que je propose c’est que ça se fasse en automatique

Bon…

utility_meter: !include_dir_merge_named /config/YAML/utility_meters

Pourquoi utility_meter: ?? C’est un nom particulier, visiblement on ne peut pas choisir ce que l’on souhaite, ou c’est lié à une intégration ? (J’ai cherché et je n’ai rien trouvé).

Bon, j’ai fais mon fichier avec les prix à 0.
J’espère pouvoir modifier par un script ces variables comme je le souhaite. Je débute, je ne sais pas encore ce qu’on peut faire, comment on peut le faire et si ce que je souhaite faire est possible.

Ha ! Ça va être costaud de s’attaquetr à ça directement. :crazy_face:

Le ZLinky c’est un petit boitier Zigbee qu’on branche sur la sortie TIC du Linky : LiXee - ZLinky V2 Antenne_externe Non

Il y aura moyen de récupérer les consommations des HC/HP selon la couleur du jour et donc avoir le cout via les tarifs de ces couleurs et tranches horaires.
Mais va falloir travailler un peu sur les templates et les utility_meters.

voir ici : Utility Meter - Home Assistant
c’est un type de capteur.

Ok, je vais regarder.

En fait, le fichier de référence doit être lu (quelque part) et en extraire des trucs : je ne trouve pas le trouve pas.
Visiblement il est lu dans API Coût du gaz et de l’électricité mais pas de prix TEMPO, donc du crées le fichier à la main qui ne se met pas à jour automatiquement.
C’est çà ?

Pourquoi dans ce cas ne pas parser une page WEB ?
Ils doivent bien être quelque part ces tarifs ?

Il me manque des briques pour le moment mais je suis développeur, il y a moyen de faire des trucs bien plus puissant.

Il doit être possible d’analyser la page WEB : https://particulier.edf.fr/fr/accueil/espace-client/mes-contrats.html

Il y a tout ! La puissance souscrite, les tarifs HP / HC et le prix de l’abonnement !

Oui le fichier .yaml doit être présent dans ton dossier config/.
Moi je les place dans /config/YAML/


Oui j’ai créé les fichiers à la main. Mais tu peux créer les capteurs via l’interface de HA, ça fera exactement la même chose.

Oui, mais c’est comlplexe de faire ce que tu décris ici.
L’intégration dont je t’ai parlé récupère les tarifs et les mets à dispo avec des sensors.

Donc ton fichier yaml est un capteur…
Si je modifie ce fichier, il est rechargé automatiquement par HA ?

Elle récupère les tarifs où ? A priori dans le lien que j’ai vu : pas de prix Tempo.
Et de quelle intégration tu parles ? Intégration Tarif EDF ? Il ne récupère pas les prix, enfin si mais pas ceux de Tempo, uniquement les autres tarifs EDF, c’est ici :
Historique des tarifs réglementés de ve…

D’après ce que je comprend, tu t’es inspiré de ce qu’il a fait mais au lieu de récupérer dynamiquement les tarifs, tu l’as créé en dur.

Ce que je pourrais certainement faire, c’est de parser la page web.

Bon, je tente avec ha-multiscrape :

Étape 1, je crée le fichier dans /config/YAML/automatic_tarifs_tempo.yaml :

multiscrape:
  - name: Tarifs EDF Tempo
    authentication: basic
    username: xxxxxx@xxxxx
    password: xxxxxxxxxxxxxxxxxxxxxxxxx
    resource: "https://particulier.edf.fr/fr/accueil/espace-client/selecteur-contrat.html?goto=%2Ffr%2Faccueil%2Fespace-client%2Fmes-contrats.html"
    scan_interval: 60
    sensor:
      - unique_id: puissance_souscrite
        name: Puissance souscrite
        select: "#power"
        value_template: "{{ value.replace('kVA', '') }}"

Puis, je l’ajoute dans configuration.yaml, je redémarre HA et là, rien…

multiscrape: !include_dir_merge_named /config/YAML/automatic_tarifs_tempo.yaml
ou
sensor: !include_dir_merge_named /config/YAML/automatic_tarifs_tempo.yaml

Je ne m’attend pas à ce que ça marche, ça va être compliqué pour se logguer, il demande d’abord le login puis le mot de passe mais je m’attendais à voir dans Entities ma variable puissance_souscrite. Rien.
Je pense que même si ça ne fonctionne pas je devrais voir les variables.

En ajoutant le contenu du fichier directement dans le fichier configuration, ça fonctionne !
Enfin, je vois mon entité !
Je dois pouvoir l’inclure via un include dans le fichier de configuration sans tout mettre dans le fichier de configuration sinon ça va être un peu le bordel.

Bon déjà ça marche !
Dans configuration.yaml :

multiscrape: !include /config/YAML/automatic_tarifs_tempo.yaml

Et le fichier automatic_tarifs_tempo.yaml

- name: Tarifs EDF Tempo
  authentication: basic
  username: wwww@yyyy
  password: zzzzzzzzzzzzzzzzzzzzz
  resource: "https://particulier.edf.fr/fr/accueil/espace-client/selecteur-contrat.html?goto=%2Ffr%2Faccueil%2Fespace-client%2Fmes-contrats.html"
  scan_interval: 60
  sensor:
    - unique_id: puissance_souscrite
      name: Puissance souscrite
      select: "#power"
      value_template: "{{ value.replace('kVA', '') }}"

Bon maintenant il va falloir se logguer !

1 « J'aime »

Bon je cherche mais je ne comprend pas comment se loguer !
Visiblement le site EDF indique que le javascript est désactivé.
Je n’ai pas l’impression que je vais pouvoir me logger !

Bonjour :wave:t2:

Alors , oui et non.
Dans le fichier yaml tu peux avoir plusieurs capteurs (sensors), moi je les groupes par utilisations.
Donc dans le ficher Zlinky tu trouveras tous les capteurs qui s’y rattachent et ainsi de suite.

Non , il faut faire un rechargement via l’onglet « Outils de développement » puis redémarrer HA et enfin « rechargement rapide » ou si ça ne suffit pas « Redémarrer HA ».

C’est son auteur qui les mets à jour. Normalement il doit y avoir les tarifs tempo. Mais je ne l’utilise pas.

Oui c’est de celle là , mais je pensais qu’il y avait les tarif tempo.
Apparemment ça n’est pas encore implémenté…
Faut que tu prennes mes sensors ou d’autres ou que tu crées les tiens.

@MilesTEG1 Voici l’idée mais je ne suis pas certain que je puisse faire ça.
Créer 6 entrées :

  • input_number.tarif_tempo_heures_creuses_ttc_bleu
  • input_number.tarif_tempo_heures_pleines_ttc_bleu
  • input_number.tarif_tempo_heures_creuses_ttc_blanc
  • input_number.tarif_tempo_heures_pleines_ttc_blanc
  • input_number.tarif_tempo_heures_creuses_ttc_rouge
  • input_number.tarif_tempo_heures_pleines_ttc_rouge

Puis, sur changement d’état de sensor.tarif_tempo_heures_creuses_ttc ou sensor.tarif_tempo_heures_pleines_ttc faire :
Si jour en cours est un jour bleu / blanc / rouge => trouver la variable à tester dans input_number.tarif_tempo_heures_xxxxx (en fonction de la couleur et HP / HC).

Si la variable correspondante est à 0 => Setter (est-ce que l’on peut ?) la variable avec le bon tarif
Sinon, mettre toutes les variables (HP / HC en fonction de la couleur) avec le bon tarif et mettre toutes les autres à 0 (les tarifs ont changés).

C’est quand même pas compliqué vu comme ça sauf que …
J’ai tenté et on ne peut pas comparer l’égalité entre deux entrées.
Et je n’ai pas encore tenté d’initialiser une variable avec une autre…

Bref c’est facile sur le papier.
Ça permettrait d’avoir les tarifs à jours SAUF le tarif du lendemain (la première fois après un changement de tarif).

Et j’ai d’autres questions : imaginons que sensor.tarif_tempo_heures_creuses_ttc change, est-ce que tarif_tempo_heures_pleines_ttc change en même temps ? Il ne faudrait pas que si tarif_tempo_heures_pleines_ttc je sois notifié, que je fasse des traitements et que j’assigne à input_number.tarif_tempo_heures_pleines_ttc_ avec un prix qui n’est pas bon.

Sauf à faire 6 automatisations différentes.
Et idem pour la couleur, ou alors ne le faire qu’a 6h00 du matin ou 6h10 pour être sur que la couleur est OK.

Bref j’ai pas mal de questions

Bon, j’ai fini la carte et certaines automatisations :
Il faut se baser sur ce message : RTE Tempo couleur demain - #67 par Feneck91
Mais j’ai changé 2 choses depuis ce message : la carte et l’automatisation.

La carte (un des message ne prenait pas en compte l’année courante), on peut le voir sur la capture ici (jour restant jusque Août 2024), mais c’est corrigé + ajout du jour de la semaine (mer / jeu /etc) :

square: false
type: grid
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.rte_tempo_couleur_actuelle
        name: Aujourd'hui
        show_label: true
        label: |
          [[[
            var date = new Date();
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_couleur_actuelle'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' : 
                        (color === 'blanc') ? '#ffffff' : 
                        (color === 'bleu') ? '#1565c0' : 
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.2em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
      - type: custom:button-card
        entity: sensor.rte_tempo_prochaine_couleur
        name: Demain
        show_label: true
        label: |
          [[[
            var date = new Date();
            date.setDate(date.getDate() + 1);
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_prochaine_couleur'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' :
                        (color === 'blanc') ? '#fFfFfF' : 
                        (color === 'bleu') ? '#1565c0' :
                        (color === 'unavailable') ? 'orange' :
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.3em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
  - type: markdown
    content: "**La couleur du lendemain est actualisée tous les jours dès 6\_h.**\nPour plus d'information, visiter le site [Tempo EDF](https://particulier.edf.fr/fr/accueil/gestion-contrat/options/tempo.html#/).\n\nLes Heures Pleines sont de 6\_h à 22\_h.\nLes Heures Creuses sont de 22\_h à 6\_h.\n"
  - type: glance
    show_name: true
    show_icon: true
    show_state: true
    entities:
      - entity: sensor.tarif_tempo_heures_creuses_ttc
        name: Tarif HC
        icon: mdi:cash
        card_mod:
          style: |
            :host {
              {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
                border-style: solid;
                border-radius: 12px;
                border-color: #ADD6FF;
                background: #ADD6FF;
              {% endif %}
            }
      - entity: sensor.rte_tempo_heures_creuses_changement
        name: Changement
      - entity: sensor.tarif_tempo_heures_pleines_ttc
        name: Tarif HP
        icon: mdi:cash
        card_mod:
          style: |
            :host {
              {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
                border-style: solid;
                border-radius: 12px;
                border-color: #FFB6AD;
                background: #FFB6AD;
              {% endif %}
            }
  - type: markdown
    content: |-
      {% set n = now() %}
      {% set year = n.year %}
      {% if n.month < 9 %}
      {% set year = year - 1 %}
      {% endif %}

      **Jours restants**
      Pour la période du 1er septembre {{ year }} au 31 août {{ year + 1 }}

      La journée de demain est déjà prise en compte dans les décomptes affichés.
  - type: horizontal-stack
    cards:
      - type: markdown
        content: |
          **Jours bleus**
          🔵 {{states('sensor.rte_tempo_cycle_jours_restants_bleu')}}/301
      - type: markdown
        content: |
          **Jours blancs**
          ⚪️ {{states('sensor.rte_tempo_cycle_jours_restants_blanc')}}/43
      - type: markdown
        content: |
          **Jours rouges**
          🔴 {{states('sensor.rte_tempo_cycle_jours_restants_rouge')}}/22
columns: 1

L’automatisation : je gère désormais le fait que le tarif se met à jour n’importe quand (non testé) : Mise à jour ce jour du tarif blanc à 20h00 passé et ça marche !

alias: Update Tarif Tempo
description: Mise à jour des tarifs tempo HP / HC :Bleu / Blanc / Rouge
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.rte_tempo_heures_creuses
    from: "on"
    to: "off"
    for:
      hours: 0
      minutes: 0
      seconds: 30
  - trigger: state
    entity_id:
      - sensor.tarif_tempo_heures_creuses_ttc
      - sensor.tarif_tempo_heures_pleines_ttc
    for:
      hours: 0
      minutes: 1
      seconds: 30
conditions:
  - condition: or
    conditions:
      - condition: state
        entity_id: sensor.rte_tempo_couleur_actuelle
        state: Bleu
      - condition: state
        entity_id: sensor.rte_tempo_couleur_actuelle
        state: Blanc
      - condition: state
        entity_id: sensor.rte_tempo_couleur_actuelle
        state: Rouge
  - condition: template
    value_template: >-
      {% set color = states('sensor.rte_tempo_couleur_actuelle').lower() %}

      {% set nameHP = 'input_number.tarif_tempo_heures_pleines_ttc_' ~ color %}

      {% set nameHC = 'input_number.tarif_tempo_heures_creuses_ttc_' ~ color %}

      {% set lastUpdateHCMin = ((as_timestamp(now()) -
      as_timestamp(states['sensor.tarif_tempo_heures_creuses_ttc'].last_updated))
      / 60 | int) %}

      {% set lastUpdateHPMin = ((as_timestamp(now()) -
      as_timestamp(states['sensor.tarif_tempo_heures_pleines_ttc'].last_updated))
      / 60 | int) %}

      {% set isOneValueIsNotSame = (not is_state(nameHP,
      states['sensor.tarif_tempo_heures_pleines_ttc'].state)) or (not
      is_state(nameHC, states['sensor.tarif_tempo_heures_creuses_ttc'].state))
      %}

      {# Si une des deux valeurs (tarif HP et HC) est différente de celle de
      référence ET si les deux dernière mise à jour du tarif datent de moins de
      6h00 #}

      {# Permet de gérer le fait que la mise à jour du tarif peut arriver plus
      tard dans la journée #}

      {{ isOneValueIsNotSame and lastUpdateHCMin < 360 and lastUpdateHPMin < 360
      }}
actions:
  - sequence:
      - if:
          - condition: template
            value_template: >-
              {% set color = states('sensor.rte_tempo_couleur_actuelle').lower()
              %}

              {% set nameHP = 'input_number.tarif_tempo_heures_pleines_ttc_' ~
              color %}

              {% set nameHC = 'input_number.tarif_tempo_heures_creuses_ttc_' ~
              color %}

              {# Si on arrive ici c'est que les tarifs ne correspondent pas #}

              {# Si le tarif en cours n'est pas à 0 c'est que les tarifs ont
              changés, il faut mettre tous les tarifs à 0 #}

              {{ states(nameHP)|float != 0.0 or states(nameHC)|float != 0.0 }}
        then:
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_creuses_ttc_bleu
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_pleines_ttc_bleu
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_creuses_ttc_blanc
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_pleines_ttc_blanc
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_creuses_ttc_rouge
          - action: input_number.set_value
            metadata: {}
            data:
              value: 0
            target:
              entity_id: input_number.tarif_tempo_heures_pleines_ttc_rouge
      - action: input_number.set_value
        metadata: {}
        data:
          value: |
            {{ states['sensor.tarif_tempo_heures_creuses_ttc'].state }}
        target:
          entity_id: >
            {% set color = states('sensor.rte_tempo_couleur_actuelle').lower()
            %} {{ 'input_number.tarif_tempo_heures_creuses_ttc_' ~ color }}
      - action: input_number.set_value
        metadata: {}
        data:
          value: |
            {{ states['sensor.tarif_tempo_heures_pleines_ttc'].state }}
        target:
          entity_id: >
            {% set color = states('sensor.rte_tempo_couleur_actuelle').lower()
            %} {{ 'input_number.tarif_tempo_heures_pleines_ttc_' ~ color }}
mode: single
2 « J'aime »

Encore un bug !
Il va falloir corriger ça !!
Entre minuit et 6:00 la date est fausse, il faudrait mettre hier et aujourd’hui.
Et à 6:00 les tarifs no sont pas mis à jour donc il faudrait mettre indisponible.
Ça fait parti des cartes que j’avais récupéré

Edit : Voilà une première correction !
Mais j’ai perdu le fond bleu / rouge des HC / HP
Je n’arrive pas à changer les titres pour les centrer ainsi que l’image de la petite horloge.
La gestion du temps restant n’est plus automatique, il y a du code pour ça, du coup c’est un poil mieux fait.

Par exemple, on voit les minutes, ce qui n’était pas le cas avant :

square: false
type: grid
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.rte_tempo_couleur_actuelle
        name: |
          [[[
            var firstDay = "Aujourd'hui";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              firstDay = "Hier";
            }
          return firstDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_couleur_actuelle'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' : 
                        (color === 'blanc') ? '#ffffff' : 
                        (color === 'bleu') ? '#1565c0' : 
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.2em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
      - type: custom:button-card
        entity: sensor.rte_tempo_prochaine_couleur
        name: |
          [[[
            var secondDay = "Demain";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              secondDay = "Aujourd'hui";
            }
          return secondDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            date.setDate(date.getDate() + 1);
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est après demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_prochaine_couleur'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' :
                        (color === 'blanc') ? '#fFfFfF' : 
                        (color === 'bleu') ? '#1565c0' :
                        (color === 'unavailable') ? 'orange' :
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.3em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
  - type: markdown
    content: "**La couleur du lendemain est actualisée tous les jours dès 6\_h.**\nPour plus d'information, visiter le site [Tempo EDF](https://particulier.edf.fr/fr/accueil/gestion-contrat/options/tempo.html#/).\n\nLes Heures Pleines sont de 6\_h à 22\_h.\nLes Heures Creuses sont de 22\_h à 6\_h.\n"
  - type: grid
    square: false
    columns: 1
    cards:
      - type: horizontal-stack
        cards:
          - type: markdown
            content: >-
              {# Calcul HC Bleu #}

              {% set tarifs_hc_bleu = 'Indisponible' %}

              {% set tarifs_hc_val_bleu =
              states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].state
              %}

              {% if tarifs_hc_val_bleu != '0.0' %}

              {% set tarifs_hc_bleu = tarifs_hc_val_bleu.replace('.', ',') + " "
              +
              states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].attributes['unit_of_measurement']
              %}

              {% endif %}

              {% set tarifs_hc_blanc = 'Indisponible' %}

              {% set tarifs_hc_val_blanc =
              states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].state
              %}

              {% if tarifs_hc_val_blanc != '0.0' %}

              {% set tarifs_hc_blanc = tarifs_hc_val_blanc.replace('.', ',') + "
              " +
              states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].attributes['unit_of_measurement']
              %}

              {% endif %}

              {% set tarifs_hc_rouge = 'Indisponible' %}

              {% set tarifs_hc_val_rouge =
              states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].state
              %}

              {% if tarifs_hc_val_rouge != '0.0' %}

              {% set tarifs_hc_rouge = tarifs_hc_val_rouge.replace('.', ',') + "
              " +
              states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].attributes['unit_of_measurement']
              %}

              {% endif %}


              **<p style="text-align:center;">Tarif HC</p>**


              🔵 {{ tarifs_hc_bleu }}

              ⚪️ {{ tarifs_hc_blanc }}

              🔴 {{ tarifs_hc_rouge }}
          - type: markdown
            content: >-
              {% set rel =
              ((as_timestamp(states['sensor.rte_tempo_heures_creuses_changement'].state)
              | float) - as_timestamp(now())) %}

              {% set duration = 'Maintenant' %}

              {% if (rel / 3600.0) >= 2.0 %}

              {% set duration = 'Dans ' + ((rel / 3600.0) | round(0) | string) +
              ' heures' %}

              {% elif (rel / 3600.0) >= 1.0 %}

              {% set duration = 'Dans une heure' %}

              {% elif rel / 3600.0 > 0.0 and ((rel / 60.0) | round(0)) > 1.0 %}

              {% set duration = 'Dans ' + ((rel / 60.0) | round(0) | string) + '
              minutes' %}

              {% elif rel / 3600.0 > 0.0 %}

              {% set duration = 'Dans une minute' %}

              {% endif %}

              **<p style="text-align:center;">Changement</p>**

              <ha-icon icon="mdi:clock"></ha-icon><br/>

              {{ duration }}
          - type: markdown
            content: >-
              {# Calcul HC Bleu #}

              {% set tarifs_hp_bleu = 'Indisponible' %}

              {% set tarifs_hp_val_bleu =
              states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].state
              %}

              {% if tarifs_hp_val_bleu != '0.0' %}

              {% set tarifs_hp_bleu = tarifs_hp_val_bleu.replace('.', ',') + " "
              +
              states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].attributes['unit_of_measurement']
              %}

              {% endif %}

              {% set tarifs_hp_blanc = 'Indisponible' %}

              {% set tarifs_hp_val_blanc =
              states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].state
              %}

              {% if tarifs_hp_val_blanc != '0.0' %}

              {% set tarifs_hp_blanc = tarifs_hp_val_blanc.replace('.', ',') + "
              " +
              states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].attributes['unit_of_measurement']
              %}

              {% endif %}

              {% set tarifs_hp_rouge = 'Indisponible' %}

              {% set tarifs_hp_val_rouge =
              states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].state
              %}

              {% if tarifs_hp_val_rouge != '0.0' %}

              {% set tarifs_hp_rouge = tarifs_hp_val_rouge.replace('.', ',') + "
              " +
              states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].attributes['unit_of_measurement']
              %}

              {% endif %}


              **<p style="text-align:center;">Tarif HP</p>**


              🔵 {{ tarifs_hp_bleu }}

              ⚪️ {{ tarifs_hp_blanc }}

              🔴 {{ tarifs_hp_rouge }}
  - type: markdown
    content: |-
      {% set n = now() %}
      {% set year = n.year %}
      {% if n.month < 9 %}
      {% set year = year - 1 %}
      {% endif %}

      **Jours restants**
      Pour la période du 1er septembre {{ year }} au 31 août {{ year + 1 }}

      La journée de demain est déjà prise en compte dans les décomptes affichés.
  - type: horizontal-stack
    cards:
      - type: markdown
        content: |
          **Jours bleus**
          🔵 {{states('sensor.rte_tempo_cycle_jours_restants_bleu')}}/301
      - type: markdown
        content: |
          **Jours blancs**
          ⚪️ {{states('sensor.rte_tempo_cycle_jours_restants_blanc')}}/43
      - type: markdown
        content: |
          **Jours rouges**
          🔴 {{states('sensor.rte_tempo_cycle_jours_restants_rouge')}}/22
columns: 1

Bon, voilà la dernière version de la carte.
Elle comporte les tarifs HP / HC des jours bleu / blanc / rouge.
Elle a les titres correctement centrée.
Les bonnes couleurs des icônes (image de la petite horloge).
La gestion du temps restant n’est plus automatique, il y a du code pour ça, du coup c’est bien mieux.
On pourra voir au passage que le tarif blanc s’est correctement mis à jour (tard dans la soirée).
Les informations de journée (1ère ligne) sont corrigés lorsque l’heure est entre 0:00 et 6h00 du matin.

Et voilà le code :

square: false
type: grid
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.rte_tempo_couleur_actuelle
        name: |
          [[[
            var firstDay = "Aujourd'hui";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              firstDay = "Hier";
            }
          return firstDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_couleur_actuelle'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' : 
                        (color === 'blanc') ? '#ffffff' : 
                        (color === 'bleu') ? '#1565c0' : 
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.2em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
      - type: custom:button-card
        entity: sensor.rte_tempo_prochaine_couleur
        name: |
          [[[
            var secondDay = "Demain";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              secondDay = "Aujourd'hui";
            }
          return secondDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            date.setDate(date.getDate() + 1);
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est après demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_prochaine_couleur'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' :
                        (color === 'blanc') ? '#fFfFfF' : 
                        (color === 'bleu') ? '#1565c0' :
                        (color === 'unavailable') ? 'orange' :
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.3em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
  - type: markdown
    content: "**La couleur du lendemain est actualisée tous les jours dès 6\_h.**\nPour plus d'information, visiter le site [Tempo EDF](https://particulier.edf.fr/fr/accueil/gestion-contrat/options/tempo.html#/).\n\nLes Heures Pleines sont de 6\_h à 22\_h.\nLes Heures Creuses sont de 22\_h à 6\_h.\n"
  - type: grid
    square: false
    columns: 1
    cards:
      - type: horizontal-stack
        cards:
          - type: markdown
            card_mod:
              style:
                ha-markdown: |
                  ha-card
                  {
                    {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
                      border-style: solid;
                      border-radius: 12px;
                      border-color: #ADD6FF;
                      background: #ADD6FF;
                    {% endif %}
                  }
            content: >-
              {# Calcul HC Bleu #}
              {% set tarifs_hc_bleu = 'Indisponible' %}
              {% set tarifs_hc_val_bleu =
              states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].state %}
              {% if tarifs_hc_val_bleu != '0.0' %}
              {% set tarifs_hc_bleu = tarifs_hc_val_bleu.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].attributes['unit_of_measurement'] %}
              {% endif %}
              {% set tarifs_hc_blanc = 'Indisponible' %}
              {% set tarifs_hc_val_blanc = states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].state %}
              {% if tarifs_hc_val_blanc != '0.0' %}
              {% set tarifs_hc_blanc = tarifs_hc_val_blanc.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].attributes['unit_of_measurement'] %}
              {% endif %}
              {% set tarifs_hc_rouge = 'Indisponible' %}
              {% set tarifs_hc_val_rouge = states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].state %}
              {% if tarifs_hc_val_rouge != '0.0' %}
              {% set tarifs_hc_rouge = tarifs_hc_val_rouge.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].attributes['unit_of_measurement'] %}
              {% endif %}

              **<center>Tarif HC</center>**
              <br/>
              🔵 {{ tarifs_hc_bleu }}<br/>
              ⚪️ {{ tarifs_hc_blanc }}<br/>
              🔴 {{ tarifs_hc_rouge }}<br/>
          - type: markdown
            content: >-
              {% set rel = ((as_timestamp(states['sensor.rte_tempo_heures_creuses_changement'].state) | float) - as_timestamp(now())) %}
              {% set duration = 'Maintenant' %}
              {% if (rel / 3600.0) >= 2.0 %}
              {% set duration = 'Dans ' + ((rel / 3600.0) | round(0) | string) + ' heures' %}
              {% elif (rel / 3600.0) >= 1.0 %}
              {% set duration = 'Dans une heure' %}
              {% elif rel / 3600.0 > 0.0 and ((rel / 60.0) | round(0)) > 1.0 %}
              {% set duration = 'Dans ' + ((rel / 60.0) | round(0) | string) + ' minutes' %}
              {% elif rel / 3600.0 > 0.0 %}
              {% set duration = 'Dans une minute' %}
              {% endif %}

              **<center>Changement</center>**
              <br/>
              <center><font color="#44739E"><ha-icon icon="mdi:clock"></ha-icon></font><br/></center>
              <br/>
              <center>{{ duration }}</center>
          - type: markdown
            card_mod:
              style:
                ha-markdown: |
                  ha-card
                  {
                    {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
                      border-style: solid;
                      border-radius: 12px;
                      border-color: #FFB6AD;
                      background: #FFB6AD;
                    {% endif %}
                  }
            content: >-
              {# Calcul HP Bleu #}
              {% set tarifs_hp_bleu = 'Indisponible' %}
              {% set tarifs_hp_val_bleu = states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].state %}
              {% if tarifs_hp_val_bleu != '0.0' %}
              {% set tarifs_hp_bleu = tarifs_hp_val_bleu.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].attributes['unit_of_measurement'] %}
              {% endif %}
              {% set tarifs_hp_blanc = 'Indisponible' %}
              {% set tarifs_hp_val_blanc = states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].state %}
              {% if tarifs_hp_val_blanc != '0.0' %}
              {% set tarifs_hp_blanc = tarifs_hp_val_blanc.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].attributes['unit_of_measurement'] %}
              {% endif %}
              {% set tarifs_hp_rouge = 'Indisponible' %}
              {% set tarifs_hp_val_rouge = states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].state %}
              {% if tarifs_hp_val_rouge != '0.0' %}
              {% set tarifs_hp_rouge = tarifs_hp_val_rouge.replace('.', ',') + " " + states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].attributes['unit_of_measurement'] %}
              {% endif %}

              **<center>Tarif HP</center>**
              <br/>
              🔵 {{ tarifs_hp_bleu }}<br/>
              ⚪️ {{ tarifs_hp_blanc }}<br/>
              🔴 {{ tarifs_hp_rouge }}<br/>
  - type: markdown
    content: |-
      {% set n = now() %}
      {% set year = n.year %}
      {% if n.month < 9 %}
      {% set year = year - 1 %}
      {% endif %}

      **Jours restants**
      Pour la période du 1er septembre {{ year }} au 31 août {{ year + 1 }}

      La journée de demain est déjà prise en compte dans les décomptes affichés.
  - type: horizontal-stack
    cards:
      - type: markdown
        content: |
          **Jours bleus**
          🔵 {{states('sensor.rte_tempo_cycle_jours_restants_bleu')}}/301
      - type: markdown
        content: |
          **Jours blancs**
          ⚪️ {{states('sensor.rte_tempo_cycle_jours_restants_blanc')}}/43
      - type: markdown
        content: |
          **Jours rouges**
          🔴 {{states('sensor.rte_tempo_cycle_jours_restants_rouge')}}/22
columns: 1
1 « J'aime »

Autre carte.
J’ai retiré les unités des prix, mis sous le titre.
En effet, sinon sur un tel portable c’est trop large. Voilà ce que ça donne :

square: false
type: grid
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.rte_tempo_couleur_actuelle
        name: |
          [[[
            var firstDay = "Aujourd'hui";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              firstDay = "Hier";
            }
          return firstDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_couleur_actuelle'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' : 
                        (color === 'blanc') ? '#ffffff' : 
                        (color === 'bleu') ? '#1565c0' : 
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.2em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
      - type: custom:button-card
        entity: sensor.rte_tempo_prochaine_couleur
        name: |
          [[[
            var secondDay = "Demain";

            if (new Date().getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
              secondDay = "Aujourd'hui";
            }
          return secondDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            date.setDate(date.getDate() + 1);
            if (date.getHours() < 12 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
            { // Jusque midi pour se mettre à jour (passer en HC) !
              // Sans cette gestion, entre 0h00 et 6h00 les jours
              // sont faux, c'est après demain !
              date.setDate(date.getDate() - 1);
            }
            var dayOfWeek = date.toLocaleString('fr-FR', { weekday: 'short' });
            var day = ('0' + date.getDate()).slice(-2);
            var month = date.toLocaleString('fr-FR', { month: 'short' });
            var color = states['sensor.rte_tempo_prochaine_couleur'].state;
            var color_text = (color === 'unavailable') ? "(Non disponible)" : "Jour " + color;
            // Tarifs
            var tarifs_hc = 'Non disponible';
            var tarifs_hc_unit = '';
            var tarifs_hp = 'Non disponible';
            var tarifs_hp_unit = '';
            
            if (color !== 'unavailable')
            {
               var tarifs_hc_val = (states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].state);
               if (tarifs_hc_val != 0.0)
               {
                  tarifs_hc_unit = states['input_number.tarif_tempo_heures_creuses_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hc = tarifs_hc_val.replace('.', ',');
               }
               var tarifs_hp_val = (states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].state);
               if (tarifs_hp_val != 0.0)
               {
                  tarifs_hp_unit = states['input_number.tarif_tempo_heures_pleines_ttc_' + color.toLowerCase()].attributes['unit_of_measurement'];
                  tarifs_hp = tarifs_hp_val.replace('.', ',');
               }
            }
            return `${dayOfWeek} <span style="font-size: 1.5em;">${day}</span> ${month}<hr style="margin: 1px 0 8px; border-top: 1px solid rgba(0, 0, 0, 0.2);">Tarif HC : ${tarifs_hc} ${tarifs_hc_unit}<br/>Tarif HP : ${tarifs_hp} ${tarifs_hp_unit}`;
          ]]]
        styles:
          card:
            - height: 130px
            - background-color: |
                [[[
                  var color = states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase();
                  return (color === 'rouge') ? '#c62828' :
                        (color === 'blanc') ? '#fFfFfF' : 
                        (color === 'bleu') ? '#1565c0' :
                        (color === 'unavailable') ? 'orange' :
                        'var(--card-background-color)';
                ]]]
            - color: |
                [[[
                  return (states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
                ]]]
            - border-radius: 20px
            - padding: 16px
            - font-size: 1.2em
            - text-align: center
            - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
          grid:
            - grid-template-areas: "\"n\" \"l\""
            - grid-template-rows: 1fr min-content
          name:
            - font-weight: bold
            - font-size: 1.3em
          label:
            - font-size: 0.9em
            - justify-self: center
            - align-self: center
            - margin-top: 10px
  - type: markdown
    content: "**La couleur du lendemain est actualisée tous les jours dès 6\_h.**\nPour plus d'information, visiter le site [Tempo EDF](https://particulier.edf.fr/fr/accueil/gestion-contrat/options/tempo.html#/).\n\nLes Heures Pleines sont de 6\_h à 22\_h.\nLes Heures Creuses sont de 22\_h à 6\_h.\n"
  - type: grid
    square: false
    columns: 1
    cards:
      - type: horizontal-stack
        cards:
          - type: markdown
            card_mod:
              style:
                ha-markdown: |
                  ha-card
                  {
                    {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'on') %}
                      border-style: solid;
                      border-radius: 12px;
                      border-color: #ADD6FF;
                      background: #ADD6FF;
                    {% endif %}
                  }
            content: >-
              {# Calcul HC Bleu #}
              {% set tarifs_hc_bleu = 'Indisponible' %}
              {% set unit_hc_bleu = '' %}
              {% set tarifs_hc_val_bleu =
              states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].state %}
              {% if tarifs_hc_val_bleu != '0.0' %}
              {% set tarifs_hc_bleu = tarifs_hc_val_bleu.replace('.', ',') %}
              {# {% set unit_hc_bleu = states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].attributes['unit_of_measurement'] %} #}
              {% endif %}
              {# Calcul HC Blanc #}
              {% set tarifs_hc_blanc = 'Indisponible' %}
              {% set unit_hc_blanc = '' %}
              {% set tarifs_hc_val_blanc = states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].state %}
              {% if tarifs_hc_val_blanc != '0.0' %}
              {% set tarifs_hc_blanc = tarifs_hc_val_blanc.replace('.', ',') %}
              {# {% set unit_hc_blanc = states['input_number.tarif_tempo_heures_creuses_ttc_blanc'].attributes['unit_of_measurement'] %} #}
              {% endif %}
              {# Calcul HC Rouge #}
              {% set tarifs_hc_rouge = 'Indisponible' %}
              {% set unit_hc_rouge = '' %}
              {% set tarifs_hc_val_rouge = states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].state %}
              {% if tarifs_hc_val_rouge != '0.0' %}
              {% set tarifs_hc_rouge = tarifs_hc_val_rouge.replace('.', ',') %}
              {# {% set unit_hc_rouge = states['input_number.tarif_tempo_heures_creuses_ttc_rouge'].attributes['unit_of_measurement'] %} #}
              {% endif %}

              **<center>Tarif HC</center>**
              <center>({{ states['input_number.tarif_tempo_heures_creuses_ttc_bleu'].attributes['unit_of_measurement'] }})</center>
              <br/>
              🔵 {{ tarifs_hc_bleu }} {{ unit_hc_bleu }}<br/>
              ⚪️ {{ tarifs_hc_blanc }} {{ unit_hc_blanc }}<br/>
              🔴 {{ tarifs_hc_rouge }} {{ unit_hc_rouge }}<br/>
          - type: markdown
            content: >-
              {% set rel = ((as_timestamp(states['sensor.rte_tempo_heures_creuses_changement'].state) | float) - as_timestamp(now())) %}
              {% set duration = 'Maintenant' %}
              {% if (rel / 3600.0) >= 2.0 %}
              {% set duration = 'Dans ' + ((rel / 3600.0) | round(0) | string) + ' heures' %}
              {% elif (rel / 3600.0) >= 1.0 %}
              {% set duration = 'Dans une heure' %}
              {% elif rel / 3600.0 > 0.0 and ((rel / 60.0) | round(0)) > 1.0 %}
              {% set duration = 'Dans ' + ((rel / 60.0) | round(0) | string) + ' minutes' %}
              {% elif rel / 3600.0 > 0.0 %}
              {% set duration = 'Dans une minute' %}
              {% endif %}

              **<center>Changement</center>**
              <br/>
              <center><font color="#44739E"><ha-icon icon="mdi:clock"></ha-icon></font><br/></center>
              <br/>
              <center>{{ duration }}</center>
          - type: markdown
            card_mod:
              style:
                ha-markdown: |
                  ha-card
                  {
                    {% if is_state('binary_sensor.rte_tempo_heures_creuses', 'off') %}
                      border-style: solid;
                      border-radius: 12px;
                      border-color: #FFB6AD;
                      background: #FFB6AD;
                    {% endif %}
                  }
            content: >-
              {# Calcul HP Bleu #}
              {% set tarifs_hp_bleu = 'Indisponible' %}
              {% set unit_hp_bleu = '' %}
              {% set tarifs_hp_val_bleu = states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].state %}
              {% if tarifs_hp_val_bleu != '0.0' %}
              {% set tarifs_hp_bleu = tarifs_hp_val_bleu.replace('.', ',') %}
              {# {% set unit_hp_bleu = states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].attributes['unit_of_measurement'] %} #}
              {% endif %}
              {% set tarifs_hp_blanc = 'Indisponible' %}
              {# Calcul HP Blanc #}
              {% set unit_hp_blanc = '' %}
              {% set tarifs_hp_val_blanc = states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].state %}
              {% if tarifs_hp_val_blanc != '0.0' %}
              {% set tarifs_hp_blanc = tarifs_hp_val_blanc.replace('.', ',') %}
              {# {% set unit_hp_blanc = states['input_number.tarif_tempo_heures_pleines_ttc_blanc'].attributes['unit_of_measurement'] %} #}
              {% endif %}
              {% set tarifs_hp_rouge = 'Indisponible' %}
              {# Calcul HP Rouge #}
              {% set unit_hp_rouge = '' %}
              {% set tarifs_hp_val_rouge = states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].state %}
              {% if tarifs_hp_val_rouge != '0.0' %}
              {% set tarifs_hp_rouge = tarifs_hp_val_rouge.replace('.', ',') %}
              {# {% set unit_hp_rouge = states['input_number.tarif_tempo_heures_pleines_ttc_rouge'].attributes['unit_of_measurement'] %} #}
              {% endif %}

              **<center>Tarif HP</center>**
              <center>({{ states['input_number.tarif_tempo_heures_pleines_ttc_bleu'].attributes['unit_of_measurement'] }})</center>
              <br/>
              🔵 {{ tarifs_hp_bleu }} {{ unit_hp_bleu }}<br/>
              ⚪️ {{ tarifs_hp_blanc }} {{ unit_hp_blanc }}<br/>
              🔴 {{ tarifs_hp_rouge }} {{ unit_hp_rouge }}<br/>
  - type: markdown
    content: |-
      {% set n = now() %}
      {% set year = n.year %}
      {% if n.month < 9 %}
      {% set year = year - 1 %}
      {% endif %}

      **Jours restants**
      Pour la période du 1er septembre {{ year }} au 31 août {{ year + 1 }}

      La journée de demain est déjà prise en compte dans les décomptes affichés.
  - type: horizontal-stack
    cards:
      - type: markdown
        content: |
          **Jours bleus**
          🔵 {{states('sensor.rte_tempo_cycle_jours_restants_bleu')}}/301
      - type: markdown
        content: |
          **Jours blancs**
          ⚪️ {{states('sensor.rte_tempo_cycle_jours_restants_blanc')}}/43
      - type: markdown
        content: |
          **Jours rouges**
          🔴 {{states('sensor.rte_tempo_cycle_jours_restants_rouge')}}/22
columns: 1

Salut

Pour ma part, j’ai opter pour une version simplifié.

Apres 06h00 avant 00h00:


De 00h00 a 06h00:

Code

type: horizontal-stack
cards:
  - type: custom:button-card
    entity: sensor.rte_tempo_couleur_actuelle
    name: |
      [[[
        var firstDay = "Aujourd'hui";
        if (new Date().getHours() < 8 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
                { 
                  // Gestion des jours, entre 0h00 et 6h00 
                  firstDay = "Hier";
                }
      return firstDay;
      ]]]
    show_label: true
    label: |
      [[[
        var date = new Date();
         if (date.getHours() < 8 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
                { 
                  // Gestion des jours, entre 0h00 et 6h00 
                  
                  date.setDate(date.getDate() - 1);
                }
        var day = date.toLocaleString('fr-FR', { weekday: 'short' }).slice(0, 3);
        var dayOfMonth = ('0' + date.getDate()).slice(-2);
        var month = date.toLocaleString('fr-FR', { month: 'short' }).replace('.', '');

        date.setDate(date.getDate() + 1);
        var daydemain = date.toLocaleString('fr-FR', { weekday: 'short' }).slice(0, 3);
        var dayOfMonthdemain = ('0' + date.getDate()).slice(-2);
        var monthdemain = date.toLocaleString('fr-FR', { month: 'short' }).replace('.', '');
        

        var hc = states['binary_sensor.rte_tempo_heures_creuses'].state;
        var couleurActuelle = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();

        var heuresPleinesActuelles = states['binary_sensor.rte_tempo_heures_creuses'].state;
        var heuresCreusesActuelles = states['binary_sensor.rte_tempo_heures_creuses'].state;

        var hpprixLabel;
        if (couleurActuelle === 'bleu' && heuresPleinesActuelles)
        {hpprixLabel = (Math.round(states['input_number.tarif_edf_tempo_bleu_hp'].state *10000)/100).toString();}
         else if (couleurActuelle === 'blanc' && heuresPleinesActuelles)
        {hpprixLabel = (Math.round(states['input_number.tarif_edf_tempo_blanc_hp'].state *10000)/100).toString();}
         else if (couleurActuelle === 'rouge' && heuresPleinesActuelles)
        {hpprixLabel = (Math.round(states['input_number.tarif_edf_tempo_rouge_hp'].state *10000)/100).toString();} 
         else
        {hpprixLabel = 'Indisponible'};

        var hcprixLabel;
        if (couleurActuelle === 'bleu' && heuresCreusesActuelles)
        {hcprixLabel = (Math.round(states['input_number.tarif_edf_tempo_bleu_hc'].state *10000)/100).toString();}
         else if (couleurActuelle === 'blanc' && heuresCreusesActuelles)
        {hcprixLabel = (Math.round(states['input_number.tarif_edf_tempo_blanc_hc'].state *10000)/100).toString();}
         else if (couleurActuelle === 'rouge' && heuresCreusesActuelles)
        {hcprixLabel = (Math.round(states['input_number.tarif_edf_tempo_rouge_hc'].state *10000)/100).toString();}
         else 
        {hcprixLabel = 'Indisponible'};

        var currentHour = new Date().getHours();
        var isCheckedhp = currentHour >= 6 && currentHour < 22; // Check if the current hour is between 06:00 and 22:00
        var isCheckedhc = currentHour < 6 || currentHour >= 22; // Check if the current hour is before 06:00 or after 22:00

        return `<br><span style="font-size: 1.2em; margin: 10px 0;">${day} ${dayOfMonth} ${month}</span>
        <br><span style="font-size: 0.9em; margin: 5px 0;
        ">Au ${daydemain} ${dayOfMonthdemain} ${monthdemain} à 06h00</span>
        <hr style="margin: 1px 0 8px;"
        "> HP ${hpprixLabel} c€/kWh &nbsp;${isCheckedhp ? '✔' : ''}
        <br>HC ${hcprixLabel} c€/kWh &nbsp;${isCheckedhc ? '✔' : ''}
        <br>Heures creuses ${hc}
        <br>Année 2024/2025<br><br>`;
      ]]]
    styles:
      card:
        - height: 200px
        - background-color: |
            [[[
              var color = states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase();
              return (color === 'rouge') ? '#c62828' : 
                     (color === 'blanc') ? 'white' : 
                     (color === 'bleu') ? '#1565c0' : 
                     'var(--card-background-color)';
            ]]]
        - color: |
            [[[
              return (states['sensor.rte_tempo_couleur_actuelle'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
            ]]]
        - border-radius: 20px
        - padding: 2px
        - font-size: 1.2em
        - text-align: center
        - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
      grid:
        - grid-template-areas: "\"n\" \"l\""
        - grid-template-rows: 1fr min-content
      name:
        - font-weight: bold
        - font-size: 1.2em
      label:
        - font-size: 0.8em
        - justify-self: center
        - align-self: center
  - type: custom:button-card
    entity: sensor.rte_tempo_prochaine_couleur
    name: |
      [[[
        var secondDay = "Demain";
        if (new Date().getHours() < 8 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
        { // Jusque midi pour se mettre à jour (passer en HC) !
          // Sans cette gestion, entre 0h00 et 6h00 les jours sont faux, c'est demain !
          secondDay = "Aujourd'hui";
        }
      return secondDay;
      ]]]
    show_label: true
    label: |
      [[[
        var date = new Date();
        date.setDate(date.getDate() + 1);
        if (date.getHours() < 8 && states['binary_sensor.rte_tempo_heures_creuses'].state === 'on')
        { // Jusque midi pour se mettre à jour (passer en HC) !
          // Sans cette gestion, entre 0h00 et 6h00 les jours
          // sont faux, c'est après demain !
          date.setDate(date.getDate() - 1);
        }
        var day = date.toLocaleString('fr-FR', { weekday: 'short' }).slice(0, 3);
        var dayOfMonth = ('0' + date.getDate()).slice(-2);
        var month = date.toLocaleString('fr-FR', { month: 'short' }).replace('.', '');
        var pcolor = states['sensor.rte_tempo_prochaine_couleur'].state;

        var tprice;
         if (pcolor === 'Bleu')
         {tprice = (Math.round(states['input_number.tarif_edf_tempo_bleu_hp'].state *10000)/100).toString();}
          else if (pcolor === 'Blanc')
         {tprice = (Math.round(states['input_number.tarif_edf_tempo_blanc_hp'].state *10000)/100).toString();}
          else if (pcolor === 'Rouge')
         {tprice = (Math.round(states['input_number.tarif_edf_tempo_rouge_hp'].state *10000)/100).toString();} 
          else
         {tprice = 'Indisponible'};    
        
        
        var blrest = states['sensor.rte_tempo_cycle_jours_restants_bleu'].state;
        var bcrest = states['sensor.rte_tempo_cycle_jours_restants_blanc'].state;
        var rgrest = states['sensor.rte_tempo_cycle_jours_restants_rouge'].state;
        
        return `<br><span style="font-size: 1.2em; margin: 10px 0;">${day} ${dayOfMonth} ${month}</span>
        <br><span style="font-size: 0.9em; margin: 5px 0;
        ">A partir de 06h00</span>
        <br><hr style="margin: 1px 0 8px;"
        ">Prix ${tprice} c€/kWh</span>
        <br>🔵 ${blrest} restant 
        <br>⚪️   ${bcrest} restant
        <br>🔴 ${rgrest} restant
       
        <br><br>`;
      ]]]
    styles:
      card:
        - height: 200px
        - background-color: |
            [[[
              var color = states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase();
              return (color === 'rouge') ? '#c62828' : 
                     (color === 'blanc') ? 'white' : 
                     (color === 'bleu') ? '#1565c0' : 
                     'var(--card-background-color)';
            ]]]
        - color: |
            [[[
              return (states['sensor.rte_tempo_prochaine_couleur'].state.toLowerCase() === 'blanc') ? 'black' : 'white';
            ]]]
        - border-radius: 20px
        - padding: 2px
        - font-size: 1.2em
        - text-align: center
        - box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.3)
      grid:
        - grid-template-areas: "\"n\" \"l\""
        - grid-template-rows: 1fr min-content
      name:
        - font-weight: bold
        - font-size: 1.2em
      label:
        - font-size: 0.8em
        - justify-self: center
        - align-self: center

Surtout pour la partie Tarifs, ou je n’ai pas bien compris pourquoi tu as « indisponible », alors que l’on connait les prix au moins pour plusieurs mois ?

1 « J'aime »