Ecole demain ?

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"]
par
state_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.