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

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 < states.sensor.vacances_scolaires.attributes["start_date"] or aujourdhui > states.sensor.vacances_scolaires.attributes["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 < states.sensor.vacances_scolaires.attributes["start_date"] or demain > states.sensor.vacances_scolaires.attributes["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.