Calcul automatique d'un jour férié en France

Bonjour à tous.

Je vous partage un bout de mon configuration.yaml que je viens de faire, permettant de savoir si aujourd’hui c’est férié ou non. (Incluant les jours fériés fixes, mais aussi mobiles puisqu’ils calculables)

Ça semble fonctionner, à voir le prochain 25 dec si ça passe bien à true.
Je partage :

template:
  - sensor:
      - name: "french_holiday"
        state: |
          {% set today = now().date() %}
          {% set year = now().year %}

          # Jours fériés fixes
          {% set fixed_holidays = [
            today.replace(month=1, day=1),
            today.replace(month=5, day=1),
            today.replace(month=5, day=8),
            today.replace(month=7, day=14),
            today.replace(month=8, day=15),
            today.replace(month=11, day=1),
            today.replace(month=11, day=11),
            today.replace(month=12, day=25)
          ] %}

          # Calcul des fêtes mobiles (Pâques)
          {% set a = year // 100 %}
          {% set b = year % 100 %}
          {% set c = (3 * (a + 25)) // 4 %}
          {% set d = (3 * (a + 25)) % 4 %}
          {% set e = (8 * (a + 11)) // 25 %}
          {% set f = (19 * (year % 19) + c - e) % 30 %}
          {% set g = (f + year // 4 + a - 2) % 7 %}
          {% set easter = today.replace(month=3, day=22) + timedelta(days=f + g) %}
          {% set mobile_holidays = [
            easter,
            easter + timedelta(days=1),
            easter + timedelta(days=39),
            easter + timedelta(days=49),
            easter + timedelta(days=50)
          ] %}

          # Liste combinée des jours fériés
          {% set all_holidays = fixed_holidays + mobile_holidays %}

          # Retourne True si aujourd'hui est un jour férié
          {{ today in all_holidays }}
        attributes:
          holidays: >
            {% set today = now().date() %}
            {% set year = today.year %}
            {% set a = year %}
            Test Holidays

Allez, je l’avoue … Réalisé à l’aide de ChatGPT : je ne suis pas assez intelligent pour faire ça tt seul :slight_smile:

3 « J'aime »

Bonjour,
Les jours fériés sont parfois fixes (Noël, 1ᵉʳ mai) mais parfois variable (lundi de Pentecôte, jeudi de l’ascension).
Il y a une intégration qui est pas mal :

Voici ce que ça donne chez moi :

1 « J'aime »

Oui je me la suis installée
Mais celle-ci ne te donne pas les jours mobiles, ce qui est le but du bout de code que j’ai partagé.
(Et pa besoin tous les ans de mettre à jour les dates)

Ainsi je combine les deux pour savoir si c’est un jour travaille ou non

  - binary_sensor:
      - name: "jour_travaille"
        state: >
          {{ is_state('sensor.french_holiday', 'False') and is_state('binary_sensor.workday_sensor', 'on') }}
        attributes:
          reason: >
            {% if is_state('sensor.french_holiday', 'True') %}
              Jour férié
            {% elif is_state('binary_sensor.workday_sensor', 'off') %}
              Week-end ou jour non travaillé
            {% else %}
              Jour travaillé
            {% endif %}
1 « J'aime »

Bon vue.
J’ai aussi installé ça :

Hello,

Je viens vous partager une amélioration du petit script. J’ai supprimé la dépendance à Holiday et Workday.

J’ai ainsi trois sensors :

  • jrferies : permet de savoir si la date courante est un jour férié. Cela prend en compte les jours fériés fixes, mais aussi les jours mobiles.
  • jrvacances : que je dois renseigner manuellement pour indiquer les périodes où je suis en congé.
  • jrtravailles : indique si le jour de la semaine est normalement travaillé (dans mon cas, du lundi au vendredi).

au_boulot_aujourdhui : est le résultat final que je mets dans mes automatisations. Cela me donne simplement True ou False, avec le motif associé.

Je suis bien content du résultat final.

image

template:
  - sensor:
      - name: "jrferies"
        state: |-
          {% set today = now().date() %}
          {% set year = now().year %}
          {% set fixed_holidays = [
            today.replace(month=1, day=1),
            today.replace(month=5, day=1),
            today.replace(month=5, day=8),
            today.replace(month=7, day=14),
            today.replace(month=8, day=15),
            today.replace(month=11, day=1),
            today.replace(month=11, day=11),
            today.replace(month=12, day=25)
          ] %}
          {% set a = year // 100 %}
          {% set b = year % 100 %}
          {% set c = (3 * (a + 25)) // 4 %}
          {% set d = (3 * (a + 25)) % 4 %}
          {% set e = (8 * (a + 11)) // 25 %}
          {% set f = (19 * (year % 19) + c - e) % 30 %}
          {% set g = (f + year // 4 + a - 2) % 7 %}
          {% set easter = today.replace(month=3, day=22) + timedelta(days=f + g) %}
          {% set mobile_holidays = [
            easter,
            easter + timedelta(days=1),
            easter + timedelta(days=39),
            easter + timedelta(days=49),
            easter + timedelta(days=50)
          ] %}
          {% set feries = fixed_holidays + mobile_holidays %}
          {{ "True" if today in feries else "False" }}

  - sensor:
      - name: "jrvacances"
        state: >-
          {% set today = now().date() %}
          {% set start1 = today.replace(year=2024, month=12, day=20) %}
          {% set end1 = today.replace(year=2025, month=1, day=5) %}
          {% set start2 = today.replace(year=2025, month=5, day=1) %}
          {% set end2 = today.replace(year=2025, month=5, day=15) %}

          {% if (today >= start1 and today <= end1) or (today >= start2 and today <= end2) %}
          True
          {% else %}
          False
          {% endif %}

  - sensor:
      - name: "jrtravailles"
        state: >-
          {% set wd = now().weekday() %}
          {% if wd in [0,1,2,3,4] %}
          True
          {% else %}
          False
          {% endif %}

  - binary_sensor:
      - name: "au_boulot_aujourdhui"
        state: >-
          {{ is_state('sensor.jrferies','False')
             and is_state('sensor.jrvacances','False')
             and is_state('sensor.jrtravailles','True') }}
        attributes:
          reason: >-
            {% if is_state('sensor.jrferies', 'True') %}
            Jour férié
            {% elif is_state('sensor.jrvacances', 'True') %}
            Jour de congé
            {% elif is_state('sensor.jrtravailles','False') %}
            Week-end ou jour non travaillé
            {% else %}
            Jour travaillé
            {% endif %}