Remonter les capteurs avec moins de 15% de batterie

j’ai encore jamais utilisé de blueprints, mais de ce que j’en ai lu c’est juste une automatisation pré-paramétrée.

Le problème que tu as peut être résolu de deux manières différentes (avec les connaissances que j’ai) :

  • La première, la plus simple, est de programmer le déclenchement d’une automatisation tous les jours à heure fixe puis de te servir du code jinja comme texte à renvoyer.
  • La seconde solution, plus complexe, consiste à ajouter un déclencheur basé sur « modèle » ça te permet d’ajouter du Jinja

Même si tu préfères la seconde solution, commence par essayer de faire fonctionner la première. Tu auras ainsi la certitude que tu envoies ce qu’il te convient dans ta notification. Et ensuite si tu es toujours motivé, tu pourras passer à la seconde partie.

PS: je suppose que tu as compris que je préfère te guider vers la solution plutôt que de te la donner. Pour prendre une analogie, je préfère t’apprendre à pêcher plutôt que de t’offrir du poisson. Si ça te convient comme ça, dis-le-moi

1 « J'aime »

Bonjour,
Je suis bien d’accord avec toi en effet pondre la réponse me faciliterait la chose mais je capterai pas mieux par la suite… toute fois depuis ta réponse je cherche… lol sans trop de succès et HA ne m’indique où j’ai mon erreur (des fois il indique telle ligne ne va pas, il manque ci et ça… bref)
La seule chose que j’ai trouvé :
Création d’une automatisation a heure fixe tous les jours : platform : time
Condition : aucune
Action :
Service: telegram send message
Data_template:
=>code jinja
Mais rien de bon avec ça…

Une petite piste pour intégrer le jinja dans l’automatisation ?

Merci.

je ne suis pas bien sûr de comprendre quel est ton problème
Tu n’arrives pas à faire une automatisation à heure fixe ?

Pardon, si si l’automatisation a heure fixe ça c’est bon.
Ce que je ne comprends pas à intégrer, c’est le code jinja2 où je sèche. Je ne trouve pas beaucoup d’explications pour cela à travers mes recherches.

Bonjour,
Tu as regardé l’article sur le portail ?

Telegram c’est ok aussi.
C’est vraiment le traitement du code de Sel que je ne trouve pas comment intégrer dans l’automatisation ?! Désolé :disappointed:

ne t’excuse pas c’est loin d’être facile et pour être franc je ne passe pas par l’interface pour écrire c’est parti là mais j’ai retrouvé leur trace après quelques recherches
pour définir les variables c’est blocs de constructionsdéfinir les variables
pour tester si ... c’est ajouter une conditionautre condition

par contre est-ce que tu sais afficher le code en YAML ?
parce que le plus simple c’est de faire un copier-coller du texte et de dupliquer ce que tu as besoin une fois revenu en interface

Ouaip,
Passer en YAML c’est ok, mais c’est le « où mettre le code » que tu as écris l’autre jour.
Lorsque je passe en YAML et que je colle ton code je ne peux pas sauvegarder, HA ne me le permet pas… je ne dois pas insérer cela au bon endroit :exploding_head:

Bonjour,

Petite évolution, étrange (pourquoi hier je n’y arrivais pas…) Mais j’ai réussi à faire marcher ton code une fois, j’ai fait un déclenchement « forcé » avec les 3 petits points en haut à droite, je reçois la notif sur télégram.

Après plusieurs essais, je remarque que si le code trouve plus d’une seule batterie, je ne reçois pas la notification.
Une idée ?

action:
  - service: telegram_bot.send_message
    data:
      message: >
        {% set id = namespace(bat = []) -%}
        {%- for x in states -%}
        {%- if state_attr(x.entity_id, "device_class") == "battery" -%}
        {%- if (x.state | int(100) < 80 and not x.state[:1] =="o") -%}
        {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%}
        {%- endif -%}
        {%- endif -%}
        {%- endfor %}
        Batterie à vérifier inf à 80:
        {% if id.bat | count == 0 -%}
        OK
        {%- else -%}
        {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }}
        {%- endif %}
mode: single

excuse moi si mes derniers messages manquaient de clartés, j’avais confondu ton sujet avec un autre, ils se ressemblaient beaucoup.

Comme tu n’as rien dis à ce sujet, je pars du principe que tu sais déclencher une automatisation à heure fixe. Si ce n’est pas le cas, n’hésite pas.

Je te fournis un exemple où j’envoie le résultat dans une zone texte. Il faudra que tu l’adaptes pour telegram.

action: input_text.set_value
data:
  value: >
    {% set id = namespace(bat = []) -%} {## création d'un tableau vide ##}
    {%- for x in states -%} {## on va tester tout les appareils qui communique sur leurs états ##}
      {%- if state_attr(x.entity_id, "device_class") == "battery" -%} {## est-ce que l'appareil donne des informations sur sa batterie  ##}
        {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%} {## est-ce que l'information sur la batterie est un nombre  inférieur à 15 et n'est pas du texte ##}
          {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%} {## On mémorise le nom de l'appareil et son % de batterie ##}
        {%- endif -%}
      {%- endif -%}
    {%- endfor %} {## fin du teste individuel sur tous les appareils ##}{% if id.bat | count == 0 -%} {## il n'y a aucune batterie < 15% ##}
      OK
    {%- else -%} {## il y a une ou plusieurs batteries < 15% ##}
      {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }} {## on affiche le nom des batteries en les séparant par une virgule sauf pour le dernier ou l'on remplace la virgule par 'et'  ##}
    {%- endif %}
target:
  entity_id: input_text.mon_teste

le YAML doit être indenter correctement. Si ce n’est pas le cas HA ne te permet pas de sauvegarder.

Si tu fais un copier/coller comme ci dessous tu ne respectes pas l’indentation:

trigger:
  - platform: time_pattern
    seconds: /10
condition: []
action:
action: input_text.set_value
data:
  value: >
    {% set id = namespace(bat = []) -%} {## création d'un tableau vide ##}
    {%- for x in states -%} {## on va tester tout les appareils qui
    communique sur leurs états ##}
      {%- if state_attr(x.entity_id, "device_class") == "battery" -%} {## est-ce que l'appareil donne des informations sur sa batterie  ##}
        {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%} {## est-ce que l'information sur la batterie est un nombre  inférieur à 15 et n'est pas du texte ##}
          {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%} {## On mémorise le nom de l'appareil et son % de batterie ##}
        {%- endif -%}
      {%- endif -%}
    {%- endfor %} {## fin du teste individuel sur tous les appareils ##}{%
    if id.bat | count == 0 -%} {## il n'y a aucune batterie < 15% ##}
      OK
    {%- else -%} {## il y a une ou plusieurs batteries < 15% ##}
      {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }} {## on affiche le nom des batteries en les séparant par une virgule sauf pour le dernier ou l'on remplace la virgule par 'et'  ##}
    {%- endif %}
target:
  entity_id: input_text.mon_teste
mode: single

Là, tu respectes l’indentation mais pas la structure

trigger:
  - platform: time_pattern
    seconds: /10
condition: []
action:
    action: input_text.set_value
    data:
      value: >
        {% set id = namespace(bat = []) -%} {## création d'un tableau vide ##}
        {%- for x in states -%} {## on va tester tout les appareils qui
        communique sur leurs états ##}
          {%- if state_attr(x.entity_id, "device_class") == "battery" -%} {## est-ce que l'appareil donne des informations sur sa batterie  ##}
            {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%} {## est-ce que l'information sur la batterie est un nombre  inférieur à 15 et n'est pas du texte ##}
              {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%} {## On mémorise le nom de l'appareil et son % de batterie ##}
            {%- endif -%}
          {%- endif -%}
        {%- endfor %} {## fin du teste individuel sur tous les appareils ##}{%
        if id.bat | count == 0 -%} {## il n'y a aucune batterie < 15% ##}
          OK
        {%- else -%} {## il y a une ou plusieurs batteries < 15% ##}
          {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }} {## on affiche le nom des batteries en les séparant par une virgule sauf pour le dernier ou l'on remplace la virgule par 'et'  ##}
        {%- endif %}
    target:
      entity_id: input_text.mon_teste
mode: single

Comme ça c’est correct

trigger:
  - platform: time_pattern
    seconds: /10
condition: []
action:
  - action: input_text.set_value
    data:
      value: >
        {% set id = namespace(bat = []) -%} {## création d'un tableau vide ##}
        {%- for x in states -%} {## on va tester tout les appareils qui
        communique sur leurs états ##}
          {%- if state_attr(x.entity_id, "device_class") == "battery" -%} {## est-ce que l'appareil donne des informations sur sa batterie  ##}
            {%- if (x.state | int(100) < 15 and not x.state[:1] =="o") -%} {## est-ce que l'information sur la batterie est un nombre  inférieur à 15 et n'est pas du texte ##}
              {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%} {## On mémorise le nom de l'appareil et son % de batterie ##}
            {%- endif -%}
          {%- endif -%}
        {%- endfor %} {## fin du teste individuel sur tous les appareils ##}{%
        if id.bat | count == 0 -%} {## il n'y a aucune batterie < 15% ##}
          OK
        {%- else -%} {## il y a une ou plusieurs batteries < 15% ##}
          {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }} {## on affiche le nom des batteries en les séparant par une virgule sauf pour le dernier ou l'on remplace la virgule par 'et'  ##}
        {%- endif %}
    target:
      entity_id: input_text.mon_teste
mode: single

J’ai vu que tu avais trouvé la moitié de la solution pendant que j’écrivais ma réponse. Bravo !
Je pense que le détail t’aideras à mieux comprendre pourquoi ça ne marché pas avant.

je pense que ce problème viens du déclencheur (trigger). Peux tu le partager ?
Si tu n’en as pas mis, tu as trouvé le problème.

Voici mon yaml complet (avec le trigger ‹ time ›) :
Et la je vois que le code est complètement en branle ! :hot_face: Dès que je quitte le mode yaml pour revenir en interface et que je reviens sur yaml il se met en branle.!?

EDIT : le code qui se met en branle ==> corrigé par bien respecter l’indentation, merci.

alias: Notif-batt-dev1
description: ""
trigger:
  - platform: time
    at: "07:00:00"
    alias: Notif-batt-dev1
action:
  - service: telegram_bot.send_message
    data:
      message: >
        {% set id = namespace(bat = []) -%} {%- for x in states -%} {%- if
        state_attr(x.entity_id, "device_class") == "battery" -%} {%- if (x.state
        | int(100) < 30 and not x.state[:1] =="o") -%} {%- set id.bat = id.bat +
        [x.entity_id+": "+x.state+"%"] -%} {%- endif -%} {%- endif -%} {%-
        endfor %} Batterie à vérifier inf à 30: {% if id.bat | count == 0 -%} OK
        {%- else -%} {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }}
        {%- endif %}
mode: single

Correction :

alias: Notif-batt-dev1
description: ""
trigger:
  - platform: time
    at: "07:00:00"
    alias: Notif-batt-dev1
action:
  - service: telegram_bot.send_message
    data:
      message: |
        {% set id = namespace(bat = []) -%} {%- for x in states -%}
          {%- if state_attr(x.entity_id, "device_class") == "battery" -%}
            {%- if (x.state | int(100) < 30 and not x.state[:1] =="o") -%}
              {%- set id.bat = id.bat + [x.entity_id+": "+x.state+"%"] -%}
            {%- endif -%}
          {%- endif -%}
        {%- endfor %}
          Batterie à vérifier inf à 30 :
        {% if id.bat | count == 0 -%}
          OK
        {%- else -%}
          {{ ' et '.join((id.bat | join(', ')).rsplit(', ', 1)) }}
        {%- endif %}
mode: single

Mais toujours problème si plusieurs batteries…

essaie ça plutôt

trigger:
  - platform: time_pattern
    hours: "7"

et attention a ton second
alias: Notif-batt-dev1
je pense qu’il est là par erreur

quel est le problème ?

J’ai modifié le trigger et en effet supprimer le 2ième alias.

L’erreur que j’ai, si on peut appeler cela une erreur, c’est si plus de 2 batteries inférieurs à ma valeur de seuil, je ne reçois pas de notification.

As-tu vérifier si tu as une longueur de texte limite avec telegram ?

:thinking:
je ne trouve pas cette info s’il y a une taille limite de caractère sur la doc de telegram.
Je n’aurai pas pensé à cela mais il me semble avoir déjà envoyer des notifs très importante avec des rapports sur Températures maison/piece/piscine/extérieur + clim etc etc… je n’ai jamais compté les caractères bien sur.

faudrait que je vois comment faire pour envoyer une notification à mon home assistant dans le menu de gauche « Notification » s’ils gèrent tous les caractères.

EDIT : il doit y avoir un truc avec Telegram en effet car quand je passe par le service: notify.notify ou notify.send_message ou encore notify.persistent_notification cela fonctionne.

tu n’as qu’a tester. tu envoies « 12345678901234567890 » puis « 1234567890123456789012345678901234567890 » et ainsi de suite. si il y a une limite tu le verras.
Et si c’est le cas tu modifies ta notification en cas de batterie faible. Tu peux écrire à la place "Attention : une ou plusieurs batteries faibles.

Habile ! je n’y aurais pas pensé, je me suis arrêté à 1757 caractères et ça passe.
Là pour mon cas j’aurai 313 caractères à envoyer et… va savoir pourquoi, ça vient de passer… je reçois toutes les batteries inférieurs au seuil…
Bref c’est résolu, mais je ne comprends pas pk… :crazy_face:
et je viens de résoudre un pb de mise à jour par OTA d’ESPHome, alors 2 problèmes résolus aujourd’hui, c’est toujours plaisant,

Mais j’y pense, plutôt que de faire une routine qui vérifie tous les jours et enverra tjs les jours une notifications, pas strictement nécessaire si tout est ok. Comment je pourrai mettre en trigger le % d’une des batteries ?

Merci Selecus.

1 « J'aime »