RTE Tempo : carte

Si un jour vous en avez marre d’utiliser 36 custom cards différentes pour faire ce que vous faites juste avec une custom:button-card, n’hésitez pas à demander :wink:

Hello
J’étais dans la même situation mais désormais je peut me connecter au site rte.
Jai recus le mail dactivation .
Sur rte ca fonctionne. Par contre pour récupérer l’api la sa se gate.
Je trouve l’api mais des que je veut m’incrire la repart en sucette il me dit pas de compte.
Quelqu’un a compris comment faire ?
Merci de votre aide.

Bonjour,
j’ai un pb avec l’appli de RTE. Après un crash de mon HA, j’ai dû “remonter mes intégrations, dont celle de RTE pour le Tempo. Mais, je ne peux plus la recharger car , n’ayant pas de trace de mon password sur le site, j’ai demandé à le ré-initailisé, en cliquant sur “Mot de Passe oublié”. Seulement maintenant je n’ai pas la possibilité de rentrer un nouveau mot de passe sur mon compte ni de créer un nouveau compte , car le système me répond que le compte existe déjà ou que le mail ne correspond pas. Est-ce que quelqu’un , pourrait m’indiquer la marche à suivre pour réactiver mon compte, car cela me bloque dans mon dev de HA.
Merci

Tu ne peux pas en recréer un avec une nouvelle adresse mail ? :grin:

c’est ce que je viens de faire, mais je trouve dommage , qu’à partir du moment ou tu demandes “Mot de passe oublié” tu ne sois pas redirigé sur une page pour recréer ton nouveau mot de passe.

Hello à tous.tes!

J’ai une info pour vous, effectivement il est impossible de créer un compte, on a tous la même erreur…

Je leur ai écrit par mail, ils ne trouvaient aucune de mes adresses et finalement, il m’ont créé un compte en m’envoyant les identifiants.

Je pense que leur champ mot de passe lors de la création est beugué parce que j’ai pu apercevoir “le mot de pas n’est pas identique” ou un truc du genre lors de l’envoi du formulaire (c’est très bref).

Du coup on a la confirmation mais ça doit quand même planter.

Je testais depuis début d’année donc bon …

Pour info, ils m’ont répondu le jour même.

L’adresse de leur support est en bas de page de datz-rte

Les pauvres vont être spammés de demandes hah

En espérant avoir aidé

1 « J'aime »

Hello,

Merci pour ce retour car j’ai bien tenté depuis aout de me créer un compte et je commençais à me dire que j’étais le seul à ne pas y arriver.

J’ai envoyé un mail on va bien voir. En tout cas l’api me rendrait un bien beau service !

Bonjour,

Pb tjrs d’actualité, j’ai fais un mail suite à votre remarque. En espérant que ça réponde.

Bonjour et merci,
oui, il faut leur faire un email. ils sont réactifs. A toutes fins utiles, ci dessous l’intégration de “météo tempo” de Kriss Récupération des prévisions Tempo

J’ai modifié le code des cartes pour mixer les deux (avec la tarification venant de l’intégration edf)

type: custom:vertical-stack-in-card
title: Prévisions Tempo
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.rte_tempo_couleur_actuelle
        name: |
          [[[
            var firstDay = "Aujourd'hui";
            return firstDay;
          ]]]
        show_label: true
        label: |
          [[[
            var date = new Date();
            
            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['sensor.tarif_bleu_tempo_heures_pleines_ttc'].state *10000)/100).toString();}
             else if (couleurActuelle === 'blanc' && heuresPleinesActuelles)
            {hpprixLabel = (Math.round(states['sensor.tarif_blanc_tempo_heures_pleines_ttc'].state *10000)/100).toString();}
             else if (couleurActuelle === 'rouge' && heuresPleinesActuelles)
            {hpprixLabel = (Math.round(states['sensor.tarif_rouge_tempo_heures_pleines_ttc'].state *10000)/100).toString();} 
             else
            {hpprixLabel = 'Indisponible'};

            var hcprixLabel;
            if (couleurActuelle === 'bleu' && heuresCreusesActuelles)
            {hcprixLabel = (Math.round(states['sensor.tarif_bleu_tempo_heures_creuses_ttc'].state *10000)/100).toString();}
             else if (couleurActuelle === 'blanc' && heuresCreusesActuelles)
            {hcprixLabel = (Math.round(states['sensor.tarif_blanc_tempo_heures_creuses_ttc'].state *10000)/100).toString();}
             else if (couleurActuelle === 'rouge' && heuresCreusesActuelles)
            {hcprixLabel = (Math.round(states['sensor.tarif_rouge_tempo_heures_creuses_ttc'].state *10000)/100).toString();}
             else 
            {hcprixLabel = 'Indisponible'};

            var currentHour = new Date().getHours();
            var isCheckedhp = currentHour >= 6 && currentHour < 22;
            var isCheckedhc = currentHour < 6 || currentHour >= 22;

            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><br>Heures creuses ${hc}
            <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')
            {
              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')
            {
              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['sensor.tarif_bleu_tempo_heures_pleines_ttc'].state *10000)/100).toString();}
              else if (pcolor === 'Blanc')
             {tprice = (Math.round(states['sensor.tarif_blanc_tempo_heures_pleines_ttc'].state *10000)/100).toString();}
              else if (pcolor === 'Rouge')
             {tprice = (Math.round(states['sensor.tarif_rouge_tempo_heures_pleines_ttc'].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(s) 
            <br>⚪️   ${bcrest} restant(s)
            <br>🔴 ${rgrest} restant(s)
           
            <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
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j2
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = (entity.state || '').toLowerCase();
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j3
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = entity.state;
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j4
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = entity.state;
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j5
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = entity.state;
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j6
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = entity.state;
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none
      - type: custom:button-card
        entity: sensor.opendpe_forecast_j7
        name: |
          [[[
            const days = ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'];
            const date = new Date(entity.attributes.date);
            return days[date.getDay()];
          ]]]
        show_state: false
        show_icon: false
        styles:
          card:
            - background-color: transparent
            - border: none
            - box-shadow: none
            - padding: 8px
            - margin-top: 10px
            - min-height: 90px
          grid:
            - grid-template-areas: "\"n\" \"color\" \"prob\""
            - grid-template-rows: auto 40px auto
            - gap: 4px
          name:
            - font-size: 14px
            - color: var(--primary-text-color)
            - padding-bottom: 4px
            - margin: 0
          custom_fields:
            color:
              - width: 40px
              - height: 40px
              - margin: 4px auto
            prob:
              - font-size: 12px
              - padding-top: 4px
              - margin: 0
              - color: var(--secondary-text-color)
        custom_fields:
          color: |
            [[[
              const color = entity.state;
              let bgColor = '#CCCCCC';
              if (color === 'bleu') bgColor = '#1958C4';
              if (color === 'blanc') bgColor = '#F7F7F7';
              if (color === 'rouge') bgColor = '#E5543A';
              return `<div style="width: 100%; height: 100%; background-color: ${bgColor}; border-radius: 6px; border: 1px solid #777777; box-sizing: border-box;"></div>`;
            ]]]
          prob: |
            [[[ 
              const p = entity.attributes.probability;
              if (p === null || p === undefined || p === "") {
                return "?";
              }
              return Math.round(p * 100) + "%";
            ]]]
        tap_action:
          action: none

1 « J'aime »

Moi j’ai celle-ci, revue et corrigée à maintes reprises.
Elle corrige le aujourd’hui / demain entre 0h00 et 6h00 par exemple :

path: default_view
title: Tempo
icon: mdi:transmission-tower
badges: []
cards:
  - 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['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_creuses_ttc'].state);
                   if (tarifs_hc_val != 0.0)
                   {
                      tarifs_hc_unit = states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR', '€');
                      tarifs_hc = tarifs_hc_val.replace('.', ',');
                   }
                   var tarifs_hp_val = (states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_pleines_ttc'].state);
                   if (tarifs_hp_val != 0.0)
                   {
                      tarifs_hp_unit = states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR', '€');
                      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['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_creuses_ttc'].state);
                   if (tarifs_hc_val != 0.0)
                   {
                      tarifs_hc_unit = states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR', '€');
                      tarifs_hc = tarifs_hc_val.replace('.', ',');
                   }
                   var tarifs_hp_val = (states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_pleines_ttc'].state);
                   if (tarifs_hp_val != 0.0)
                   {
                      tarifs_hp_unit = states['sensor.tarif_' + color.toLowerCase() + '_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR', '€');
                      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['sensor.tarif_bleu_tempo_heures_creuses_ttc'].state %}
                  {% if tarifs_hc_val_bleu != '0.0' %} {% set tarifs_hc_bleu =
                  tarifs_hc_val_bleu.replace('.', ',') %} {# {% set unit_hc_bleu
                  =
                  states['sensor.tarif_bleu_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %} {# Calcul HC Blanc #} {% set
                  tarifs_hc_blanc = 'Indisponible' %} {% set unit_hc_blanc = ''
                  %} {% set tarifs_hc_val_blanc =
                  states['sensor.tarif_blanc_tempo_heures_creuses_ttc'].state %}
                  {% if tarifs_hc_val_blanc != '0.0' %} {% set tarifs_hc_blanc =
                  tarifs_hc_val_blanc.replace('.', ',') %} {# {% set
                  unit_hc_blanc =
                  states['sensor.tarif_blanc_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %} {# Calcul HC Rouge #} {% set
                  tarifs_hc_rouge = 'Indisponible' %} {% set unit_hc_rouge = ''
                  %} {% set tarifs_hc_val_rouge =
                  states['sensor.tarif_rouge_tempo_heures_creuses_ttc'].state %}
                  {% if tarifs_hc_val_rouge != '0.0' %} {% set tarifs_hc_rouge =
                  tarifs_hc_val_rouge.replace('.', ',') %} {# {% set
                  unit_hc_rouge =
                  states['sensor.tarif_rouge_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %}

                  **<center>Tarif HC</center>** <center>({{
                  states['sensor.tarif_bleu_tempo_heures_creuses_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') }})</center> <br/> 🔵 {% if
                  states['sensor.rte_tempo_couleur_actuelle'].state == 'Bleu'
                  %}<b>{{ tarifs_hc_bleu }} {{ unit_hc_bleu }}</b>{% else %}{{
                  tarifs_hc_bleu }} {{ unit_hc_bleu }}{% endif %}<br/> ⚪️ {% if
                  states['sensor.rte_tempo_couleur_actuelle'].state == 'Blanc'
                  %}<b>{{ tarifs_hc_blanc }} {{ unit_hc_blanc }}</b>{% else %}{{
                  tarifs_hc_blanc }} {{ unit_hc_blanc }}{% endif %}<br/> 🔴 {%
                  if states['sensor.rte_tempo_couleur_actuelle'].state ==
                  'Rouge' %}<b>{{ tarifs_hc_rouge }} {{ unit_hc_rouge }}</b>{%
                  else %}{{ tarifs_hc_rouge }} {{ unit_hc_rouge }}{% endif
                  %}<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><center>**{{
                  states['sensor.edf_prix_courant'].state }} {{
                  states['sensor.edf_prix_courant'].attributes['unit_of_measurement'].replace('EUR',
                  '€') }}**</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['sensor.tarif_bleu_tempo_heures_pleines_ttc'].state %}
                  {% if tarifs_hp_val_bleu != '0.0' %} {% set tarifs_hp_bleu =
                  tarifs_hp_val_bleu.replace('.', ',') %} {# {% set unit_hp_bleu
                  =
                  states['sensor.tarif_bleu_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %} {% set tarifs_hp_blanc = 'Indisponible'
                  %} {# Calcul HP Blanc #} {% set unit_hp_blanc = '' %} {% set
                  tarifs_hp_val_blanc =
                  states['sensor.tarif_blanc_tempo_heures_pleines_ttc'].state %}
                  {% if tarifs_hp_val_blanc != '0.0' %} {% set tarifs_hp_blanc =
                  tarifs_hp_val_blanc.replace('.', ',') %} {# {% set
                  unit_hp_blanc =
                  states['sensor.tarif_blanc_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %} {% set tarifs_hp_rouge = 'Indisponible'
                  %} {# Calcul HP Rouge #} {% set unit_hp_rouge = '' %} {% set
                  tarifs_hp_val_rouge =
                  states['sensor.tarif_rouge_tempo_heures_pleines_ttc'].state %}
                  {% if tarifs_hp_val_rouge != '0.0' %} {% set tarifs_hp_rouge =
                  tarifs_hp_val_rouge.replace('.', ',') %} {# {% set
                  unit_hp_rouge =
                  states['sensor.tarif_rouge_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') %} #} {% endif %}

                  **<center>Tarif HP</center>** <center>({{
                  states['sensor.tarif_bleu_tempo_heures_pleines_ttc'].attributes['unit_of_measurement'].replace('EUR',
                  '€') }})</center> <br/> 🔵 {% if
                  states['sensor.rte_tempo_couleur_actuelle'].state == 'Bleu'
                  %}<b>{{ tarifs_hp_bleu }} {{ unit_hp_bleu }}</b>{% else %}{{
                  tarifs_hp_bleu }} {{ unit_hp_bleu }}{% endif %}<br/> ⚪️ {% if
                  states['sensor.rte_tempo_couleur_actuelle'].state == 'Blanc'
                  %}<b>{{ tarifs_hp_blanc }} {{ unit_hp_blanc }}</b>{% else %}{{
                  tarifs_hp_blanc }} {{ unit_hp_blanc }}{% endif %}<br/> 🔴 {%
                  if states['sensor.rte_tempo_couleur_actuelle'].state ==
                  'Rouge' %}<b>{{ tarifs_hp_rouge }} {{ unit_hp_rouge }}</b>{%
                  else %}{{ tarifs_hp_rouge }} {{ unit_hp_rouge }}{% endif
                  %}<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
type: masonry

Il faut l’intégration RTE Tempo pour les jours bleu / rouge / blanc et Tarif EDF qui remonte les tarifs tempo et met à jour quand les prix changent !