Erreurs dans les journaux HA

Hello,

J’ai plusieurs erreurs liées a mes volets dans les journaux HA, je n’arrive pas a trouver un correctif:

TemplateError('ZeroDivisionError: division by zero') while processing template 'Template<template=({% set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %} {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %} {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int) %} {%- endfor %} {{ ((ns.total / ns.count) | int) }}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.group_volets_suite'
Template variable warning: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'entity_id' when rendering '{% set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %} {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %} {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int) %} {%- endfor %} {{ ((ns.total / ns.count) | int) }}'

Et enfin:

Error while processing template: Template<template=({% set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %} {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %} {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int) %} {%- endfor %} {{ ((ns.total / ns.count) | int) }}) renders=2>

Voici le code pour calculer les % du groupe de volets de la suite parentale:

  - platform: template
    sensors:
      group_volets_suite:
        friendly_name: "Groupe Suite Parentale"
        unit_of_measurement: "%"
        value_template: >
          {%  set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %}
          {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %}
            {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int)  %} 
          {%- endfor %}
          {{ ((ns.total / ns.count) | int) }}

Une idée de ce que je doit corriger svp? Merci.

Salut @Galadan , comme indiqué, impossible de faire une division par 0.
Donc tu fais un IF juste avant pour tester que ns.count > 0

1 « J'aime »

J’ai mis ça
{{ (ns.total / ns.count) if ns.count > 0 else 0 }}

ça semble bon pour cette erreur.

Me reste:

Template variable warning: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'entity_id' when rendering '{% set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %} {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %} {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int) %} {%- endfor %} {{ (ns.total / ns.count) if ns.count > 0 else 0 }}'

Ton algo n’est pas bon.
Count c’est le nombre de volets dans ton groupe cover.volets_suite_parentale
Donc si effectivement tu evites la division par 0 à la fin, il te reste quand même un souci avec la partie juste avant : ta boucle for :
{%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %}
Tu vas y chercher l’attribut entity_id, qui justement n’existe pas (comme ça remonte 0 juste avant à tous les coups ton groupe est vide)

Du point de vue mathématique, c’est étrange aussi : la somme des positions divisée par le nombre de volets ?

1 « J'aime »

En fait ce sensor est censé remonté le % d’ouverture des volets de ce groupe.
Je m’y prends surement mal ^^

Alors commence par regarder dans les outils de de, si le groupe existe bien et quels sont ses attributs
Par ex:

Merci de ton aide.

J’ai pas grand chose:

Les infos viennent de MQTT, voici les sensors des volets en indiv (si ça peu aider):

- platform: template
  covers:
    volet_baie_suite:
      friendly_name: "Baie Chambre Parentale"
      open_cover:
        service: mqtt.publish
        data_template:
          topic: 'nodered/volet/baie_Suite/set'
          payload: 'up'
      close_cover:
        service: mqtt.publish
        data_template:
          topic: 'nodered/volet/baie_Suite/set'
          payload: 'down'
      stop_cover:
        service: mqtt.publish
        data_template:
          topic: 'nodered/volet/baie_Suite/set'
          payload: 'stop'
      set_cover_position:
        service: mqtt.publish
        data_template:
          topic: 'nodered/volet/baie_Suite/set'
          payload: "{{position}}"

Et un group:

- platform: group
  name: Volets Suite Parentale
  entities:
    - cover.volet_baie_suite
    - cover.volet_pano_p
    - cover.volet_sdb_p

Par contre j’ai ces sensor qui recupere le % d’ouverture des volets:

    - name: "position_pano_P"
      state_topic: "nodered/volet/pano_P/get"
      unit_of_measurement: '%'

Ok donc ton groupe est dans la catégorie sensor (il commence par sensor.xxxxxxxxxxx) et pas (cover.xxxxxxxxxxxx comme ton code), et tu n’as pris le bon nom non plus group_volets_suite_parentale versus volets_suite_parentale :frowning:

sensor:
  - platform: group
    name: Volets Suite Parentale
    entities:
      - cover.volet_baie_suite
      - cover.volet_pano_p
      - cover.volet_sdb_p

ce qu’il faut c’est group cover !

cover:
  - platform: group
    name: Volets Suite Parentale
    entities:
      - cover.volet_baie_suite
      - cover.volet_pano_p
      - cover.volet_sdb_p

Et pas certain qu’il soit obligatoire de passer pas une nouvelle entité pour récupérer la position. C’est déjà une info dispo dans les cover normalement

Je suis complètement paumé mdr

J’ai changé le nom du sensor qui devrait recupérer la valeur de position d’un groupe de volet pour m’y retrouver plus facilement:

    sensors:
      position_volets_chambres_amis:
        friendly_name: "Position volets Chambres d'amis"
        unit_of_measurement: "%"
        value_template: >
          {%  set ns = namespace(total = 0, count = (states['cover.volets_chambres_d_amis'].attributes.entity_id | length)) %}
          {%- for volet in states['cover.volets_chambres_d_amis'].attributes.entity_id %}
            {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int)  %} 
          {%- endfor %}
          {{ (ns.total / ns.count) if ns.count > 0 else 0 }}

Donc le group de volets correspond à ça:

- platform: group
  name: Volets Chambres d'Amis
  entities:
    - cover.volet_chambre_jardin
    - cover.volet_chambre_terrasse

Et après, je suis perdu sur ce que je doit modifier ^^

Moi aussi j’essaye de suivre :wink:
La bonne nouvelle c’est que le groupe est maintenant correct, il a ce qu’il faut pour ton calcul
image
Maintenant affiche :

  • les 2 entités cover du groupe (pour voir ce que ça contient : cover.volet_chambre_jardin et cover.volet_chambre_terrasse
  • les 2 entités qui sont en principe la récupération de la position: sensor.position_volet_chambre_jardin et sensor.position_volet_chambre_terrasse

idem pour chambre terrasse

ok donc en principe le template position_volets_chambres_amis fonctionne

J’ai encore ce message:

Template variable warning: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'entity_id' when rendering '{% set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %} {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %} {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int) %} {%- endfor %} {{ (ns.total / ns.count) if ns.count > 0 else 0 }}'

Logique tu as corrigé…
image
alors que

non non, j’ai pas le message pour chambre d’amis mais pour tous les autres lol alors que j’ai le meme code…
attends je le remet j’ai du zapper un truc:

  - platform: template
    sensors:
      position_volets_chambres_amis:
        friendly_name: "Position volets Chambres d'amis"
        unit_of_measurement: "%"
        value_template: >
          {%  set ns = namespace(total = 0, count = (states['cover.volets_chambres_d_amis'].attributes.entity_id | length)) %}
          {%- for volet in states['cover.volets_chambres_d_amis'].attributes.entity_id %}
            {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int)  %} 
          {%- endfor %}
          {{ (ns.total / ns.count) if ns.count > 0 else 0 }}
  - platform: template
    sensors:
      position_volets_suite:
        friendly_name: "Position volets Suite Parentale"
        unit_of_measurement: "%"
        value_template: >
          {%  set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %}
          {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %}
            {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int)  %} 
          {%- endfor %}
          {{ (ns.total / ns.count) if ns.count > 0 else 0 }}

C’est pas le code qui est faux (enfin si mais c’est pas grave)
Tu as corrigé le groupe cover.volets_chambre_d_amis qui sert pour le calcul de position_volets_chambres_amis
Corrige les autres groupes …

ben oui mais le truc c’est que j’ai corrigé les autres groupes en même temps ^^
Je vois pas ce que je doit toucher…
Voici les autres groupes de volets:

- platform: group
  name: all_covers
  entities:
    - cover.volet_chambre_jardin
    - cover.volet_chambre_terrasse
    - cover.volet_baie_suite
    - cover.volet_pano_p
    - cover.volet_sdb_p
    - cover.volet_entree
    - cover.volet_cuisine
    - cover.volet_fixe_terrasse
    - cover.volet_fixe_jardin
    - cover.volet_baie_3m
    - cover.volet_baie_2m
- platform: group
  name: Volets Chambres d'Amis
  entities:
    - cover.volet_chambre_jardin
    - cover.volet_chambre_terrasse
- platform: group
  name: Volets Suite Parentale
  entities:
    - cover.volet_baie_suite
    - cover.volet_pano_p
    - cover.volet_sdb_p
- platform: group
  name: Volets Salon
  entities:
    - cover.volet_entree
    - cover.volet_cuisine
    - cover.volet_fixe_terrasse
    - cover.volet_fixe_jardin
    - cover.volet_baie_3m
    - cover.volet_baie_2m
- platform: group
  name: Volets Coté Terrasse
  entities:
    - cover.volet_entree
    - cover.volet_chambre_terrasse
    - cover.volet_fixe_terrasse
    - cover.volet_baie_suite
    - cover.volet_baie_3m
- platform: group
  name: Volets Coté Jardin
  entities:
    - cover.volet_chambre_jardin
    - cover.volet_cuisine
    - cover.volet_pano_p
    - cover.volet_fixe_jardin
    - cover.volet_sdb_p
    - cover.volet_baie_2m

Alors redémarre HA pour tout resynchroniser

J’ai fait 3 fois et toujours pareil…

Alors copie le code dans les outils de dev => modèles pour décomposer

{%  set ns = namespace(total = 0, count = (states['cover.volets_suite_parentale'].attributes.entity_id | length)) %}
##debug
{{ns.total}}
{{ns.count}}
##calcul
{%if count > 0 %}
  {%- for volet in states['cover.volets_suite_parentale'].attributes.entity_id %}
    {% set ns.total = ns.total + (states[volet.replace("cover.volet_", "sensor.position_")].state | int(default=0))  %} 
  {%- endfor %}
  {{ ns.total / ns.count }}
{% else %}
 0
{% endif %}