A 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.
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.
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
:
Création du sensor
A partir de cette URL, on peut créer un sensor rest, qui va se mettre à jour toutes les minutes :
sensor:
- platform: rest
resource_template: >-
{{
'https://www.doctolib.fr/availabilities.json?'
~ 'start_date=' ~ now().strftime("%Y-%m-%d")
~ '&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
headers:
User-Agent: "Mozilla/5.0 Gecko/20100101 Firefox/88.0"
unit_of_measurement: appointments
json_attributes:
- next_slot
- availabilities
- reason
- message
- Il faut remplacer les paramètres
visit_motive_ids
,agenda_ids
etpractice_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. - 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.
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).
Depuis la version 2021.5 :
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 }}
Versions antérieures à 2021.5 : https://forum.hacf.fr/t/notification-creneau-de-vaccination-disponible-doctolib/4595/20?u=j5lien
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 }}
{%- 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 %}