Notification créneau de vaccination COVID disponible (doctolib)

par 8 Mai, 2021Articles, Intégrations, Interfaces39 commentaires

Article Sous Licence CC 4.0A partir du 12 mai, il sera possible pour tout le monde de se faire vacciner si un créneau est disponible le lendemain. Voici ce que j’ai mis en place afin d’être alerté des créneaux disponibles d’un centre de vaccination sur Doctolib.

Débutant / Intermédiaire / Avancé

Génération de l’url contenant les données

Comme exemple, je vais utiliser le centre de vaccination Paris La Défense Arena https://www.doctolib.fr/centre-de-sante/nanterre/centre-de-vaccination-covid-pld-arena 1.

Sur cette page, il faut ouvrir l’outil de développement web du navigateur et se rendre sur l’onglet réseau. Ensuite en sélectionnant un motif de consultation sur la page, un appel http va être effectué et il faudra récupérer son url commençant par https://www.doctolib.fr/availabilities.json :

intégration covid

sensor:
  - platform: rest
    resource_template: >-
      {{
        'https://www.doctolib.fr/availabilities.json?'
        ~ 'start_date=' ~ states('sensor.date')
        ~ '&visit_motive_ids=2821077'
        ~ '&agenda_ids=466712-466714-466715-466718-466722-466725-466713-466708-466717-466710-467838-466721-466724-466720'
        ~ '&practice_ids=185169'
        ~ '&insurance_sector=public'
        ~ '&destroy_temporary=true'
        ~ '&limit=7'
      }}
    method: GET
    name: Vaccination available slots Arena
    value_template: "{{ value_json.total }}"
    scan_interval: 60
    timeout: 10
    unit_of_measurement: appointments
    json_attributes:
      - next_slot
      - availabilities
      - reason
      - message
  • Il faut remplacer les paramètres visit_motive_idsagenda_ids et practice_ids par les valeurs présentes dans l’url récupérée plus haut.
  • Le paramètre start_date correspond à la date à partir de laquelle effectuer la recherche, j’utilise le sensor date configuration disponible dans l’intégration Time & Date – Home Assistant.
  • Le paramètre limit correspond au nombre de jour à rechercher. (La valeur minimum est 3 et maximale 20, je crois).

Ce sensor va remonter le nombre de créneau disponible sur la période configurée et dans ses attributs les créneaux disponibles par jour.

intégration covid courbe

Alerte sur les créneaux disponibles du lendemain

Le sensor créé va remonter le nombre de créneau disponible sur une durée d’au moins 3 jours mais ce qui m’intéresse ce sont uniquement ceux du lendemain.

Ajout d’un binary sensor

Afin de créer une alerte, il faut commencer par définir un binary sensor basé sur un template permettant de vérifier si des créneaux sont disponibles sur la période souhaitée. Un attribut days est ajouté sur cette entité permettant de lister ces créneaux par jour (jour même et lendemain).


template:
  - binary_sensor:
    - name: Appointment available Arena
      state: >-
        {%- set days = state_attr('sensor.vaccination_available_slots_arena', 'availabilities') -%}
        {%- set max_date = (now() + timedelta(days=2)).replace(hour=0, minute=0, second=0, microsecond=0)|as_timestamp -%}
        {%- set ns = namespace() -%}
        {%- set ns.slots = [] -%}
        {%- for day in days if day.slots|length > 0 -%}
          {%- set ns.slots =
            ns.slots +
            day.slots|map(attribute='start_date')|map('as_timestamp')|select('<', max_date)|list
          -%}
        {%- endfor -%}
        {{ ns.slots|length > 0 }}
      attributes:
        days: >-
          {%- set days = state_attr('sensor.vaccination_available_slots_arena', 'availabilities') -%}
          {%- set max_date = (now() + timedelta(days=2)).replace(hour=0, minute=0, second=0, microsecond=0)|as_timestamp -%}
          {%- set ns = namespace() -%}
          {%- set ns.days = [] -%}
          {%- for day in days if day.slots|length > 0 -%}
            {%- set slots = day.slots
                  |map(attribute='start_date')
                  |map('as_timestamp')
                  |select('<', max_date)
                  |map('timestamp_custom', '%H:%M', true)
                  |list
            -%}
            {%- if slots|length > 0 -%}
              {%- set ns.days = ns.days + [{
                "date": day.date,
                "slots": slots
              }] -%}
            {%- endif -%}
          {%- endfor -%}
          {{ ns.days }}

Ajout d’une alerte

Pour finir, en créant une alerte, on pourra être notifié lorsque le binary sensor passe à on.


alert:
  appointment_available_arena:
    name: Rendez-vous vaccination disponible
    entity_id: binary_sensor.appointment_available_arena
    state: "on"
    repeat:
      - 5
      - 30
      - 60
    skip_first: false
    can_acknowledge: true
    notifiers:
      - mobile_app_***
    message: >-
      {%- set days = state_attr('binary_sensor.appointment_available_arena', 'days') -%}
      {%- for day in days -%}
      {{ day.date }} :
      {%- for slot in day.slots %}
        - {{ slot.start_date }} ({{ slot.place }})
      {%- endfor -%}
      {%- endfor -%}

Lovelace

Afin d’afficher l’ensemble des rendez-vous disponibles, on peut utiliser une carte de type markdown avec ce code:


{%- set days = state_attr('sensor.vaccination_available_slots_arena', 'availabilities') -%}
**Rendez-vous: {{ states('sensor.vaccination_available_slots_arena') }}**
{% for day in days if day.slots|length > 0 %}
  #### {{ day.date }} :
  {% for slot in day.slots %}
  * {{ slot.start_date|as_timestamp|timestamp_custom('%H:%M', true)  }}
  {%- endfor %}

{% endfor %}
interface covid

Conclusion

Vous avez maintenant une notification lorsque des créneaux sont disponibles.

Une question, un problème

Remerciement (s)

Merci :pray: à @j5lien du forum pour cet article.:writing_hand:

Annexes

Sources

  • RAS

Suivi des modifications

  • 08/05/2021 : création @McFly

 

Un mot sur j5lien

Share This