Création d'une entité temps : 30min avant réveil

Mon problème

J’essaye de créer une entité temps qui correspondrait à 30min avant le déclenchement de mon réveil. Cela me permettrait de lancer des automatisations avant mon réveil, par exemple : monter la température du chauffage.

Grâce à l’application mobile Home Assistant sur Android, j’arrive à récupérer la date et l’heure de mon prochain réveil.
Lorsque je mets un réveil sur mon téléphone (exemple à 09h00 du matin), l’entité sensor.pixel_6_sim_next_alarm me donne :

2023-01-17T08:00:00+00:00

et

Local Time: Tue Jan 17 09:00:00 GMT+01:00 2023
Package: com.google.android.deskclock
Time in Milliseconds: 1673942400000
device_class: timestamp
icon: mdi:alarm
friendly_name: Pixel 6 Sim Next Alarm

A partir de cela, j’aimerai créer une nouvelle entité temps avec seulement l’heure de ce sensor.

J’ai commencé à réfléchir à quelque chose grâce à ce sujet.

-  name: "Alarme Sim -30min"
   unique_id: alarme_sim_30min
   state: >
       {% if not is_state('sensor.pixel_6_sim_next_alarm', 'unavailable') %}
         {{ as_timestamp(strptime(states('sensor.pixel_6_sim_next_alarm'), '%Y-%m-%dT%H:%M:%S+00:00') - timedelta(minutes=30)) | timestamp_custom('%H:%M:%S') }}
       {% else %}
         Pas d'alarme
       {% endif %}

Ce nouveau sensor fonctionne mais il me revoit 07:30:00 alors que mon réveil est programmé à 9h00, il devrait donc me renvoyer 08:30:00.
Le problème vient de la différence entre l’heure UTC et CET (+0100 UTC) mais je n’arrive pas à trouver de solution pour modifier le décalage horaire.
J’ai essayé, dans mon template, de remplacer +00:00 par +01:00 mais cela ne fonctionne pas.
Avez-vous une solution à me proposer ?
Merci pour votre aide !

Hello

Créé un binaire

- platform: template
  sensors:
    alarm_k20:
      entity_id:
        - sensor.redmi_k20_pro_next_alarm
        - sensor.time
      friendly_name: "Alarm K20 Next Alarm"
      value_template: >-
        {{now().strftime("%a %h %d %H:%M %Z %Y") == (((state_attr('sensor.redmi_k20_pro_next_alarm', 'Time in Milliseconds') | int / 1000) + 0*60 ) | timestamp_custom('%a %h %d %H:%M %Z %Y'))}}       

ensuite tu pourra faire une automatisation

alias: "Store : Ouvrir les stores 10 minutes après l'alarme"
description: ""
trigger:
  - platform: template
    value_template: >-
      {{now().strftime("%a %h %d %H:%M %Z %Y") ==
      (((state_attr('sensor.redmi_k20_pro_next_alarm', 'Time in Milliseconds') |
      int / 1000)) | timestamp_custom('%a %h %d %H:%M %Z %Y'))}}
    alias: Quand l'alarme téléphonique de Mikaël se déclenche
condition:
  - condition: state
    entity_id: person.mikael
    state: home
action:
  - delay:
      hours: 0
      minutes: 10
      seconds: 0
      milliseconds: 0
  - device_id: 954ffb36c27a2d24f67d65d98b5b
    domain: cover
    entity_id: cover.bedroom_blind_motor
    type: set_position
    position: 10
    alias: Régler la position du moteur du store de la chambre à 10 %
  - delay:
      hours: 0
      minutes: 10
      seconds: 0
      milliseconds: 0
  - device_id: 954ffb36c27a2d24f67d65d98b
    domain: cover
    entity_id: cover.bedroom_blind_motor
    type: set_position
    position: 40
    alias: Régler la position du moteur du store de la chambre à 40 %
mode: restart


1 « J'aime »

Regarde ces exemples et rapproche toi d’une expression où local est inclut.

Tu n’est pas loin, il faut juste convertir en local

1 « J'aime »

Salut,
rajoute | as_local sur ta valeur qui est en UTC pour la convertir en CET,
j’en ai parlé il y a peut là : Obtenir le temps d'utilisation d'un appareil électrique sur une période donnée - #22 par roumano

1 « J'aime »

@ClassicRed @Clemalex @roumano
Merci pour vos réponses.
J’ai essayé de rajouter le filtre | as_local mais je n’avais que des erreurs.
Je vais essayé pour l’instant avec le sensor, mais si je vois que c’est trop compliqué pour l’automatisation, je passerai par un binaire.
En regardant mon premier post, je me suis dis « Et si je passais par mon attribut Local Time ? »

Voici donc une solution possible :

{{ as_timestamp(strptime(state_attr('sensor.pixel_6_sim_next_alarm', 'Local Time'), '%a %b %d %H:%M:%S %Z+01:00 %Y' ) - timedelta(minutes=30)) | timestamp_custom('%H:%M:%S') }}

Il suffit juste de s’amuser à retrouver le format de la date et l’heure données par l’attribut et de le rajouter dans : strptime(states('sensor.XXX'), format) ou dans strptime(state_attr('sensor.XXX', 'attributes'), format)

Si tu a un champ Local Time, tant mieux mais dans pleines de cas, ce champs n’existe pas.
et dans ce cas, tu est obligé de faire des conversions

Je pense que ca fonctionne pas lors de tes tests car tu n’a pas mis de parenthese avant, il est toujours recommander de tester ce genre de trucs dans modèle de l’outil de développement

dans mon cas :

  • {{ ((state_attr('automation.lave_vaisselle_start', 'last_triggered')) ).strftime("%Hh%M") }} me donne 00h51
  • {{ ((state_attr('automation.lave_vaisselle_start', 'last_triggered')) | as_local).strftime("%Hh%M") }} me donne 01h51

Bonjour, je suis nouveau sur HA et j’ai le même objectif : allumer le chauffage 30 minutes avant mon réveil.
J’ai suivi les instructions de ClassicRed et d’autres trouvé ailleurs mais rien à faire, ça ne démarre toujours pas…
est-ce qu’une âme charitable pourrait jeter un coup d’œil à mon code ?

alias: Thermostat matin
description: ""
trigger:
  - platform: template
    value_template: |2-
       {{now().strftime("%a %h %d %H:%M %Z %Y") ==
            (((state_attr('sensor.oneplus_romain_next_alarm', 'Time in Milliseconds') |
            int / 1000)) | timestamp_custom('%a %h %d %H:%M %Z %Y'))}}
condition:
  - condition: time
    before: "00:30:00"
action:
  - service: climate.turn_on
    data: {}
    target:
      entity_id: climate.thermostat
mode: restart

Merci d’avance !

Hello

Créé un sensor

- platform: template
  sensors:       
    reveil_realme_gt:
      friendly_name: "Réveil Realme GT"
      value_template: >
        {% if not is_state('sensor.rmx2202_next_alarm', 'unavailable') %}
          {%- set diff = states('sensor.rmx2202_next_alarm')|as_timestamp - now()|as_timestamp -%}
          {%- if diff <= 3600 -%}
            on
          {% else %}
            off
          {% endif %}
        {% else %}
          off
        {% endif %} 

Ensuite tu peux faire un automatisation

alias: "Automatisation Nouveau Test "
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.reveil_realme_gt
condition: []
action:
  - service: light.turn_on
    data: {}
    target:
      entity_id: light.lumiere_salon
mode: single

Donc la , 1heure avant mon reveil , la lumiere va s’allumé

Merci beaucoup ! ça fonctionne nickel

1 « J'aime »