Création d'un timer depuis un sensor

Bonsoir a tous,

J’ai des templates sensor dont le dernier ci dessous qui me donne le temps restant avant la prochaine prière.

      - name: next_prayer_new
        state: >-
          {% set now = strptime(states('sensor.time'), '%H:%M') %}
          {% set fajr = strptime(states('sensor.salah_fajr'), '%H:%M') %}
          {% set dhuhr = strptime(states('sensor.salah_dhuhr'), '%H:%M') %}
          {% set asr = strptime(states('sensor.salah_asr'), '%H:%M') %}
          {% set maghrib = strptime(states('sensor.salah_maghrib'), '%H:%M') %}
          {% set isha = strptime(states('sensor.salah_isha'), '%H:%M') %}
          {% if now < fajr %}
            {{ states('sensor.salah_fajr') }}
          {% elif fajr <= now < dhuhr %}
            {{ states('sensor.salah_dhuhr') }}
          {% elif dhuhr <= now < asr %}
            {{ states('sensor.salah_asr') }}
          {% elif asr <= now < maghrib %}
            {{ states('sensor.salah_maghrib') }}
          {% elif maghrib <= now < isha %}
            {{ states('sensor.salah_isha') }}
          {% else %}
            {% set tomorrow = now + timedelta(days=1) %}
            {% set tomorrow_str = tomorrow.strftime('%Y-%m-%d') %}
            {{ states('sensor.salah_fajr', {'date': tomorrow_str}) }}
          {% endif %}
          
      - name: time_until_next_prayer
        state: >-
          {% set current_time = now().strftime('%H:%M') %}
          {% set next_prayer = states('sensor.next_prayer_new') %}
          {% set next_prayer_datetime = strptime(next_prayer, '%H:%M') %}
          {% set current_datetime = strptime(current_time, '%H:%M').replace(year=next_prayer_datetime.year, month=next_prayer_datetime.month, day=next_prayer_datetime.day) %}
          {% if current_datetime < next_prayer_datetime %}
            {{ (next_prayer_datetime - current_datetime).total_seconds() }}
          {% else %}
            {{ (next_prayer_datetime + timedelta(days=1) - current_datetime).total_seconds() }}
          {% endif %}
          
      - name: time_until_next_prayer_formatted
        state: >-
          {% set total_seconds = states('sensor.time_until_next_prayer') | float %}
          {% set hours = (total_seconds // 3600) | int %}
          {% set minutes = ((total_seconds % 3600) // 60) | int %}
          {{ '%02d:%02d' % (hours, minutes) }}
          

Afin d’utiliser la carte custom bar card je voudrais créer un timer a partir de mon sensor.time_until_next_prayer_formatted.

Quelqu’un aurait une piste?
Un autre template?
Ou créer un timer vide et utiliser une automation pour l’actualiser ?

Merci du coup de pouce d’avance.

1 « J'aime »

Salut,

Les sensors sont déjà bien « poilus » (autres sensors avec les H:M + calcul now etc)… Pas certain qu’un étage de plus ça soit le plus simple ?
Quel est ton objectif (ce que ça doit afficher et pas comment tu imagines le faire) ?
Perso comme ça je partirai d’un calendar, avec easy pour le calcul… Ensuite pour l’affichage à voir ce que tu veux obtenir

Merci pour ton retour.
En fait je souhaite dans ma card mettre cette card avec le temps restant :

[GitHub - rianadon/timer-bar-card: A progress bar display for Home Assistant timers]
mais si je mets mon sensor time remaining formatted la bar n’apparai tpas :

image

seulement le temps restant.

Edit:

Le code de la carte au cas ou :

type: custom:stack-in-card
cards:
  - type: custom:layout-card
    layout_type: custom:grid
    layout:
      grid-template-columns: auto 120px
      grid-template-rows: auto auto
      margin: '-4px 0px -10px -4px;'
    cards:
      - type: custom:mushroom-template-card
        primary: Prayer Times
        secondary: >-
          Next Prayer: {{ states('sensor.next_prayer_new') }} | Starts
          in         {{
           states('sensor.time_until_next_prayer_formatted') }}
        icon: mdi:mosque
        entity: sensor.next_prayer_new
        tap_action:
          action: none
        hold_action:
          action: none
        icon_color: red
        fill_container: false
        multiline_secondary: false
        style: |
          ha-card {
            background: none;
            box-shadow: none;
          }
  - type: custom:timer-bar-card
    entities:
      - sensor.time_until_next_prayer_formatted
    layout: full_row
    active_state: Running
    bar_radius: 3em
    bar_height: 15px
    bar_width: 50%
    bar_foreground: '#FF9800'
    bar_background: '#FFE0B2'
  - type: horizontal-stack
    cards:
      - type: custom:mushroom-template-card
        entity: sensor.salah_fajr
        primary: Fajr
        secondary: |
          {{ states('sensor.salah_fajr') }}
        icon: mdi:weather-sunset-up
        icon_color: '#F44336'
        tap_action:
          action: more-info
        layout: vertical
        fill_container: false
        multiline_secondary: false
        card_mod:
          style: |
            .mushroom-template-card .title {
              grid-row: 1 / 2; /* span across the first row */
              justify-self: start; /* align to the left */
            }
            .mushroom-template-card .subtitle {
              grid-row: 2 / 3; /* span across the second row */
              justify-self: end; /* align to the right */
            }
      - type: custom:mushroom-template-card
        entity: sensor.salah_dhuhr
        primary: Dhuhr
        secondary: |
          {{ states('sensor.salah_dhuhr') }}
        icon: mdi:weather-sunny
        icon_color: '#F1C40F'
        tap_action:
          action: more-info
        layout: vertical
        fill_container: false
        multiline_secondary: false
        card_mod:
          style: |
            .mushroom-template-card .title {
              grid-row: 1 / 2; /* span across the first row */
              justify-self: start; /* align to the left */
            }
            .mushroom-template-card .subtitle {
              grid-row: 2 / 3; /* span across the second row */
              justify-self: end; /* align to the right */
            }
      - type: custom:mushroom-template-card
        entity: sensor.salah_asr
        primary: Asr
        secondary: |
          {{ states('sensor.salah_asr') }}
        icon: mdi:weather-sunset-down
        icon_color: '#9C27B0'
        tap_action:
          action: more-info
        layout: vertical
        fill_container: false
        multiline_secondary: false
        card_mod:
          style: |
            .mushroom-template-card .title {
              grid-row: 1 / 2; /* span across the first row */
              justify-self: start; /* align to the left */
            }
            .mushroom-template-card .subtitle {
              grid-row: 2 / 3; /* span across the second row */
              justify-self: end; /* align to the right */
            }
      - type: custom:mushroom-template-card
        entity: sensor.salah_maghrib
        primary: Maghrib
        secondary: |
          {{ states('sensor.salah_maghrib') }}
        icon: mdi:weather-sunset
        icon_color: '#FF9800'
        tap_action:
          action: more-info
        layout: vertical
        fill_container: false
        multiline_secondary: false
        card_mod:
          style: |
            .mushroom-template-card .title {
              grid-row: 1 / 2; /* span across the first row */
              justify-self: start; /* align to the left */
            }
            .mushroom-template-card .subtitle {
              grid-row: 2 / 3; /* span across the second row */
              justify-self: end; /* align to the right */
            }
      - type: custom:mushroom-template-card
        entity: sensor.salah_isha
        primary: Isha
        secondary: |
          {{ states('sensor.salah_isha') }}
        icon: mdi:weather-night
        icon_color: '#673AB7'
        tap_action:
          action: more-info
        layout: vertical
        fill_container: false
        multiline_secondary: false
        card_mod:
          style: |
            .mushroom-template-card .title {
              grid-row: 1 / 2; /* span across the first row */
              justify-self: start; /* align to the left */
            }
            .mushroom-template-card .subtitle {
              grid-row: 2 / 3; /* span across the second row */
              justify-self: end; /* align to the right */
            }
    style: |
      ha-card {
        background: none;
        box-shadow: none;
      }
card_mod:
  style: |
    ha-card {
    background: linear-gradient(to right, #ece9e6, #ffffff);
    }

Pour le code de la bar seule avec mode debug j’ai ceci :

Le timer au sens HA (celui utilisé par la carte) a pour but de déclencher des actions en amont/aval en gérant le temps entre le début et la fin.
De ce que je comprends toi, tu veux un affichage plus ou moins animé du temps restant avant une série de heure/minute. Correct ?

Oui c’est ça. En gros transformer mon sensor en timer avec juste la même info.

Le timer c’est pas ma solution. Ça n’affichera pas ce que tu veux

Sur le github de l’intégration j’ai vu certains avec un sensor. Je pense que mon template a besoin d’un attribut start Time et duration ainsi que la class timestamp

Donc startime et duration, ça donnerai le temps de la prière… Donc absolument pas le temps restant avant que ce soit l’heure…

Comment tu verrais ça du coup?

L’intégration de base c’est celle-ci ?

Peut-être qu’en faisant commencer tous les timers à minuit, avec durée=heure de la prière, ça pourrait marcher (par contre ça me parait quand même être une grosse usine à gaz)

Salut…
Le problème c’est ton entity dans la partie duration ! tu n’as pas de référence de durée donc pas de barre !
Essai de créé une entity de duration , de sensor.time_until_next_prayer_formatted,

  • si celui-ci à un attribue duration !
{{ (state_attr('sensor.time_until_next_prayer_formatted','duration')) }}
Mois je le fais sur des temps pour arrosage
type: custom:timer-bar-card
entities:
  - timer.minuteur
duration:
  entity: sensor.mesure_temps
bar_radius: 5em
bar_background: green
modifications:
  - elapsed: 10%
    bar_foreground: blue
    active_icon: mdi:numeric-1-box-outline
    bar_height: 12px
  - elapsed: 20%
    bar_foreground: lightblue
    active_icon: mdi:numeric-2-box-outline
  - elapsed: 30%
    bar_foreground: yellow
    active_icon: mdi:numeric-3-box-outline
  - elapsed: 40%
    bar_foreground: orange
    active_icon: mdi:numeric-4-box-outline
  - elapsed: 50%
    bar_foreground: pink
    active_icon: mdi:numeric-5-box-outline
  - elapsed: 60%
    bar_foreground: darkpink
    active_icon: mdi:numeric-6-box-outline
  - elapsed: 70%
    bar_foreground: lightred
    active_icon: mdi:numeric-7-box-outline
  - elapsed: 80%
    bar_foreground: darkred
    active_icon: mdi:numeric-8-box-outline
  - elapsed: 90%
    bar_foreground: red
    active_icon: mdi:numeric-9-box-outline
debug: false

avec le sensor.mesure_temp defini dans une entrée en mode développement Template, avec la référence du timer

{{ (state_attr('timer.minuteur','duration')) }}

Je comprend que cela est pas très normal, mais fonctionne ! ICI timer de 20 sec
J’ai une désynchro de l’heure qui s’affiche en fin de décompte!
minuteur demo

Hum…
Pour moi il y a mélange entre un compte à rebours versus minuteur … C’est pas du tout la même notion.
Les timer de HA (minuteurs), ça demande à être déclencher surtout pour afficher la barre de progession

Dans cette carte il faut une entité [duration] avec un attribue de temps sinon ne fonctionne pas sur la barre

Oui j’ai bien compris :wink:
Mais la duration justement, n’est pas si simple à calculer…

Ok
Il faudrait que je reprenne comment il établi son sensor ! dans son YAML

EDIT

Donc il calcule dans combien de temps la prochaine !, comme il fait référence au moment ( current_time)
il faut mettre dans son Custom: timer-bard-card

  • entities: son calcul
  • dans la duration :
    entity : sensor.time
exemple sur un input.number

Il faut que les deux ai la même unités heures ou (et) minutes

Merci pour vos retours .
En parallèle j’ai suivi le fil sur le community où j’avais vu l’idée.
Il y a un d taille de comment faire :

En gros avec les templates créer une automation pour que cela démarre un timer avec en duration le sensor.

Mouais, ça fait une sacrée collection d’entités… Après si ça fonctionne …