Ouvertures Hiver / été - Vérification

Bonjour,
Comme je documente tout ici, si ca peut servir.
j’ai refait mon automatisation concernant la vérification des ouvertures de ma maison en mode été ou hiver.
Il n’est pas rare qu’on ouvre pour aérer mais on à tendance à oublier.
Du coup l’été l’air chaud rentre et l’hiver le froid rentre

Ouverture détectée (trigger.id)


Identification de l’ouverture


Vérification durée > 10 min ?


Comparaison températures (extérieure vs intérieure)

├─ Si écart > 10°C → Générer alerte
└─ Sinon → Ne rien faire


Message personnalisé
« Attention [nom] est ouverte depuis 10 minutes
[optionnel : écart de température] »


Notification / TTS / SMS

alias: FENETRES-OUVERTES
description: >-
  Automatisation qui notifie par SMS toute ouverture de fenêtre ou porte restée
  ouverte plus de 10 minutes, avec répétition toutes les 30 minutes et
  conditions saison/temperature.
triggers:
  - entity_id:
      - binary_sensor.sensor_fenetre_cellier_sensor_state_any
      - binary_sensor.sensor_chadam_window_door_is_open
      - binary_sensor.sensor_chlisa_window_door_is_open
      - binary_sensor.sensor_fenetre_parents_window_door_is_open
      - binary_sensor.sensor_entree_window_door_is_open
      - binary_sensor.sensor_bv_bois_window_door_is_open
      - binary_sensor.sensor_bv_appenti_window_door_is_open
      - binary_sensor.sensor_bureau_window_door_is_open
      - binary_sensor.sensor_cuisine_window_door_is_open
      - binary_sensor.sensor_celier_porte_window_door_is_open
    from: "off"
    to: "on"
    for:
      minutes: 10
    trigger: state
conditions: []
actions:
  - variables:
      name: >
        {% if trigger.entity_id ==
        'binary_sensor.sensor_fenetre_cellier_sensor_state_any' %}la fenêtre du
        cellier {% elif trigger.entity_id ==
        'binary_sensor.sensor_chadam_window_door_is_open' %}la fenêtre de Adam
        {% elif trigger.entity_id ==
        'binary_sensor.sensor_chlisa_window_door_is_open' %}la fenêtre de Lisa
        {% elif trigger.entity_id ==
        'binary_sensor.sensor_fenetre_parents_window_door_is_open' %}la fenêtre
        des parents {% elif trigger.entity_id ==
        'binary_sensor.sensor_entree_window_door_is_open' %}la porte d'entrée {%
        elif trigger.entity_id ==
        'binary_sensor.sensor_bv_bois_window_door_is_open' %}la baie vitrée bois
        {% elif trigger.entity_id ==
        'binary_sensor.sensor_bv_appenti_window_door_is_open' %}la baie vitrée
        appenti {% elif trigger.entity_id ==
        'binary_sensor.sensor_bureau_window_door_is_open' %}la porte du bureau
        {% elif trigger.entity_id ==
        'binary_sensor.sensor_cuisine_window_door_is_open' %}la fenêtre de la
        cuisine {% elif trigger.entity_id ==
        'binary_sensor.sensor_celier_porte_window_door_is_open' %}la porte du
        cellier {% else %}une ouverture{% endif %}
      message_announcement: Attention {{ name }} est ouverte depuis 10 minutes.
  - repeat:
      while:
        - condition: template
          value_template: |
            {{ is_state(trigger.entity_id, 'on') }}
      sequence:
        - choose:
            - conditions:
                - condition: state
                  entity_id: sensor.season
                  state: summer
                - condition: template
                  value_template: >
                    {% set ext = states('sensor.fib_oeil_exter_air_temperature')
                    | float(none) %} {% set int =
                    states('sensor.fiboeil_sejour_air_temperature') |
                    float(none) %} {{ ext is not none and int is not none and
                    ext >= int + 10 }}
              sequence:
                - action: notify.send_message
                  metadata: {}
                  target:
                    entity_id: notify.sms_free_antony
                  data:
                    message: "{{ message_announcement }}"
            - conditions:
                - condition: state
                  entity_id: sensor.season
                  state: winter
              sequence:
                - action: notify.send_message
                  metadata: {}
                  target:
                    entity_id: notify.sms_free_antony
                  data:
                    message: "{{ message_announcement }}"
        - delay:
            minutes: 30
mode: queued
max: 10

Salut

Il n’y a qu’un seul truc pas top… Le repeat while, wait de 30 min et queue à 10.

La première fenêtre marche à peu prêt (mais même sous jeedom le wait il fallait éviter).
Mais si une deuxième fenêtre s’ouvre avant la fermeture de la première, ça va partir en cacahuète… Et si jamais tu redémarre ha, c’est tout perdu.

Bref, l’idée c’est de compter les fenêtres ouvertes. D’utiliser la liste pour faire l’annonce. Et de mettre un timer de 30 minutes qui se réarme automatiquement et qui est aussi utilisé comme trigger

Pour le reste, tu quand même bien compris comment ça marche, bravo

Hello,

J’ai pas fait mieux sur le repeat while, sinon il y a la base pour le reste avec un sensor liste et un sensor nombre

description: >-
  Envoie un message initial après 5 min, puis le répète toutes les 5 min tant
  qu'un ouvrant est ouvert.
triggers:
  - entity_id: sensor.nombre_ouvrants
    above: 0
    for: "00:05:00"
    trigger: numeric_state
conditions:
  - condition: numeric_state
    entity_id: sensor.nombre_ouvrants
    above: 0
actions:
  - repeat:
      while:
        - condition: numeric_state
          entity_id: sensor.nombre_ouvrants
          above: 0
      sequence:
        - target:
            entity_id: automation.tts_diffuseur_contextuel_v2
          data:
            skip_condition: true
            variables:
              message: >-
                Attention, ouvrants toujours ouverts : {{
                states('sensor.liste_ouvrants') }}
          action: automation.trigger
        - delay: "00:05:00"

template liste

{{ expand([
  'binary_sensor.olimex_esp32_poe_tableau_porte_entree',
  'binary_sensor.olimex_esp32_poe_tableau_porte_droite_salon',
  'binary_sensor.olimex_esp32_poe_tableau_porte_gauche_salon'
]) | selectattr('state', 'eq', 'on') | map(attribute='name') | list | join(', ') }}

template nombre

{{ [
  states('binary_sensor.olimex_esp32_poe_tableau_porte_entree'),
  states('binary_sensor.olimex_esp32_poe_tableau_porte_droite_salon'),
  states('binary_sensor.olimex_esp32_poe_tableau_porte_gauche_salon')
] | select('eq', 'on') | list | count }}

cdt

A tester mais ça pourrait ressembler à ça

alias: FENETRES-OUVERTES
description: >-
  Automatisation qui notifie par SMS toute ouverture de fenêtre ou porte restée
  ouverte plus de 10 minutes, avec répétition toutes les 30 minutes et
  conditions saison/temperature.
triggers:
  - entity_id:
      - binary_sensor.sensor_fenetre_cellier_sensor_state_any
      - binary_sensor.sensor_chadam_window_door_is_open
      - binary_sensor.sensor_chlisa_window_door_is_open
      - binary_sensor.sensor_fenetre_parents_window_door_is_open
      - binary_sensor.sensor_entree_window_door_is_open
      - binary_sensor.sensor_bv_bois_window_door_is_open
      - binary_sensor.sensor_bv_appenti_window_door_is_open
      - binary_sensor.sensor_bureau_window_door_is_open
      - binary_sensor.sensor_cuisine_window_door_is_open
      - binary_sensor.sensor_celier_porte_window_door_is_open
    trigger: state
    id: "etat_ouvrant"
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.fenetres_ouvertes
    id: "timer_finished"
conditions: []
actions:
  - variables:
      openings: |-
        {
          "binary_sensor.sensor_fenetre_cellier_sensor_state_any": "la fenêtre du cellier",
          "binary_sensor.sensor_chadam_window_door_is_open": "la fenêtre de Adam",
          "binary_sensor.sensor_chlisa_window_door_is_open": "la fenêtre de Lisa",
          "binary_sensor.sensor_fenetre_parents_window_door_is_open": "la fenêtre des parents",
          "binary_sensor.sensor_entree_window_door_is_open": "la porte d'entrée",
          "binary_sensor.sensor_bv_bois_window_door_is_open": "la baie vitrée bois",
          "binary_sensor.sensor_bv_appenti_window_door_is_open": "la baie vitrée appenti",
          "binary_sensor.sensor_bureau_window_door_is_open": "la porte du bureau",
          "binary_sensor.sensor_cuisine_window_door_is_open": "la fenêtre de la cuisine",
          "binary_sensor.sensor_celier_porte_window_door_is_open": "la porte du cellier"
        }
      
      open_list: >
        {% set openings = openings | from_json %}
        {% set list = [] %}
        {% for sensor, name in openings.items() %}
          {% if states(sensor) == 'on' %}
            {% set _ = list.append(name) %}
          {% endif %}
        {% endfor %}
        {{ list }}
      
      is_first_alert: "{{ trigger.id == 'etat_ouvrant' and (open_list | length) > 0 }}"
      
      time_text: >
        {% if is_first_alert %}
          depuis 10 minutes
        {% else %}
          depuis 40 minutes
        {% endif %}
      
      message_announcement: >
        {% set openings = openings | from_json %}
        {% set list = [] %}
        {% for sensor, name in openings.items() %}
          {% if states(sensor) == 'on' %}
            {% set _ = list.append(name) %}
          {% endif %}
        {% endfor %}
        {% if list | length == 1 %}
          Attention {{ list[0] }} est ouverte {{ time_text }}.
        {% elif list | length > 1 %}
          Attention {{ list | join(', ') }} sont ouvertes {{ time_text }}.
        {% else %}
          Attention une ouverture est ouverte {{ time_text }}.
        {% endif %}
  - choose:
      - conditions:
          - condition: trigger
            id: "etat_ouvrant"
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - action: timer.start
            target:
              entity_id: timer.fenetres_ouvertes
            data:
              duration: "00:10:00"
      - conditions:
          - condition: trigger
            id: "etat_ouvrant"
          - condition: template
            value_template: "{{ open_list | length == 0 }}"
        sequence:
          - action: timer.cancel
            target:
              entity_id: timer.fenetres_ouvertes
      - conditions:
          - condition: trigger
            id: "timer_finished"
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - action: timer.start
            target:
              entity_id: timer.fenetres_ouvertes
            data:
              duration: "00:30:00"
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.season
            state: summer
          - condition: template
            value_template: >
              {% set ext = states('sensor.fib_oeil_exter_air_temperature')
              | float(none) %} {% set int =
              states('sensor.fiboeil_sejour_air_temperature') |
              float(none) %} {{ ext is not none and int is not none and
              ext >= int + 10 }}
          - condition: trigger
            id: "timer_finished"
        sequence:
          - action: notify.send_message
            metadata: {}
            target:
              entity_id: notify.sms_free_antony
            data:
              message: "{{ message_announcement }}"
      - conditions:
          - condition: state
            entity_id: sensor.season
            state: winter
          - condition: trigger
            id: "timer_finished"
        sequence:
          - action: notify.send_message
            metadata: {}
            target:
              entity_id: notify.sms_free_antony
            data:
              message: "{{ message_announcement }}"
mode: queued
max: 10

J’avais fait ça aussi.
Au final je suis passé à un timer de 10min
30mn c’est trop long
Je teste.

alias: FENETRES-OUVERTES-10MIN
description: Notification des fenêtres ouvertes après 10 minutes
triggers:
  - entity_id:
      - binary_sensor.sensor_fenetre_cellier_sensor_state_any
      - binary_sensor.sensor_chadam_window_door_is_open
      - binary_sensor.sensor_chlisa_window_door_is_open
      - binary_sensor.sensor_fenetre_parents_window_door_is_open
      - binary_sensor.sensor_entree_window_door_is_open
      - binary_sensor.sensor_bv_bois_window_door_is_open
      - binary_sensor.sensor_bv_appenti_window_door_is_open
      - binary_sensor.sensor_bureau_window_door_is_open
      - binary_sensor.sensor_cuisine_window_door_is_open
      - binary_sensor.sensor_celier_porte_window_door_is_open
    to: "on"
    trigger: state
  - event_type: timer.finished
    event_data:
      entity_id: timer.timer_fenetres_ouverte
    trigger: event
conditions:
  - condition: or
    conditions:
      - condition: state
        entity_id: sensor.season
        state: winter
      - condition: state
        entity_id: sensor.season
        state: summer
actions:
  - variables:
      noms: |
        {
          'binary_sensor.sensor_fenetre_cellier_sensor_state_any': 'la fenêtre du cellier',
          'binary_sensor.sensor_chadam_window_door_is_open': 'la fenêtre de Adam',
          'binary_sensor.sensor_chlisa_window_door_is_open': 'la fenêtre de Lisa',
          'binary_sensor.sensor_fenetre_parents_window_door_is_open': 'la fenêtre des parents',
          'binary_sensor.sensor_entree_window_door_is_open': "la porte d'entrée",
          'binary_sensor.sensor_bv_bois_window_door_is_open': 'la baie vitrée bois',
          'binary_sensor.sensor_bv_appenti_window_door_is_open': 'la baie vitrée appenti',
          'binary_sensor.sensor_bureau_window_door_is_open': 'la porte du bureau',
          'binary_sensor.sensor_cuisine_window_door_is_open': 'la fenêtre de la cuisine',
          'binary_sensor.sensor_celier_porte_window_door_is_open': 'la porte du cellier'
        }
      fenetres_ouvertes: |
        {{ expand(noms.keys()|list)
           | selectattr('state','eq','on')
           | map(attribute='entity_id')
           | map('extract', noms)
           | list }}
      message_announcement: >
        Attention, les fenêtres/portes suivantes sont ouvertes depuis 10 minutes
        : {{ fenetres_ouvertes | join(', ') }}
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {{ trigger.platform == 'state' and fenetres_ouvertes | length > 0
              }}
        sequence:
          - data:
              duration: "00:10:00"
            action: timer.start
            target:
              entity_id:
                - timer.timer_fenetres_ouverte
      - conditions:
          - condition: template
            value_template: >-
              {{ trigger.platform == 'event' and fenetres_ouvertes | length > 0
              }}
        sequence:
          - choose:
              - conditions:
                  - condition: state
                    entity_id: sensor.season
                    state: summer
                  - condition: template
                    value_template: >
                      {% set ext =
                      states('sensor.fib_oeil_exter_air_temperature') |
                      float(none) %} {% set int =
                      states('sensor.fiboeil_sejour_air_temperature') |
                      float(none) %} {{ ext is not none and int is not none and
                      ext >= int + 10 }}
                sequence:
                  - action: notify.send_message
                    metadata: {}
                    target:
                      entity_id: notify.sms_free_antony
                    data:
                      message: "\"{{ message_announcement }}\""
              - conditions:
                  - condition: state
                    entity_id: sensor.season
                    state: winter
                sequence:
                  - action: notify.send_message
                    metadata: {}
                    target:
                      entity_id: notify.sms_free_antony
                    data:
                      message: "\"{{ message_announcement }}\""
mode: single

il faut tester la fin du timer : si terminé => message, si cancel => pas message. Et la fermeture de toutes le fenetres déclenche le cancel.
Regarde mon message précédent, c’est une bonne trame (il y a moyen d’optimiser les listes)

1 « J'aime »

Merci @Pulpy-Luke
Je test ton code et surtout j’essaie de le comprendre :slight_smile:

J’ai corrigé des choses car j’avais des messages d’erreur, avec l’aide de l’IA

:cross_mark: Erreur expliquée

SecurityError: access to attribute ‹ append › of ‹ list › object is unsafe

Dans Home Assistant, on n’a pas le droit d’utiliser list.append() dans les templates Jinja (pour éviter les effets de bord).

:backhand_index_pointing_right: Ces lignes sont la cause directe de l’erreur (à 2 endroits chez toi) :

{% set _ = list.append(name) %}

HA bloque volontairement cette opération.


:white_check_mark: Solution officielle HA : utiliser namespace()

La bonne pratique consiste à utiliser un namespace, qui est mutable et autorisé.


:wrench: Correction de open_list

:cross_mark: Ancienne version (interdite)

{% set list = [] %}
{% for sensor, name in openings.items() %}
  {% if states(sensor) == 'on' %}
    {% set _ = list.append(name) %}
  {% endif %}
{% endfor %}
{{ list }}

:white_check_mark: Version corrigée (OK HA)

{% set openings = openings | from_json %}
{% set ns = namespace(list=[]) %}
{% for sensor, name in openings.items() %}
  {% if states(sensor) == 'on' %}
    {% set ns.list = ns.list + [name] %}
  {% endif %}
{% endfor %}
{{ ns.list }}

1 « J'aime »

Oui comme indiqué j’ai pas testé vérifié le code partagé, c’est une base de départ

T’inquiètes c’est déjà génial merci
je suis en train de le tester :slight_smile:

alias: FENETRES-OUVERTES
description: >-
  Automatisation qui notifie par SMS toute ouverture de fenêtre ou porte restée
  ouverte plus de 10 minutes, avec répétition toutes les 30 minutes et
  conditions saison/temperature.
triggers:
  - trigger: state
    id: etat_ouvrant
    entity_id:
      - binary_sensor.sensor_fenetre_cellier_sensor_state_any
      - binary_sensor.sensor_chadam_window_door_is_open
      - binary_sensor.sensor_chlisa_window_door_is_open
      - binary_sensor.sensor_fenetre_parents_window_door_is_open
      - binary_sensor.sensor_entree_window_door_is_open
      - binary_sensor.sensor_bv_bois_window_door_is_open
      - binary_sensor.sensor_bv_appenti_window_door_is_open
      - binary_sensor.sensor_bureau_window_door_is_open
      - binary_sensor.sensor_cuisine_window_door_is_open
      - binary_sensor.sensor_celier_porte_window_door_is_open
  - trigger: event
    id: timer_finished
    event_type: timer.finished
    event_data:
      entity_id: timer.timer_fenetres_ouverte
conditions: []
actions:
  - variables:
      openings: |
        {
          "binary_sensor.sensor_fenetre_cellier_sensor_state_any": "la fenêtre du cellier",
          "binary_sensor.sensor_chadam_window_door_is_open": "la fenêtre de Adam",
          "binary_sensor.sensor_chlisa_window_door_is_open": "la fenêtre de Lisa",
          "binary_sensor.sensor_fenetre_parents_window_door_is_open": "la fenêtre des parents",
          "binary_sensor.sensor_entree_window_door_is_open": "la porte d'entrée",
          "binary_sensor.sensor_bv_bois_window_door_is_open": "la baie vitrée bois",
          "binary_sensor.sensor_bv_appenti_window_door_is_open": "la baie vitrée appenti",
          "binary_sensor.sensor_bureau_window_door_is_open": "la porte du bureau",
          "binary_sensor.sensor_cuisine_window_door_is_open": "la fenêtre de la cuisine",
          "binary_sensor.sensor_celier_porte_window_door_is_open": "la porte du cellier"
        }
      open_list: >
        {% set openings = openings | from_json %} {% set ns = namespace(list=[])
        %} {% for sensor, name in openings.items() %}
          {% if states(sensor) == 'on' %}
            {% set ns.list = ns.list + [name] %}
          {% endif %}
        {% endfor %} {{ ns.list }}
      is_first_alert: "{{ trigger.id == 'etat_ouvrant' and (open_list | length) > 0 }}"
      time_text: |
        {% if is_first_alert %}
          depuis 10 minutes
        {% else %}
          depuis 40 minutes
        {% endif %}
      message_announcement: |
        {% if open_list | length == 1 %}
          Attention {{ open_list[0] }} est ouverte {{ time_text }}.
        {% elif open_list | length > 1 %}
          Attention {{ open_list | join(', ') }} sont ouvertes {{ time_text }}.
        {% else %}
          Attention une ouverture est ouverte {{ time_text }}.
        {% endif %}
  - choose:
      - conditions:
          - condition: trigger
            id: etat_ouvrant
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - action: timer.start
            target:
              entity_id: timer.timer_fenetres_ouverte
            data:
              duration: "00:10:00"
      - conditions:
          - condition: trigger
            id: etat_ouvrant
          - condition: template
            value_template: "{{ open_list | length == 0 }}"
        sequence:
          - action: timer.cancel
            target:
              entity_id: timer.timer_fenetres_ouverte
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - action: timer.start
            target:
              entity_id: timer.timer_fenetres_ouverte
            data:
              duration: "00:30:00"
  - choose:
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: state
            entity_id: sensor.season
            state: summer
          - condition: template
            value_template: >
              {% set ext = states('sensor.fib_oeil_exter_air_temperature') |
              float(none) %} {% set int =
              states('sensor.fiboeil_sejour_air_temperature') | float(none) %}
              {{ ext is not none and int is not none and ext >= int + 10 }}
        sequence:
          - action: notify.send_message
            target:
              entity_id: notify.sms_free_antony
            data:
              message: "{{ message_announcement }}"
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: state
            entity_id: sensor.season
            state: winter
        sequence:
          - action: notify.send_message
            target:
              entity_id: notify.sms_free_antony
            data:
              message: "{{ message_announcement }}"
mode: queued
max: 10

L’ouverture d’une fenetre déclenche bien le timer
Je reçois bien le SMS au bout des 10 minutes
Par contre je dois revoir le calcul du temps :slight_smile:

Il m’envoi "Attention la porte du bureau est ouverte depuis 40 minutes :slight_smile: "

1 « J'aime »

Là si tu veux faire le comptage, voir si la durée initiale du timer est dispo dans ces attributs. Ça marcherai assez facile pour le premier tour (10 à affiché direct) ou le deuxième (30 mais annoncé 40), c’est après le troisième tour que ça coince sans rajouter un input_number qui memorise la somme.

Au final le plus simple serait peut être d’utiliser le timer simplement pour renvoyer les notifications toutes les 10 minutes si une fenetre est ouverte.

Mais que les temps affichés dans les notifications soient justes le temps depuis la dernière ouverture puisque tout est historisé

Autre solution tu te base sur l’humidité relative (avec thermal comfort) ou la chute du co2 dans la pièce (si tu as un capteur pour).

Tu utilise un template qui vérifie l’évolution de ces taux et quand il se stabilise tu peux fermer (avec un timeout mac si le taux est jamais atteind).

Ca fait des jours que j’essaie de dépanner mon automatisation.
Bon elle fonctionne mais elle annonce jamais 10 minutes … même au premier timer
Je comprends pas.
Quoiqu’il arrive je tombe toujorus dans la condition

  • depuis un moment
alias: FENETRES-OUVERTES-NEW
description: >
  Notification SMS si fenêtres ou portes ouvertes plus de 10 minutes, puis
  rappel toutes les 30 minutes selon saison et température.
triggers:
  - id: etat_ouvrant
    entity_id:
      - binary_sensor.sensor_fenetre_cellier_sensor_state_any
      - binary_sensor.sensor_chadam_window_door_is_open
      - binary_sensor.sensor_chlisa_window_door_is_open
      - binary_sensor.sensor_fenetre_parents_window_door_is_open
      - binary_sensor.sensor_entree_window_door_is_open
      - binary_sensor.sensor_bv_bois_window_door_is_open
      - binary_sensor.sensor_bv_appenti_window_door_is_open
      - binary_sensor.sensor_bureau_window_door_is_open
      - binary_sensor.sensor_cuisine_window_door_is_open
      - binary_sensor.sensor_celier_porte_window_door_is_open
    trigger: state
  - id: timer_finished
    event_type: timer.finished
    event_data:
      entity_id: timer.timer_fenetres_ouverte
    trigger: event
conditions: []
actions:
  - variables:
      openings: |
        {
          "binary_sensor.sensor_fenetre_cellier_sensor_state_any": "la fenêtre du cellier",
          "binary_sensor.sensor_chadam_window_door_is_open": "la fenêtre de Adam",
          "binary_sensor.sensor_chlisa_window_door_is_open": "la fenêtre de Lisa",
          "binary_sensor.sensor_fenetre_parents_window_door_is_open": "la fenêtre des parents",
          "binary_sensor.sensor_entree_window_door_is_open": "la porte d'entrée",
          "binary_sensor.sensor_bv_bois_window_door_is_open": "la baie vitrée bois",
          "binary_sensor.sensor_bv_appenti_window_door_is_open": "la baie vitrée appenti",
          "binary_sensor.sensor_bureau_window_door_is_open": "la porte du bureau",
          "binary_sensor.sensor_cuisine_window_door_is_open": "la fenêtre de la cuisine",
          "binary_sensor.sensor_celier_porte_window_door_is_open": "la porte du cellier"
        }
      open_list: >
        {% set openings = openings | from_json %} {% set ns = namespace(list=[])
        %} {% for sensor, name in openings.items() %}
          {% if states(sensor) == 'on' %}
            {% set ns.list = ns.list + [name] %}
          {% endif %}
        {% endfor %} {{ ns.list }}
      time_text: |
        {% if trigger.id == 'timer_finished' %}
          {# Si le timer vient de finir, on ajoute 30min au temps précédent #}
          {% if state_attr('timer.timer_fenetres_ouverte', 'duration') == '00:10:00' %}
            depuis 40 minutes
          {% else %}
            depuis un moment
          {% endif %}
        {% else %}
          {# C'est le premier déclenchement (changement d'état d'une porte) #}
          depuis 10 minutes
        {% endif %}
      message_announcement: |
        {% if open_list | length == 1 %}
          Attention {{ open_list[0] }} est ouverte {{ time_text }}.
        {% elif open_list | length > 1 %}
          Attention {{ open_list | join(', ') }} sont ouvertes {{ time_text }}.
        {% else %}
          Attention une ouverture est ouverte {{ time_text }}.
        {% endif %}
  - choose:
      - conditions:
          - condition: trigger
            id: etat_ouvrant
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - target:
              entity_id: timer.timer_fenetres_ouverte
            data:
              duration: "00:10:00"
            action: timer.start
      - conditions:
          - condition: trigger
            id: etat_ouvrant
          - condition: template
            value_template: "{{ open_list | length == 0 }}"
        sequence:
          - target:
              entity_id: timer.timer_fenetres_ouverte
            action: timer.cancel
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: template
            value_template: "{{ open_list | length > 0 }}"
        sequence:
          - target:
              entity_id: timer.timer_fenetres_ouverte
            data:
              duration: "00:30:00"
            action: timer.start
  - choose:
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: state
            entity_id: sensor.season
            state: summer
          - condition: template
            value_template: >
              {% set ext = states('sensor.fib_oeil_exter_air_temperature') |
              float(none) %} {% set int =
              states('sensor.fiboeil_sejour_air_temperature') | float(none) %}
              {{ ext is not none and int is not none and ext >= int + 10 }}
        sequence:
          - action: notify.send_message
            metadata: {}
            target:
              entity_id:
                - notify.sms_free_antony
                - notify.notification_maison_bartounet
            data:
              message: "{{ message_announcement }}"
          - action: script.2ghome_parle
            metadata: {}
            data:
              volume: 1
              message: "{{ message_announcement }}"
      - conditions:
          - condition: trigger
            id: timer_finished
          - condition: state
            entity_id: sensor.season
            state: winter
        sequence:
          - action: notify.send_message
            metadata: {}
            target:
              entity_id:
                - notify.sms_free_antony
                - notify.notification_maison_bartounet
            data:
              message: "{{ message_announcement }}"
          - action: script.2ghome_parle
            metadata: {}
            data:
              volume: 1
              message: "{{ message_announcement }}"
mode: queued
max: 10

Regarde les traces mais c’est là que ça coince

        {% if trigger.id == 'timer_finished' %}
          {# Si le timer vient de finir, on ajoute 30min au temps précédent #}
          {% if state_attr('timer.timer_fenetres_ouverte', 'duration') == '00:10:00' %}
            depuis 40 minutes
          {% else %}
            depuis un moment
          {% endif %}
        {% else %}
          {# C'est le premier déclenchement (changement d'état d'une porte) #}
          depuis 10 minutes
        {% endif %}

Déjà timer_finished => arrive quelque soit la durée du timer.
Et etat_ouvrant ne sert à rien à ce moment là (l’annonce est faite au tour suivant), donc depuis 10 minutes est faux

Donc il te reste uniquement la durée du timer comme différentiel pour savoir si 10 ou depuis un moment.

Oui mais j’arrive pas à m’en dépatouiller.
Au final si c’est timer_finished qui est le trigger c’est qu’il est arrivé à 0 non ?

Oui, exactement, timer_finished arrivé à 0s restantes
Donc :

  • Si ton trigger est etat_ouvrant un ouvrant vient JUSTE de s’ouvrir, 0 minutes (tour 1)
  • Si timer_finished et ton timer à pour durée 10 c’est qu’il s’est passé 10min (tu es dans le tour 2)
  • Si timer_finished et s’il vaut 30, c’est qu’il s’est passé 40+ (ou 70 etc, tu es dans le tour 3+)

Le problème vient peut etre que quand on check le timer il est pas forcément pile à 10min
Puisque que quelques secondes se sont écoulés

D’où les traces, c’est le trigger donc tu as toutes les infos dedans

Accessoirement, ça vaut bien (toujours) 10


remaining est le temps restant :wink: