Dans le cadre de l’intégration de Pronote, afin de permettre la création automatique d’une alarme demain matin ou de bien caler la mise à jour de Pronote pour ne pas l’actualiser les jours de vacances scolaires, j’ai besoin de savoir si nous sommes en congés scolaire et s’il y a école demain.

Un jour ouvrable ?
Pour savoir si nous sommes un jour ouvrable ou pas, il suffit d’installer l’extension Workday
Rien de plus simple, tout est dans la documentation.
Je l’ajoute deux fois. Pour avoir demain, on ajoute avec un décalage de 1.



Désactivé = jour non ouvrable
En vacances scolaires ?
Pour savoir si nous sommes en vacances scolaire ou pas, il faut interroger l’API du ministère de l’éducation nationale. Le script utilisé est en V1, il il a une V2.0, si j’ai un peu de temps, je passerai sur le V2.0 plus tard.
- V1 : https://data.education.gouv.fr/api/v1/console/datasets/1.0/search/
- V2.0 : https://data.education.gouv.fr/api/explore/v2.0/console
Ressource utilisée pour ces capteurs (merci à son auteur):
- https://github.com/papo-o/home-assistant-config/blob/master/integrations/vacances_scolaires.yaml
- https://pon.fr/home-assistant-vacances-scolaires/
Ajout d’un sensor ‘vacances_scolaires’
Dans mon fichier sensors.yaml, j’ajoute ce capteur :
- platform: rest
scan_interval: '00:30:00'
name: vacances_scolaires
json_attributes_path: "$.records[0].fields"
json_attributes:
- start_date
- end_date
- description
resource_template: |-
{% set location = 'Aix-Marseille' %}
{% set rows = '1'%}
{% set aujourdhui = now().strftime('%Y-%m-%d')%}
{% set dayOfYear = now().strftime('%j') %}
{% set year = now().strftime('%Y') | int %}
{% set lastYear = year - 1 %}
{% set nextYear = year + 1 %}
{% if dayOfYear > '244' %}
{% set schoolYear = (year | string) + "-" + (nextYear | string) %}
{%- else -%}
{% set schoolYear = (lastYear | string) + "-" + (year | string) %}
{%- endif %}
https://data.education.gouv.fr/api/records/1.0/search/?dataset=fr-en-calendrier-scolaire&facet=start_date&facet=end_date&rows={{rows}}&refine.location={{location}}&sort=-end_date&q=end_date%3E={{aujourdhui}}
value_template: |-
{% set aujourdhui = now().strftime('%Y-%m-%d')%}
{% for record in value_json.records -%}
{% if aujourdhui >= record.fields.start_date and aujourdhui <= record.fields.end_date %}
{%- if record.fields.description %}{{record.fields.description}} jusqu'au {{ as_timestamp(record.fields.end_date) | timestamp_custom('%d-%m-%Y') }} {% endif %}
{% else %}
{%- if record.fields.end_date > aujourdhui and record.fields.description %} prochaines : {{record.fields.description}} {{ as_timestamp(record.fields.start_date) | timestamp_custom('%d-%m-%Y') }}{% endif %}
{% endif %}
{%- endfor %}
Evidemment, il faut changer l’académie : ‘Corse’, ‘Polynésie’, ‘Nouvelle Calédonie’, ‘Guyane’, ‘Aix-Marseille’, ‘Amiens’, ‘Besançon’, ‘Bordeaux’, ‘Clermont-Ferrand’, ‘Créteil’, ‘Dijon’, ‘Grenoble’, ‘Lille’, ‘Limoges’, ‘Lyon’, ‘Montpellier’, ‘Nancy-Metz’, ‘Nantes’, ‘Nice’, ‘Orléans-Tours’, ‘Paris’, ‘Poitiers’, ‘Reims’, ‘Rennes’, ‘Strasbourg’, ‘Toulouse’, ‘Versailles’, ‘Mayotte’, ‘Réunion’, ‘Martinique’, ‘Saint Pierre et Miquelon’, ‘Wallis et Futuna’, ‘Caen’, ‘Rouen’, ‘Guadeloupe’, ‘Normandie’
Résultat de ce capteur

Ces informations doivent permettre d’extraire deux informations sous forme de binary_sensor qui pourront être utilisés dans les automatisations ou scripts.
Ajout de deux capteurs binaires Vacances Scolaires aujourd’hui et Vacances Scolaires demain
Mise à jour le 03/10/2023, grâce à la remarque pertinente de Giga77, je corrige le code ci-dessous et je remplace
states.sensor.vacances_scolaires.attributes["start_date"]
parstate_attr('sensor.vacances_scolaires', 'start_date')
Dans mon fichier templates.yaml, j’ajoute ces capteurs :
- binary_sensor:
- name: vacances_scolaires_aujourdhui
unique_id: binary_sensor.vacances_scolaires_aujourdhui
state: |-
{% set aujourdhui = now().strftime('%Y-%m-%d')%}
{% if aujourdhui < state_attr('sensor.vacances_scolaires', 'start_date') or aujourdhui > state_attr('sensor.vacances_scolaires', 'end_date') %}
false
{% else %}
true
{% endif %}
- binary_sensor:
- name: vacances_scolaires_demain
unique_id: binary_sensor.vacances_scolaires_demain
state: |-
{% set demain = (as_timestamp(now()) + (24*3600)) | timestamp_custom('%Y-%m-%d', True) %}
{% if demain < state_attr('sensor.vacances_scolaires', 'start_date') or demain > state_attr('sensor.vacances_scolaires', 'end_date') %}
false
{% else %}
true
{% endif %}
Résultat de ces capteurs (testé un jour de vacance)


Un binary_sensor pour autoriser la mise à jour Pronote
Il n’y a pas d’utilité à mettre à jour Pronote pendant les vacances ou les jours non-ouvrables.
J’ai créé un binary_sensor qui autorisera ainsi la mise à jour ou pas de Pronote.
Dans mon fichier templates.yaml, j’ajoute ce capteur :
- binary_sensor:
- name: autoriser_miseajour_pronote
unique_id: binary_sensor.autoriser_miseajour_pronote
state: "{{ is_state('binary_sensor.vacances_scolaires_aujourdhui', 'off') and is_state('binary_sensor.ouvrable_aujourd_hui', 'on')}}"
![]()

Ajouter une condition au lancement de la mise à jour
Comme spécifié dans le tuto de l’intégration Pronote, on ajoute une automatisation pour lancer régulièrement la mise à jour Pronote, et avec la nouvelle entité binary_sensor.autoriser_miseajour_pronote, on va autoriser la mise à jour que si binary_sensor.autoriser_miseajour_pronote=on

Voici le code YAML complet de l’automatisation
alias: Mise à jour Pronote
description: ""
trigger:
- platform: time_pattern
hours: /4
condition:
- condition: state
entity_id: binary_sensor.autoriser_miseajour_pronote
state: "on"
action:
- service: shell_command.update_pronote
data: {}
mode: single
Ainsi, les jours ouvrables, hors vacances scolaires, l’autorisation s’active et Pronote se mettra à jour toutes les 4 heures.