[TUTO] Intégration alerte EJP - [Béta Test]

Super, par contre je pense que tu n’as pas pris la dernière version, le nombres de jours restants devraient être 21

J’ai la version que vous avez donné un peu plus haut dans cette discussion… :thinking:

Je l’ai mis à jour (en l’éditant) après le premier post.

hello

merci pour le taf !

hier ca fonctionne super et ce matin j’ai:
sensor.ejp_aujourd_hui unknown # Keep the last valid value if there’s an error
sensor.ejp_demain NON_EJP # Keep the last valid value if there’s an error

Bonjour @Aihua dans ton message je ne vois pas la subtilité EDIT ou EDIT2… Dans la fenêtre où on peut copier le code on est sur EDIT ou EDIT2?
Merci
Cordialement

Bonjour,
Demain Ejp et le nb est deja a 19…
La version du prg doit etre Edit…pas Edit2
Dans le retour de la requête on a bien nb…tires deja a 3…
La version Edit2 n’est pas a jour dans la fenetre…
Merci davance Aihua…
Jp

Bonsoir Aihua,
Depuis quelques jours rien ne va plus … la requête avec les deux bornes Inf et Sup ne fonctionne plus pour déterminer si EJP aujourd’hui ou demain.
j’ai tenté de trouver le pb .
Lorsque je tape dans un navigateur cette requête avec des dates fixes (ex 2023-12-04 et 2024-12-04) le site renvoi erreur !

si je tape 2023-12-4 et 2024-12-4 il me retourne un tableau de valeurs avec les dates , les jours EJP ou NON EJP et les jours HORS EJP.

Dans mon fichier REST.yaml, la requête est bien celle que tu as écrite dans ton fichier (sensors ou configuration) à savoir :

# Sensor EJP Aujourd'hui et demain
- resource_template: "https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=EJP&dateApplicationBorneInf={{ (now().replace(year=now().year - 1) + timedelta(days=1)).strftime('%Y-%m-%d') }}&dateApplicationBorneSup={{ (now() + timedelta(days=1)).strftime('%Y-%m-%d') }}&identifiantConsommateur=src"
  headers:
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Content-Type: application/json
    User-Agent: Wget/1.20.3 (linux-gnu)
  scan_interval: 600  # mettre rafraîchissement toutes les heures
  sensor:
  - name: "EJP Aujourdhui"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set today = now().strftime('%Y-%m-%d') %}
        {% for day in value_json.content.options[0].calendrier %}
          {% if day.dateApplication == today %}
            {{ day.statut }}
          {% endif %}
        {% endfor %}
      {% else %}
        {{ states('sensor.ejp_aujourdhui') }}
      {% endif %}
    unique_id: ejp_aujourdhui  
  

  - name: "EJP Demain"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set tomorrow = (now() + timedelta(days=1)).strftime('%Y-%m-%d') %}
        {% for day in value_json.content.options[0].calendrier %}
         {% if day.dateApplication == tomorrow %}
            {{ day.statut }}
          {% endif %}
        {% endfor %}
      {% else %}
        {{ states('sensor.ejp_demain') }}
      {% endif %}
    unique_id: ejp_demain  
      
  - name: "EJP Infos1"
    value_template:  "{{ value_json}}"
    unique_id: ejp_infos1
      
# nb jours restants 
- resource_template: "https://api-commerce.edf.fr/commerce/activet/v1/saisons/search?option=EJP&dateReference={{ now().strftime('%Y-%m-%d') }}"
  headers:
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Content-Type: application/json
    User-Agent: Wget/1.20.3 (linux-gnu)
  scan_interval: 600  # mettre rafraîchissement toutes les heures
  sensor:
  - name: "EJP jours restants"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set total_days = value_json.content[0].nombreJours %}
        {% set used_days = value_json.content[0].nombreJoursTires %}
        {{ total_days - used_days }}
      {% else %}
        {{ states('sensor.ejp_jours_restants') }}
      {% endif %}
    device_class: power
  
  - name: "EJP infos2"
    value_template:  "{{ value_json }}"

Les données Infos1 et infos2 retournées sont :

il y a bien sûr dans le fichier « configuration.yaml »

rest: !include rest.yaml

Redémarrage HA …
je ne comprends pas … la deuxième requête fonctionne pas la première ?
Avez vous une idée ?
demain nous sommes encore en EJP …
Merci
JP

J’ai l’impression que l’API n’aime pas les dates comme 2024-12-06 mais plutot 2024-12-6. Ensuite, j’ai peur qu’il y ait un délai qui soit nécessaire entre les requêtes.

Bonjour,
la solution finale. qui fonctionne depuis deux jours … en attendant les prochains jours EJP :slight_smile:

Le fichier REST.yaml (avec un scan toutes les 10 minutes)

# Sensor EJP Aujourd'hui et demain      
- resource_template: "https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=EJP&dateApplicationBorneInf={{ (now().replace(year=now().year - 1) + timedelta(days=1)).strftime('%Y-%m-%-d') }}&dateApplicationBorneSup={{ (now() + timedelta(days=1)).strftime('%Y-%m-%-d') }}&identifiantConsommateur=src"
  headers:
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Content-Type: application/json
    User-Agent: Wget/1.20.3 (linux-gnu)
  scan_interval: 600    
  
  sensor:
  - name: "EJP Aujourdhui"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set today = now().strftime('%Y-%m-%d') %}
        {% for day in value_json.content.options[0].calendrier %}
          {% if day.dateApplication == today %}
            {{ day.statut }}
          {% endif %}
        {% endfor %}
      {% else %}
        {{ states('sensor.ejp_aujourdhui') }}
      {% endif %}
    unique_id: ejp_aujourdhui
    icon: 'mdi:calendar'
  
  - name: "EJP Demain"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set tomorrow = (now() + timedelta(days=1)).strftime('%Y-%m-%d') %}
        {% for day in value_json.content.options[0].calendrier %}
         {% if day.dateApplication == tomorrow %}
            {{ day.statut }}
          {% endif %}
        {% endfor %}
      {% else %}
        {{ states('sensor.ejp_demain') }}
      {% endif %}
    unique_id: ejp_demain
    icon: 'mdi:calendar'

  - name: "EJP Hier"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set yesterday = (now() - timedelta(days=1)).strftime('%Y-%m-%d') %}
        {% for day in value_json.content.options[0].calendrier %}
         {% if day.dateApplication == yesterday %}
            {{ day.statut }}
          {% endif %}
        {% endfor %}
      {% else %}
        {{ states('sensor.ejp_hier') }}
      {% endif %}
    unique_id: ejp_hier
    icon: 'mdi:calendar'


# nb jours restants #  rafraîchissement toutes les 10 min 
- resource_template: "https://api-commerce.edf.fr/commerce/activet/v1/saisons/search?option=EJP&dateReference={{ now().strftime('%Y-%m-%d') }}"
  headers:
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Content-Type: application/json
    User-Agent: Wget/1.20.3 (linux-gnu)
  scan_interval: 600  
  sensor:
  - name: "EJP jours restants"
    value_template: >-
      {% if value_json.errors | length == 0 %}
        {% set total_days = value_json.content[0].nombreJours %}
        {% set used_days = value_json.content[0].nombreJoursTires %}
          {% if is_state('sensor.ejp_demain','EJP') %}
            {{ total_days - used_days + 1 }}
          {% else %}
            {{ total_days - used_days }}
          {% endif %}
      {% else %}
        {{ states('sensor.ejp_jours_restants') }}
      {% endif %}
    device_class: power

Notez le format dans srtftime ‹ %Y-%m-%-d › pour avoir une date sans zéro…

Ensuite le fichier sensors.yaml pour les sensors « ejp contact » et « ejp tarif en cours » :

- platform: template
  sensors:
    ejp_contact:
      friendly_name: 'ejp_contact'
      value_template: >-
        {% set hc = now().hour %}
        {% if (is_state('sensor.ejp_hier','EJP') and hc < 1) or (is_state('sensor.ejp_aujourdhui','EJP') and hc >= 7 ) %}
          FERME
        {% else %}
          OUVERT
        {% endif %}  
      icon_template: >-
        {% if is_state('sensor.ejp_contact','OUVERT') %}
          {{ 'mdi:electric-switch' }}
        {% else %}  
          {% if is_state('sensor.ejp_contact','FERME') %}
            {{ 'mdi:electric-switch-closed' }}
          {% else %}
            {{ 'mdi:none' }}
          {% endif %}
        {% endif %}
         
        
- platform: template
  sensors:
    ejp_tarif_en_cours:
      friendly_name: "EJP tarif en cours"
      value_template: >
        {% if is_state('sensor.ejp_contact','FERME') %}
          {{ 1.5197 }}
        {% else %}  
          {{ 0.1758 }}
        {% endif %}    
      icon_template: 'mdi:currency-eur'
      device_class: monetary

Le résultat sur une card :

Super ! merci de ce travail. Je me demande si le sujet du 0 dans le numéro de jour ne va pas se poser aussi pour le numéro de mois. Va falloir attendre l’année prochaine :slight_smile:

Merci aussi à Aihua !
Pour les mois de janvier à mars on mettra ‹ %Y-%-m-%-d › …

Bonjour JP, merci pour le boulot j’ai réussi à avoir les info EJP en recopiant ton code. J’y connais rien dans la programmation je ne fais que du copié collé. J’ai plusieurs questions
1 tu as réalisé un code pour ta carte ?
2 Ejp contact ouvert c’est un relais que tu as ajouté ?
3 tarif en cours je ne le trouve pas dans mes capteurs?
Cordialement Dom

Je n’ai plus de dysfonctionnement depuis que j’ai mis les headers qu’on trouve dans les commandes curl qu’on trouve plus haut :

J’ai adapté ce code à Node-red si ça interesse quelqu’un.

Bonjour,
Ejp_contact est un sensor avec deux etats Ouvert ou Ferme… que j’utilise dans une automation pour la commande de mon ballon eau chaude.
Ejp_tarif_en_cours est un sensor pour visualiser le cout …

pour la card avec les etats EJP HIER … DEMAIN : (trouvée plus haut dans ce post du temps de la requête avec le http://sitenord … qui ne fonctionne plus !)

type: vertical-stack
cards:
  - square: false
    type: grid
    cards:
      - type: custom:vertical-stack-in-card
        cards:
          - type: custom:button-card
            entity: sensor.ejp_hier
            name: HIER
            show_state: true
            styles:
              grid:
                - grid-template-areas: "\"n\" \"i\" \"s\""
              icon:
                - color: |
                    [[[
                          if (entity.state == 'NON_EJP') return 'green' 
                          if (entity.state == 'HORS_PERIODE_EJP') return 'darkblue' 
                          if (entity.state == 'EJP') return 'red' 
                          else return 'grey';                  
                    ]]]
            icon: mdi:home-lightning-bolt-outline
      - type: custom:vertical-stack-in-card
        cards:
          - type: custom:button-card
            entity: sensor.ejp_aujourdhui
            name: AUJOURD'HUI
            show_state: true
            styles:
              grid:
                - grid-template-areas: "\"n\" \"i\" \"s\""
              icon:
                - color: |
                    [[[
                          if (entity.state == 'NON_EJP') return 'green' 
                          if (entity.state == 'HORS_PERIODE_EJP') return 'darkblue' 
                          if (entity.state == 'EJP') return 'red' 
                          else return 'grey';                  
                    ]]]
            icon: mdi:home-lightning-bolt-outline
      - type: custom:vertical-stack-in-card
        cards:
          - type: custom:button-card
            entity: sensor.ejp_demain
            name: DEMAIN
            show_state: true
            styles:
              grid:
                - grid-template-areas: "\"n\" \"i\" \"s\""
              icon:
                - color: |
                    [[[
                          if (entity.state == 'NON_EJP') return 'green' 
                          if (entity.state == 'HORS_PERIODE_EJP') return 'darkblue' 
                          if (entity.state == 'EJP') return 'red' 
                          else return 'grey';
                    ]]]
            icon: mdi:home-lightning-bolt-outline
    columns: 3
title: EJP

Pour la card (avec des tuiles…) avec les sensors contacts et tarifs … :

type: custom:vertical-stack-in-card
cards:
  - type: tile
    entity: sensor.ejp_contact
    show_entity_picture: true
    color: green
    hide_state: false
    state_content: state
  - type: tile
    entity: sensor.ejp_jours_restants
    icon: mdi:calendar-check
    vertical: false
  - type: tile
    entity: switch.chauffe_eau_switch_1
    icon: mdi:water-boiler
    show_entity_picture: false
    vertical: false
    hide_state: false
    tap_action:
      action: none
    icon_tap_action:
      action: none
    hold_action:
      action: none
    name: État du ballon eau chaude
  - type: gauge
    entity: sensor.ejp_tarif_en_cours
    min: 0
    max: 1.6
    needle: true
    severity:
      green: 0
      yellow: 0.17
      red: 0.7
    name: Tarif actuel
    unit: €
  - show_name: true
    show_icon: true
    type: button
    tap_action:
      action: toggle
    entity: automation.marche_ballon
    show_state: true
    icon_height: 50px

Le Ejp_contact me sert aussi pour piloter mes appareils Lave Vaisselle, MAL, Sèche linge par l’intermédiaire de relais wifi (tuya), pas de câblage vers le relais EJP d’EDF au niveau du compteur. je peut modifier le câblage mais j’ai pas envi ! :crazy_face:

Maintenant, je cherche :

1 - comment déclencher l’exécution du fichier REST.yaml (qui contient les deux requêtes et les sensors HIER, AUJOURDHUI et DEMAIN) que dans la période du 1 novembre au 31 mars (pas de scan hors période) . On peut mettre # rest: !include rest.yaml (dans le configuration.yaml) manuellement après le 31 mars mais c’est pas de l’automatisme :crazy_face:
2 - comment éviter les scan multiples (toutes la journée et toutes les heures) dès lors que nous avons eu une fois l’information comme quoi la journée est en EJP. Un reset à 1H du matin de toutes les informations (HIER, AUJOURDHUI et DEMAIN). Puis une lecture pour connaitre les informations HIER et AUJOURDHUI, et entre 13H et 15H … celle pour demain…
3 - refaire le calendrier EJP pour une vue globale des jours EJP…

Si vous avez des idées … je prends !
merci :wink:


Pourquoi ça me donne ça ? Vous avez une idée?

Oui …
Il faut avoir charger l’integration HACS…puis le package vertical stack in card…



Je pense que j’ai pas fait d’erreur, mais j’ai toujours cet affichage. Il n’y a pas de fichier spécifique YAML à créer ?

Il te faut aussi le package button card…« Custum element does not exist button card » tjs dans hacs…

Merci pour vos réponses.