Un réveil sur Home assistant

Bonjour à tous, voici le code que j’utilise pour créer un reveil sur home assistant.

Il est extrait de How to create the alarm clock in HASS? - Configuration - Home Assistant Community

J’utilise ma gateway xiaomi pour le moment.
Un seul fichier en mode package.

input_boolean:
  wakeactivated_1:
    name: Alarm 1 Activated
    icon: mdi:alarm
  wakestatus_1:
    name: Alarm 1
    icon: mdi:alarm
  wakeweekday_sun_1:
    name: Sunday
    icon: mdi:calendar
  wakeweekday_mon_1:
    name: Monday        
    icon: mdi:calendar
  wakeweekday_tue_1:
    name: Tuesday        
    icon: mdi:calendar
  wakeweekday_wed_1:
    name: Wednesday       
    icon: mdi:calendar
  wakeweekday_thu_1:
    name: Thursday       
    icon: mdi:calendar
  wakeweekday_fri_1:
    name: Friday        
    icon: mdi:calendar
  wakeweekday_sat_1:
    name: Saturday        
    icon: mdi:calendar

input_number:
  wakehour_1:
    name: Hour
    min: 00
    max: 23
    step: 1
    icon: mdi:alarm
  wakeminutes_1:
    name: Minutes
    min: 00
    max: 59
    step: 1
    
sensor:
  - platform: template
    sensors:
      wake_time_1:
        friendly_name: 'Wake Time 1'
        value_template: "{{'{:02d}:{:02d}'.format(states('input_number.wakehour_1') | int, states('input_number.wakeminutes_1') | int) }}"

script:
  xiaomi_alarm1:
    sequence:
    - data:
        gw_mac: 'macadress'
        ringtone_id: 13
        ringtone_vol: 50
      service: xiaomi_aqara.play_ringtone
    - delay:
        seconds: 6
    - service: script.xiaomi_alarm2
    mode: parallel
    max: 10

  xiaomi_alarm2:
    sequence:
    - data:
        gw_mac: 'macadress'
        ringtone_id: 13
        ringtone_vol: 75
      service: xiaomi_aqara.play_ringtone
    - delay:
        seconds: 6
    - service: script.xiaomi_alarm1
    mode: parallel
    max: 10

  xiaomi_alarm3:
    sequence:
    - repeat:
        count: 180
        sequence:
        - data:
           gw_mac: 'macadress'
            ringtone_id: 13
            ringtone_vol: 40
          service: xiaomi_aqara.play_ringtone
        - delay:
            seconds: 6
    mode: restart

  alarm_snooze:
    alias: Alarm was Snooze
    sequence:
    - service: script.alarmclock_off
    - delay:
        seconds: 300
    - service: script.turn_on
      entity_id:
      - script.xiaomi_alarm3
    - delay:
        seconds: 300
    - service: script.turn_on
      entity_id:
      - script.alarmclock_off

  alarmclock_off:
    alias: Alarm was disarmed
    sequence:
    - service: script.turn_off
      data:
        entity_id:
        - script.xiaomi_alarm3


automation:
  - id: 'wake_1_detect_time'
    alias: Wake 1
    description: 'Detect specified wake time'
    trigger:
      platform: template
      value_template: "{{ states('sensor.time') == states('sensor.wake_time_1') }}"
    condition:
     condition: template
     value_template: >
        {% set today = 'input_boolean.wakeweekday_' ~ now().strftime("%a") | lower ~ '_1' %}
        {{ is_state('input_boolean.wakestatus_1', 'on') and is_state(today, 'on') }}
    action:
      service: input_boolean.turn_on
      entity_id: input_boolean.wakeactivated_1

  - id: 'wake_1_alarm_activated'
    alias: 'Wake 1 Activated'
    trigger:
      platform: state
      entity_id: input_boolean.wakeactivated_1
      from: 'off'
      to: 'on'
#    action:
#      service: timer.start
#      entity_id: timer.wake_1
    action:   
      service: script.turn_on 
      entity_id:
      - script.xiaomi_alarm1
2 J'aime

Et le code pour la carte lovelace:

cards:
  - entities:
      - entity: input_boolean.wakestatus_1
        name: Mode
      - entity: sensor.time
        name: Heure Actuelle
      - entity: sensor.wake_time_1
        name: Heure Réveil
      - entity: input_number.wakehour_1
        name: Heure
      - entity: input_number.wakeminutes_1
    show_header_toggle: false
    title: Réveil
    type: entities
  - cards:
      - entity: input_boolean.wakeweekday_sun_1
        hold_action:
          action: none
        icon_height: 40px
        name: Dim
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_mon_1
        hold_action:
          action: none
        icon_height: 40px
        name: Lun
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_tue_1
        hold_action:
          action: none
        icon_height: 40px
        name: Mar
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_wed_1
        hold_action:
          action: none
        icon_height: 40px
        name: Mer
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_thu_1
        hold_action:
          action: none
        icon_height: 40px
        name: Jeu
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_fri_1
        hold_action:
          action: none
        icon_height: 40px
        name: Ven
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_sat_1
        hold_action:
          action: none
        icon_height: 40px
        name: Sam
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
    type: horizontal-stack
  - type: conditional
    conditions:
      - entity: input_boolean.wakeactivated_1
        state: 'on'
    card:
      type: button
      tap_action:
        action: toggle
      hold_action:
        action: more-info
      show_icon: true
      show_name: true
      show_state: false
      entity: script.alarm_snooze
      name: Snooze
      icon: 'mdi:alarm-off'
      icon_height: 50px
1 J'aime

reveil

Inspiration:
Source : ici

3 J'aime

Merci pour le partage :+1:

@cob94440 pourquoi ne pas avoir utilisé directement un Input_datetime au lieu des input_number pour la définition de l’heure ?

Parce que je débute :slight_smile: Si quelqu’un veut améliorer le code je suis plus que preneur.

Non non pas de soucis, c’était plus pour savoir si tu l’avais choisis car tu avais rencontrer des problèmes avec un input_datetime…

Après, il y a toujours mille et une façon d’arriver au même résultat… C’est juste une histoire de goût et d’affinité…

1 J'aime

@cob94440, on en parlais hier, voici une autre façon (j’ai conservé tous les noms pour faciliter la comparaison) :

Pour ceux qui comme moi sont plus à l’aise (surtout sur mobile) avec des input_select pour la définition de l’heure :

#Par rapport au post 1 de @cob94440 
# sensor.wake_time_1 est remplacé par input_datetime.wake_time_1 pour la définition de l'heure du réveil
# input_number.wakehour_1 est remplacé par input_select.wakehour_1 pour la définition de l'heure
# input_number.wakeminutes_1 est remplacé par input_select.wakeminutes_1 pour la définition des minutes

#Input_booleans (inchangés par rapport au post 1) 
input_boolean:
  wakeactivated_1:
    name: Alarm 1 Activated
    icon: mdi:alarm
  wakestatus_1:
    name: Alarm 1
    icon: mdi:alarm
  wakeweekday_sun_1:
    name: Sunday
    icon: mdi:calendar
  wakeweekday_mon_1:
    name: Monday        
    icon: mdi:calendar
  wakeweekday_tue_1:
    name: Tuesday        
    icon: mdi:calendar
  wakeweekday_wed_1:
    name: Wednesday       
    icon: mdi:calendar
  wakeweekday_thu_1:
    name: Thursday       
    icon: mdi:calendar
  wakeweekday_fri_1:
    name: Friday        
    icon: mdi:calendar
  wakeweekday_sat_1:
    name: Saturday        
    icon: mdi:calendar
    
#Input_datetime (nouveau par rapport au post 1)
input_datetime:
  wake_time_1:
  #Représente l'heure du réveil
    name: wake_time_1
    has_date: false
    has_time: true

#Input_select (nouveau par rapport au post 1) 
input_select:
  wakehour_1:
  #Représente le choix de l'heure
    name: wakehour_1
    options:
     - '00'
     - '01'
     - '02'
     - '03'
     - '04'
     - '05'
     - '06'
     - '07'
     - '08'
     - '09'
     - 10
     - 11
     - 12
     - 13
     - 14
     - 15
     - 16
     - 17
     - 18
     - 19
     - 20
     - 21
     - 22
     - 23
  wakeminutes_1:
  #Représente le choix des minutes
    name: wakeminutes_1
    options:
     - '00'
     - '01'
     - '02'
     - '03'
     - '04'
     - '05'
     - '06'
     - '07'
     - '08'
     - '09'
     - 10
     - 11
     - 12
     - 13
     - 14
     - 15
     - 16
     - 17
     - 18
     - 19
     - 20
     - 21
     - 22
     - 23
     - 24
     - 25
     - 26
     - 27
     - 28
     - 29
     - 30
     - 31
     - 32
     - 33
     - 34
     - 35
     - 36
     - 37
     - 38
     - 39
     - 40
     - 41
     - 42
     - 43
     - 44
     - 45
     - 46
     - 47
     - 48
     - 49
     - 50
     - 51
     - 52
     - 53
     - 54
     - 55
     - 56
     - 57
     - 58
     - 59

#Scripts (inchangés par rapport au post 1)
script:
  xiaomi_alarm1:
    sequence:
    - data:
        gw_mac: 0123456789
        ringtone_id: 13
        ringtone_vol: 50
      service: xiaomi_aqara.play_ringtone
    - delay:
        seconds: 6
    - service: script.xiaomi_alarm2
    mode: parallel
    max: 10

  xiaomi_alarm2:
    sequence:
    - data:
        gw_mac: 0123456789
        ringtone_id: 13
        ringtone_vol: 75
      service: xiaomi_aqara.play_ringtone
    - delay:
        seconds: 6
    - service: script.xiaomi_alarm1
    mode: parallel
    max: 10

  xiaomi_alarm3:
    sequence:
    - repeat:
        count: 180
        sequence:
        - data:
           gw_mac: 0123456789
           ringtone_id: 13
           ringtone_vol: 40
          service: xiaomi_aqara.play_ringtone
        - delay:
            seconds: 6
    mode: restart

  alarm_snooze:
    alias: Alarm was Snooze
    sequence:
    - service: script.alarmclock_off
    - delay:
        seconds: 300
    - service: script.turn_on
      entity_id:
      - script.xiaomi_alarm3
    - delay:
        seconds: 300
    - service: script.turn_on
      entity_id:
      - script.alarmclock_off

  alarmclock_off:
    alias: Alarm was disarmed
    sequence:
    - service: script.turn_off
      data:
        entity_id:
        - script.xiaomi_alarm3

automation:
  - id: 'wake_1_update_time' #nouvelle par rapport au post 1
    # Automatisation qui met à jour le input_datetime 'wake_time_1' représentant l'heure du reveil
    # en fonction des input_select représentants les heures et les minutes
    alias: wake_1_update_time
    trigger:
      - platform: state
        entity_id: input_select.wakehour_1
      - platform: state
        entity_id: input_select.wakeminutes_1
    action:
    - service: input_datetime.set_datetime
      entity_id: input_datetime.wake_time_1
      data_template:
        time: '{{states("input_select.wakehour_1")}}:{{states("input_select.wakeminutes_1")}}:00'

  - id: 'wake_1_detect_time' #modifiée par rapport au post 1 pour la partie déclenchement (trigger)
    # Automatisation qui s'enclenche quand l'heure du système est égale à l'heure de l'input_datetime.wake_time_1
    alias: Wake 1
    trigger:
      platform: template
      value_template: "{{states('sensor.time') == (state_attr('input_datetime.wake_time_1','timestamp') | int | timestamp_custom('%H:%M', False))}}"
    condition:  
     condition: template
     value_template: >
        {% set today = 'input_boolean.wakeweekday_' ~ now().strftime("%a") | lower ~ '_1' %}
        {{ is_state('input_boolean.wakestatus_1', 'on') and is_state(today, 'on') }}
    action:
      service: input_boolean.turn_on
      entity_id: input_boolean.wakeactivated_1

  - id: 'wake_1_alarm_activated' #inchangée par rapport au post 1
    alias: 'Wake 1 Activated'
    trigger:
      platform: state
      entity_id: input_boolean.wakeactivated_1
      from: 'off'
      to: 'on'
    action:   
      service: script.turn_on 
      entity_id:
      - script.xiaomi_alarm1

Ce qui donne côté Lovelace :
image

code de la carte :
cards:
  - entities:
      - entity: input_boolean.wakestatus_1
        icon: 'mdi:alarm-check'
        name: Activation
      - entity: sensor.time
        name: Heure Actuelle
      - entity: input_datetime.wake_time_1
        name: 'Sonner à :'
    show_header_toggle: false
    title: Réveil
    type: entities
  - cards:
      - entities:
          - entity: input_select.wakehour_1
            name: Heure
        show_header_toggle: false
        title: null
        type: entities
      - entities:
          - entity: input_select.wakeminutes_1
            name: Minutes
        show_header_toggle: false
        title: null
        type: entities
    type: horizontal-stack
  - cards:
      - entity: input_boolean.wakeweekday_sun_1
        hold_action:
          action: none
        icon_height: 40px
        name: Dim
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_mon_1
        hold_action:
          action: none
        icon_height: 40px
        name: Lun
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_tue_1
        hold_action:
          action: none
        icon_height: 40px
        name: Mar
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_wed_1
        hold_action:
          action: none
        icon_height: 40px
        name: Mer
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_thu_1
        hold_action:
          action: none
        icon_height: 40px
        name: Jeu
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_fri_1
        hold_action:
          action: none
        icon_height: 40px
        name: Ven
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
      - entity: input_boolean.wakeweekday_sat_1
        hold_action:
          action: none
        icon_height: 40px
        name: Sam
        show_icon: true
        show_name: true
        tap_action:
          action: toggle
        type: button
    type: horizontal-stack
  - card:
      entity: script.alarm_snooze
      hold_action:
        action: more-info
      icon: 'mdi:alarm-off'
      icon_height: 50px
      name: Snooze
      show_icon: true
      show_name: true
      show_state: false
      tap_action:
        action: toggle
      type: button
    conditions:
      - entity: input_boolean.wakeactivated_1
        state: 'on'
    type: conditional
type: vertical-stack

Ne pas hésiter à poser des questions !

Si j’ai le temps ce soir, je mettrais une autre manière de présenter tout çà… :thinking:

2 J'aime

Sympa. Tu as modifié aussi le script off. J’avais cru voir une coquille qui n’arrêtait pas de suite le réveil.
Dans l’exemple il faisait sonner la gateway mais c’est possible de mettre un message sur Google home ou Alexa et lancer ensuite pourquoi pas des actions de salle de bain prépa de cafe

Non, je n’ai pas modifié les scripts, enfin si, mais au niveau de l’indentation du script xiaomi_alarm3 :

Mais j’avoue n’avoir pas regardé dans le détail le script…

Effectivement, les possibilités d’actions sont infinies, il suffit d’ajouter les actions que l’on souhaite à la suite de l’automation wake_1_alarm_activated.

@cob94440
Du coup, tu m’as motivé en parlant d’une coquille :wink: et voici plusieurs remarques/explications sur le fonctionnement de ce réveil :

Le script alarm_snooze qui est lancé quand tu appuis sur le bouton de la carte lovelace

image

éxécute en premier lieu le script alarmclock_off.

Ce script alarmclock_off est bizarre dans le sens où sa première action est d’arrêter xiaomi_alarm3 alors que celui-ci n’est pas démarré.

Ensuite, on attend 5min (300 sec) avant de démarrer xiaomi_alarm3 qui sera exécuté 180 fois (avec le délais de 6s cela fait 18min). Mais le script est arrêté en fait au bout de 5min à l’aide de l’exécution du script alarmclock_off qui lui-même arrête le script xiaomi_alarm3.

Du coup, quand l’alarme sonne :

  • Soit on ne fait rien et elle s’arrête au bout d’une minute car les scripts xiaomi_alarm1 et xiaomi_alarm2 sont exécutés en mode :parallel avec un max: 10 et chacun dispose d’un délai de 6 secondes.

  • Soit on appuie sur le bouton snooze et là, l’alarme continue de sonner jusqu’à ses 60 secondes (jusqu’à atteindre le max: 10 d’exécution des scripts), puis après 5min, l’alarme se remet à sonner suite à l’exécution de xiaomi_alarm3 pendant 5min avant de s’arrêter suite à l’exécution de alarmclock_off.

Du coup, plusieurs points me dérange pour le fonctionnement d’un réveil :

  • l’alarme ne sonne que 1 min

  • la fonction snooze ne coupe pas l’alarme instantanément

  • la fonction snooze relance l’alarme seulement pendant 5min puis l’arrête sans aucune intervention humaine

  • l’alarme ne fonctionne qu’une seule fois : le fait que l’alarme commence à sonner est conditionné par l’évènement que input_boolean.wakeactivated_1 passe à on. Or, il n’est jamais remis à off. Il manque une action de remise à off de input_boolean.wakeactivated_1 quelque part

Loin de moi de critiquer ton travail, mais comme tu débute, je souhaitais t’expliquer le fonctionnement du code qui t’a inspiré et que tu partage afin que tout le monde puisse en profiter et comprendre le comportement.

Mon commentaire n’a que le but d’être constructif et ne dois en rien t’empêcher de continuer de partager tes automatismes :heart: sur le forum :+1:

Si tu le désire, on peux voir ensemble :people_holding_hands: ce qu’il faut faire pour améliorer le fonctionnement de ce réveil :alarm_clock:

2 J'aime

5 messages ont été scindés en un nouveau sujet : [CARTE] Réveil (ou activation d’automatisation)

Pas de soucis. En effet je débute je m’inspire a gauche a droite pour le moment et je regroupe des idées.
Je viens de jeedom où je suis resté 3 ans.
Et j’aime bcp plus home assistant.

L’idée est de partager et améliorer tout ça pour qu’on puisse proposer quelque chose de propre.

Je regarderai demain tes modifs.
Et j’essaie de faire une présentation de où j’en suis.

C’est le but du forum de s’apporter. Je cherche sur youtube et les github de l’inspiration en cherchant ensuite a comprendre pour essayer ensuite de faire par moi même.

1 J'aime

Attention, je n’ai apporté aucunes modifications dans les automatismes (automation/script).

Je te propose seulement mon aide si tu veux améliorer le fonctionnement.

Fait le point du fonctionnement et dis nous ce que tu souhaite améliorer (si tu souhaite améliorer quelque chose car le fonctionnement actuel t’es peut être suffisant).

Concernant Youtube, n’hésite pas à créer des posts si dans des vidéos tu souhaite approfondir/comprendre :wink:

@cob94440 Attention à ne pas tout mélanger.

Ici, c’est le post du réveil pas de custom-ui

Si tu veux bien éditer ton commentaire pour ne garder que la partie du réveil, l’autre partie je l’ai basculé vers le bon post :+1:, j’ai commencé à t’y répondre

Désolé je n’ai pas la possibilité de répondre dans le post indiqué. Le bouton « répondre » n’apparaît pas…
Voici les automatisations que j’utilise :

- id: 'wake_1_update_time'
  #nouvelle par rapport au post 1
  # Automatisation qui met à jour le input_datetime 'wake_time_1' représentant l'heure du reveil
  # en fonction des input_select représentants les heures et les minutes
  alias: wake_1_update_time
  trigger:
    - platform: state
      entity_id: input_select.wakehour_1
    - platform: state
      entity_id: input_select.wakeminutes_1
  action:
  - service: input_datetime.set_datetime
    entity_id: input_datetime.wake_time_1
    data_template:
      time: '{{states("input_select.wakehour_1")}}:{{states("input_select.wakeminutes_1")}}:00'

- id: 'wake_1_detect_time' #modifiée par rapport au post 1 pour la partie déclenchement (trigger)
  # Automatisation qui s'enclenche quand l'heure du système est égale à l'heure de l'input_datetime.wake_time_1
  alias: Wake 1
  trigger:
    platform: template
    value_template: "{{states('sensor.time') == (state_attr('input_datetime.wake_time_1','timestamp') | int | timestamp_custom('%H:%M', False))}}"
  condition:  
    condition: template
    value_template: >
       {% set today = 'input_boolean.wakeweekday_' ~ now().strftime("%a") | lower ~ '_1' %}
       {{ is_state('input_boolean.wakestatus_1', 'on') and is_state(today, 'on') }}
  action:
    service: input_boolean.turn_on
    entity_id: input_boolean.wakeactivated_1

- id: 'wake_1_alarm_activated' #inchangée par rapport au post 1
  alias: 'Wake 1 Activated'
  trigger:
    platform: state
    entity_id: input_boolean.wakeactivated_1
    from: 'off'
    to: 'on'
  action:   
    service: script.turn_on
    entity_id: script.music1

Si tu enlèves la condition, est-ce que cela fonctionne ?

Tu supprimes/commentes :

#  condition:  
#    condition: template
#    value_template: >
#       {% set today = 'input_boolean.wakeweekday_' ~ now().strftime("%a") | lower ~ '_1' %}
#       {{ is_state('input_boolean.wakestatus_1', 'on') and is_state(today, 'on')

Ça ne marche toujours pas…

L’automatisation d’update n’est pas déclenché quand je modifie l’heure du reveil sur la carte :

Tu mets bien a jour l’heure à travers les 2 input_select (heure/minute)?

On peut le remplacer par un truc plus sympa (et ne nécessite pas le sensor.time) :

trigger:
  platform: time
  at: input_datetime.wake_time_1

Oui :

#fichiers d'Input_select
wakehour_1:
#Représente le choix de l'heure du réveil
  name: wakehour_1
  options:
   - '00'
   - '01'
   - '02'
   - '03'
   - '04'
   - '05'
   - '06'
   - '07'
   - '08'
   - '09'
   - 10
   - 11
   - 12
   - 13
   - 14
   - 15
   - 16
   - 17
   - 18
   - 19
   - 20
   - 21
   - 22
   - 23
wakeminutes_1:
#Représente le choix des minutes du réveil
  name: wakeminutes_1
  options:
   - '00'
   - '01'
   - '02'
   - '03'
   - '04'
   - '05'
   - '06'
   - '07'
   - '08'
   - '09'
   - 10
   - 11
   - 12
   - 13
   - 14
   - 15
   - 16
   - 17
   - 18
   - 19
   - 20
   - 21
   - 22
   - 23
   - 24
   - 25
   - 26
   - 27
   - 28
   - 29
   - 30
   - 31
   - 32
   - 33
   - 34
   - 35
   - 36
   - 37
   - 38
   - 39
   - 40
   - 41
   - 42
   - 43
   - 44
   - 45
   - 46
   - 47
   - 48
   - 49
   - 50
   - 51
   - 52
   - 53
   - 54
   - 55
   - 56
   - 57
   - 58
   - 59

J’ai bien le sensor.time dans mon fichier sensor.yaml :

- platform: time_date
  display_options:
    - 'date'
    - 'time'
    - 'date_time