Vacances scolaires - API data.education.gouv.fr

Mon problème

*Bonjour tout le monde,
Je lance une bouteille à la mer, depuis plusieurs jours je cherche la solution concernant mon problème sur le sujet,
En effet, j’ai récupéré le code ci-dessous depuis le blog de Sigalou que j’ai ajouté dans mon fichier template.yaml:

binary_sensor:
  # Vacances aujourd'hui / demain #
  # Vacancces aujourd'hui
  - name: vacances scolaires aujourd hui
    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 %}

  # Vacances demain
  - 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 %}

Et je rencontre ce message dans mon journal,

Logger: homeassistant.components.template.template_entity
Source: components/template/template_entity.py:478
Integration: Template (documentation, issues)
First occurred: 08:51:59 (2 occurrences)
Last logged: 08:51:59

TemplateError('UndefinedError: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'start_date'') while processing template 'Template<template=({% 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 %}) renders=4>' for attribute '_state' in entity 'binary_sensor.vacances_scolaires_aujourdhui'
TemplateError('UndefinedError: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'start_date'') while processing template 'Template<template=({% 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 %}) renders=4>' for attribute '_state' in entity 'binary_sensor.vacances_scolaires_demain'

J’ai également récupéré ce code que j’ai copié dans mon fichier sensors.yaml:

# Vacances Scolaires #
# https://www.home-assistant.io/integrations/rest
# https://pon.fr/home-assistant-vacances-scolaires/
# https://github.com/papo-o/home-assistant-config/blob/master/integrations/vacances_scolaires.yaml
# vous avez une seule chose à personnaliser, l'academie
# {% set location = 'Limoges' %}
# liste des académies : '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'
# https://help.opendatasoft.com/apis/ods-search-v1/#search-api-v1
- 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 = 'Rouen' %}
    {% 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 %}

Merci pour vos retours,
Bonne journée à tous, au plaisir,
*

Ma configuration


System Information

version core-2023.9.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.5
os_name Linux
os_version 6.1.45
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4970
Installed Version 1.33.0
Stage running
Available Repositories 1299
Downloaded Repositories 4
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 10.5
update_channel stable
supervisor_version supervisor-2023.09.2
agent_version 1.5.1
docker_version 23.0.6
disk_total 30.8 GB
disk_used 6.3 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.7.1), Studio Code Server (5.11.0)
Dashboards
dashboards 2
resources 2
views 19
mode storage
Recorder
oldest_recorder_run 1 octobre 2023 à 18:20
current_recorder_run 3 octobre 2023 à 08:51
estimated_db_size 5.34 MiB
database_engine sqlite
database_version 3.41.2
___

Bj

Ton modèle utilise les attributs « start_date » et « end_date » de l’entité « sensor.vacances_scolaires ». regarde si les attributs existent et sont correctement définis dans ta configuration.

As tu installé workday ??

Bonjour,

Oui j’ai installé et configuré l’intégration Workday,
Peux-tu m’en dire un peu plus sur les attributs « start_date » et « end_date » de mon entité sensor.vacances_scolaires ?
Je débute avec Home Assistant, j’étais sous Jeedom pendant quelques années,

Merci pour ton aide,
Bonne journée,

Je viens de teste sur ma pro est ca fonctionne

Verifie que tu as bien positionné
platform: rest en dessous de sensor:
pareil pour le binary_sensor

je te met les codes yaml

template:
     
  - 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 %} 

et

sensor:

  - 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 %}  

Salut
Ton soucis vient de ça :


source: Templating - Home Assistant

Au démarrage, l’entité est unavailable, et ça te donne cette erreur.
Change ton code :
states.sensor.vacances_scolaires.attributes["start_date"]
par
state_attr('sensor.vacances_scolaires', 'start_date')

Et fait la même chose partout.

Oui, mais Il est possible que tu ais la même erreur dans tes logs.

@Sigalou Toi aussi, tu dois avoir cette erreur.

1 « J'aime »

Bien vue @Giga77 :+1:

Et j’ai pas pensé aux entité unavailable !!

Je viens de rentrer de ma balade avec ma chienne je teste de suite vos recommandations,

Je vous tiens au courant,
Merci,

Merci beaucoup
J’ai corrigé ma page

3 « J'aime »

Merci pour ce nouveau sensor.

Pour utiliser la V2, t’as juste besoin d’utiliser cette URL :

https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-calendrier-scolaire/records?where=end_date%3E%22{{aujourdhui}}%22&order_by=end_date%20ASC&limit={{rows}}&refine=location%3A{{location}}

Edit:
Voici mon sensor (dans le fichier rest.yaml) adapté à la V2:

- scan_interval: "12:00:00"
  resource_template: |-
    {% set location = 'Grenoble' %}
    {% 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/explore/v2.1/catalog/datasets/fr-en-calendrier-scolaire/records?where=end_date%3E%22{{aujourdhui}}%22&order_by=end_date%20ASC&limit={{rows}}&refine=location%3A{{location}}
  sensor:
    name: vacances_scolaires
    json_attributes_path: "$.results[0]"
    json_attributes:
      - start_date
      - end_date
      - description
    value_template: |-
      {% set aujourdhui = now().strftime('%Y-%m-%d')%}
      {% for record in value_json.results -%}
      {% if aujourdhui >= record.start_date and aujourdhui <= record.end_date %} 
      {%- if record.description %}{{record.description}} jusqu'au {{ as_timestamp(record.end_date) | timestamp_custom('%d-%m-%Y') }} {% endif %}
      {% else %} 
      {%- if record.end_date > aujourdhui and record.description %} prochaines : {{record.description}} {{ as_timestamp(record.start_date) | timestamp_custom('%d-%m-%Y') }}{% endif %}
      {% endif %}
      {%- endfor %}

ça apporte un truc la V2 ? vaut mieux l’utiliser ? ¦

A priori, ça n’apporte rien, mais il vaut mieux l’utiliser :


https://help.opendatasoft.com/apis/ods-search-v1/#search-api-v1

Bonsoir à tous,

Je viens de porter les modifications, je rencontre toujours des erreurs dans mon journal:

Logger: homeassistant.components.template.template_entity
Source: components/template/template_entity.py:537
Integration: Template (documentation, issues)
First occurred: 22:20:21 (4 occurrences)
Last logged: 22:22:31

TemplateError('UndefinedError: 'homeassistant.helpers.template.TemplateState object' has no attribute 'start_date'') while processing template 'Template<template=({% set aujourdhui = now().strftime('%Y-%m-%d')%} {% if aujourdhui < states.sensor.vacances_scolaires["start_date"] or aujourdhui > states.sensor.vacances_scolaires["end_date"] %} false {% else %} true {% endif %}) renders=4>' for attribute '_state' in entity 'binary_sensor.vacances_scolaires_aujourdhui'
TemplateError('UndefinedError: 'homeassistant.helpers.template.TemplateState object' has no attribute 'start_date'') while processing template 'Template<template=({% set demain = (as_timestamp(now()) + (24*3600)) | timestamp_custom('%Y-%m-%d', True) %} {% if demain < states.sensor.vacances_scolaires["start_date"] or demain > states.sensor.vacances_scolaires["end_date"] %} false {% else %} true {% endif %}) renders=4>' for attribute '_state' in entity 'binary_sensor.vacances_scolaires_demain'

Merci pour vos retours,
Au plaisir, bonne soirée,

Ce n’est pas bon. Regarde le blog de Sigalou. Il a corrigé les sensors.

C’est tout bon,
Je n’avais pas fait attention, la journée fût longue,

Merci beaucoup pour m’avoir aidé, et pour toutes vos explications
Bonne soirée à tous,

Bonsoir,
Je viens de me rendre compte que si je modifie Grenoble par Rouen, je n’ai plus aucune donnée qui remonte

As-tu rechargé les entités REST ou redémarrer HA ?
As-tu regardé les logs ?

A priori, l’académie de Rouen n’existe plus. C’est Normandie.

Je n’ai que ça dans mes journaux:

Logger: homeassistant.components.rest.util
Source: components/rest/util.py:33
Integration: RESTful (documentation, issues)
First occurred: 21:29:36 (1 occurrences)
Last logged: 21:29:36

JSON result was not a dictionary or list with 0th element a dictionary

Je viens de modifier par Normandie,
C’est good, je récupère bien les informations,

Désolé pour le dérangement,
Merci pour ton aide,
Bonne soirée,
Tom,

1 « J'aime »

Bonjour à tous,

Je viens vers vous afin d’avoir un peu d’aide pour bien comprendre le rouage de HA et ses fichiers YAML;) enfin surtout pour que mes rouages s’alignent correctement dans ce qui me sert de cerveau !!! LOL

Je désire donc mettre en place Vacances Scolaires que Sigalou a partagé sur son blog mais je n’arrive pas à récupérer le sensors Vacances scolaire quand je vais dans outils de développement.

  • J’ai pourtant bien créer le fichier sensors.yaml
  • j’ai copié le code de Sigalou ou j’ai aussi testé avec le code de Giga77 ( V2 ) qui a partagé juste au dessus.
  • J’ai bien sûr redémarrer mon HA après avoir mis le code dans sensors.yaml

Mais toujours rien qui remonte, est ce qu’il ne faut pas rajouter un lien dans configuration.yaml pour qu’il passe voir comment ça se passe dans sensors.yaml ?
C’est cette partie que j’ai du mal à bien comprendre, le côté obscur de la force me fait peur :wink: LOL

Merci d’avance
Ludo