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.