Calcul durée entre maintenant et couché du soleil

Bonjour,

Je suis débutant avec home assistant.
Je commence à m’en sortir avec les automatisations en mode éditeur visuel

Je voudrais calculer la durée entre maintenant et le couché du soleil, pour savoir si je mets ma tondeuse en pause ou si j’annule la tonte.
Je ne sais pas où commencer à chercher

Merci

1 « J'aime »

Bonjour,

Configuration du capteur (YAML)

Vous pouvez placer ce code dans votre configuration.yaml

template:
  - sensor:
      - name: "Compte à rebours coucher du soleil"
        unique_id: "solar_countdown_hhmm"
        state: >
          {% set sun_set = state_attr('sun.sun', 'next_setting') | as_datetime %}
          {% set t_delta = sun_set - now() %}
          {% set total_seconds = t_delta.total_seconds() | max(0) %}
          {{ total_seconds | timestamp_custom('%H:%M', false) }}
        icon: "mdi:weather-night"
        attributes:
          friendly_time: >
            {% set sun_set = state_attr('sun.sun', 'next_setting') | as_datetime %}
            {% set t_delta = sun_set - now() %}
            {% if t_delta.total_seconds() > 0 %}
              {{ t_delta.total_seconds() | timestamp_custom('%Hh %Mmin', false) }}
            {% else %}
              Couché
            {% endif %}

voilà si sa peu aider

un petit code Mushroom Template Card

type: custom:mushroom-template-card
primary: "Coucher du soleil"
secondary: >
  {% set sun_set = state_attr('sun.sun', 'next_setting') | as_datetime %}
  {% set t_delta = sun_set - now() %}
  {% if t_delta.total_seconds() > 0 %}
    Dans {{ t_delta.total_seconds() | timestamp_custom('%H:%M', false) }}
  {% else %}
    Déjà couché
  {% endif %}
icon: mdi:weather-sunset-down
icon_color: orange
entity: sun.sun

Merci,
puis-je me permettre d’abuser ?
Est-ce que j’aurais pu faire ça avec l’éditeur ?

1 « J'aime »

puis-je me permettre d’abuser ? non pas de soucis
Est-ce que j’aurais pu faire ça avec l’éditeur ? quel editeur

ce que home assistant appelle ‹ éditeur visuel ›
ce genre là :

1 « J'aime »

pas dans faire une automation, c’est fait pour une automatisation qui permet de dire a un appareil fait ceci ou cela. Dans ton cas l’automatisation servira a dire a ta tondeuse ne tond plus apres le coucher du soleil.

voila un exemple d’automatisme

alias: "Tondeuse : Gestion fin de journée"
description: "Décide de mettre en pause ou d'annuler selon le soleil"
trigger:
  - platform: time_pattern
    minutes: "/15" # Vérifie toutes les 15 minutes
condition:
  - condition: state
    entity_id: vacuum.mova_robot_mower # Remplacez par votre entité
    state: "cleaning" # Uniquement si elle est en train de tondre
action:
  - choose:
      # CAS 1 : ANNULATION (S'il reste moins de 60 min avant le soleil et que la batterie est basse)
      - conditions:
          - condition: numeric_state
            entity_id: sensor.compte_a_rebours_soleil_minutes
            below: 60
          - condition: numeric_state
            entity_id: sensor.mova_battery_level
            below: 30
        sequence:
          - service: vacuum.return_to_base
            target:
              entity_id: vacuum.mova_robot_mower
          - service: notify.mobile_app_votre_telephone
            data:
              title: "Tonte Annulée"
              message: "Trop tard et batterie basse. Retour à la base."

      # CAS 2 : PAUSE (S'il reste moins de 30 min avant le coucher du soleil)
      - conditions:
          - condition: numeric_state
            entity_id: sensor.compte_a_rebours_soleil_minutes
            below: 30
        sequence:
          - service: vacuum.pause
            target:
              entity_id: vacuum.mova_robot_mower
          - service: notify.mobile_app_votre_telephone
            data:
              title: "Tondeuse en Pause"
              message: "Le soleil se couche. Reprise demain matin."

Ce code yaml que tu m’as gentiment fourni, je vais le mettre dans ‹ outil de developpement/modele › et il va me créer une entité ou un capteur que je pourrai utiliser dans mes automatisations ?

L’onglet « Outils de développement > Modèle » est (un testeur). Il sert uniquement à vérifier que votre code fonctionne et à voir le résultat en temps réel. Il ne crée pas d’entité permanente. Dès que vous quittez la page ou que vous effacez le code, le calcul « disparaît ».

Pour créer un capteur (sensor) que vous pourrez utiliser dans vos automatisations et sur votre tableau de bord, vous avez deux options :

Option 1 : Via l’interface (Sans redémarrer) - Recommandé

C’est la méthode la plus simple pour transformer votre test en véritable entité :

  1. Allez dans Paramètres > Appareils et services.
  2. Cliquez sur l’onglet Entrées en haut.
  3. Cliquez sur Créer une entrée (bouton en bas à droite).
  4. Choisissez Modèle (Template), puis Modéliser un capteur.
  5. Nom : « Compte à rebours coucher du soleil ».
  6. État (Template) : Collez ici la partie du code qui commence par {% set ... %}.
  7. Classe d’appareil : Laissez vide ou choisissez « Durée ».
  8. Validez.

Désormais, vous aurez une entité nommée sensor.compte_a_rebours_coucher_du_soleil disponible partout.

Option 2 : Via le fichier configuration.yaml

Si vous préférez gérer votre domotique par code (comme pour vos dashboards complexes) :

  1. Collez le bloc complet template: dans votre fichier configuration.yaml.
  2. Allez dans Outils de développement > YAML.
  3. Cliquez sur Configuration du modèle (Template entities) pour recharger sans redémarrer tout Home Assistant.

Résumé pour votre automatisation de tonte :

Une fois l’étape 1 ou 2 terminée, vous pourrez aller dans l’éditeur d’automatisation et simplement choisir :

  • Déclencheur : État.
  • Entité : sensor.compte_a_rebours_coucher_du_soleil.
  • Condition : Si l’état est inférieur à 00:45:00, alors « Pause » ou « Retour base ».

En résumé : Utilisez l’onglet « Modèle » pour tester vos calculs sur la tondeuse, mais passez par les « Entrées » pour créer le capteur définitif.

1 « J'aime »

Ok
un grand merci.
Je comprends aussi que si je veux faire ce genre de calcul, il faut que je me mette au ‹ yaml ›

oui ou créer une entrée

Une autre possibilité est de faire le calcul directement dans l’automatisation (mais oui, toujours en YAML) avec une condition template.

condition: template
value_template: ""

C’est le même principe, mais si ce calcul n’est pas utilisé ailleurs, cela permet de ne pas créer une entité permanente.

1 « J'aime »

Salut

Non il faut que tu te mettes au jinja2 qui est le language de templating de HA, ce qui est different du yaml.

Il me signale une erreur :

Désolé, j’ai répondu à idaho :
J’ai cette erreur :

A mon age, ça devient compliqué d’apprendre tout ces langages. Je m’étais mis un peu au php avec eedomus.
j’apprends où le jinja2 ?

j’ai 59 ans

remplace le code par celui-ci

- sensor:
      - name: "Compte à rebours coucher du soleil"
        unique_id: "solar_countdown_hhmm"
        state: >
          {% set next_setting = state_attr('sun.sun', 'next_setting') %}
          {% if next_setting is not none %}
            {% set t_delta = next_setting | as_datetime - now() %}
            {# Correction ici : utilisation de la fonction max(0, valeur) #}
            {% set total_seconds = max(0, t_delta.total_seconds()) %}
            {{ total_seconds | timestamp_custom('%H:%M', false, default='00:00') }}
          {% else %}
            00:00
          {% endif %}
        icon: "mdi:weather-night"
        attributes:
          friendly_time: >
            {% set next_setting = state_attr('sun.sun', 'next_setting') %}
            {% if next_setting is not none %}
              {% set t_delta = next_setting | as_datetime - now() %}
              {% set total_seconds = max(0, t_delta.total_seconds()) %}
              {% if total_seconds > 0 %}
                {% set hours = (total_seconds // 3600) | int %}
                {% set minutes = ((total_seconds % 3600) // 60) | int %}
                {% set h_text = hours ~ ' heure' if hours <= 1 else hours ~ ' heures' %}
                {% set m_text = minutes ~ ' minute' if minutes <= 1 else minutes ~ ' minutes' %}
                {{ h_text ~ ' et ' ~ m_text if hours > 0 else m_text }}
              {% else %}
                Couché
              {% endif %}
            {% else %}
              Indisponible
            {% endif %}

Ok le capteur est créé. Pour le moment, il me renvoie ‹ inconnu ›
by the way : 68 ans

Voici les raisons possibles pour lesquelles il affiche encore « inconnu » et comment le forcer à s’actualiser :

1. Attendre la prochaine minute

Le calcul utilise la fonction now(). Par défaut, Home Assistant ne met à jour les capteurs basés sur le temps qu’au passage de chaque minute (ex: 11:45, 11:46). Attendez une minute complète pour voir si l’état change.

2. Forcer la mise à jour (Outils de développement)

Si après deux minutes il est toujours « inconnu », vous pouvez forcer le système à recalculer les modèles :

  1. Allez dans Outils de développement > onglet YAML.

  2. Descendez jusqu’à la section « Rechargement de la configuration YAML ».

  3. Cliquez sur ENTITÉS DE MODÈLE (Template entities).

3. Vérifier l’entité sun.sun

Le capteur dépend entièrement de l’entité soleil.

  • Allez dans Outils de développement > onglet États.

  • Cherchez sun.sun.

  • Vérifiez qu’elle possède bien un attribut next_setting avec une date et une heure valides. Si sun.sun est absente ou désactivée, le capteur restera sur « inconnu ».

4. Erreur de syntaxe lors du copier-coller

non, tout est bon.

          {% if next_setting is not none %}
            {% set t_delta = next_setting | as_datetime - now() %}
            {# Correction ici : utilisation de la fonction max(0, valeur) #}
            {% set total_seconds = max(0, t_delta.total_seconds()) %}
            {{ total_seconds | timestamp_custom('%H:%M', false, default='00:00') }}
          {% else %}
            00:00
          {% endif %}
        icon: "mdi:weather-night"
        attributes:
          friendly_time: >
            {% set next_setting = state_attr('sun.sun', 'next_setting') %}
            {% if next_setting is not none %}
              {% set t_delta = next_setting | as_datetime - now() %}
              {% set total_seconds = max(0, t_delta.total_seconds()) %}
              {% if total_seconds > 0 %}
                {% set hours = (total_seconds // 3600) | int %}
                {% set minutes = ((total_seconds % 3600) // 60) | int %}
                {% set h_text = hours ~ ' heure' if hours <= 1 else hours ~ ' heures' %}
                {% set m_text = minutes ~ ' minute' if minutes <= 1 else minutes ~ ' minutes' %}
                {{ h_text ~ ' et ' ~ m_text if hours > 0 else m_text }}
              {% else %}
                Couché
              {% endif %}
            {% else %}
              Indisponible
            {% endif %}
saisissez ou collez du code ici