Vérifier et additionner des valeurs dans un template

Bonjour

Je souhaite faire un truc tout bête dans un template mais je ne trouve pas la syntaxe correcte…
J’ai un template power general et je veux additionner toutes mes entités mais en vérifiant avant que chaque entité est un nombre pour ne pas bloquer le template ou les calculs sous-jacents…

Mon code qui marche pas

state: >
          {% set state = 0 |float %}
          
          # cave a vin
          {% set state_temp = states('sensor.wallplug_cave_a_vin_electric_consumption_w') %}
          {% if is_number(state_temp) %}
            {% state += state_temp |float %}
          {% endif %}

          # congel garage
          {% set state_temp = states('sensor.wallplug_congel_garage_power') %}
          {% if is_number(state_temp) %}
            {% state += state_temp |float %}
          {% endif %}

          # frigo garage
          {% set state_temp = states('sensor.wallplug_frigo_power') %}
          {% if is_number(state_temp) %}
            {% state += state_temp |float %}
          {% endif %}

          # lave linge
          {% set state_temp = states('sensor.wallplug_lave_linge_power') %}
          {% if is_number(state_temp) %}
            {% set state += state_temp |float %}
          {% endif %}

          # lave vaisselle
          {% set state_temp = states('sensor.wallplug_lave_vaisselle_power') %}
          {% if is_number(state_temp) %}
            {% set state += state_temp |float %}
          {% endif %}

          # seche linge
          {% set state_temp = states('sensor.wallplug_seche_linge_power') %}
          {% if is_number(state_temp) %}
            {% set state += state_temp |float %}
          {% endif %}

          # four
          {% set state_temp = states('sensor.rt2_t7_puissance_four') %}
          {% if is_number(state_temp) %}
            {% set state += state_temp |float %}
          {% endif %}

          # plaque induction
          {% set state_temp = states('sensor.rt2_t2_puissance_plaque_induction') %}
          {% if is_number(state_temp) %}
            {% set state += state_temp |float %}
          {% endif %}

          {{state}}

Bj

d’apres ce je vois tu as des erreur de synthase

regarde ceci si sa fonctionne

state: >
  {% set state = 0 | float %}
  
  # cave a vin
  {% set state_temp = states('sensor.wallplug_cave_a_vin_electric_consumption_w') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # congel garage
  {% set state_temp = states('sensor.wallplug_congel_garage_power') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # frigo garage
  {% set state_temp = states('sensor.wallplug_frigo_power') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # lave linge
  {% set state_temp = states('sensor.wallplug_lave_linge_power') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # lave vaisselle
  {% set state_temp = states('sensor.wallplug_lave_vaisselle_power') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # seche linge
  {% set state_temp = states('sensor.wallplug_seche_linge_power') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # four
  {% set state_temp = states('sensor.rt2_t7_puissance_four') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  # plaque induction
  {% set state_temp = states('sensor.rt2_t2_puissance_plaque_induction') %}
  {% if is_number(state_temp) %}
    {% set state = state + state_temp | float %}
  {% endif %}

  {{ state }}

Pourquoi ne pas utiliser une entrée/helper? Tu peux utiliser « Combiner l’état de plusieurs capteurs ».
Paramètres > Appareils et services Onglet Entrées

1 « J'aime »

Pour ce coup oui !!! Pas pensé
Mais j’en ai un autre à faire avec addition et soustraction…
EDIT : Du coup il faut vraiment que je vérifie, pour ne pas avoir d’erreur au démarrage de HA, le template étant évalué avant la mise à jour des capteurs « sources ». J’ai une erreur « unknown » dans certains au démarrage…

Salut,
pas besoin de verifier de le template, ta une option availability.

exemple:

      availability: "{{ states('sensor.xxxxxxxxx')|is_number"

ou

      availability:  "{{ states('sensor.xxxxxxxxx') not in ['unknown', 'unavailable', 'none'] }}"

pour plusieurs entités:

      availability: "{{ states('sensor.0x54ef4410004ea988_energy')|is_number and states('sensor.0x54ef4410005647e8_energy')|is_number and states('sensor.0xa4c138b1bfb7f7ef_energy')|is_number }}"

Salut,

Pour une addition ou une soustraction, il y a plus simple que le availabilty ou le is_number :

states('sensor.wallplug_cave_a_vin_electric_consumption_w')|float(0)

Le float se charge de trouver la valeur numérique, le 0 est là pour renvoyer un truc qui permet de faire l’opération mathématique…

Donc

state: >
  {{ states('sensor.wallplug_cave_a_vin_electric_consumption_w')|float(0) + states('sensor.wallplug_congel_garage_power')|float(0)+ states('sensor.wallplug_frigo_power')|float(0) + states('sensor.wallplug_lave_linge_power')|float(0) + states('sensor.wallplug_lave_vaisselle_power')|float(0) + states('sensor.wallplug_seche_linge_power'|float(0) }}

Doit parfaitement faire l’affaire

Euh oui pour le float. Mais si on a un état « unknown » ou autre texte, il fait quoi ?
Le float(0) renvoie 0 en cas d’autre chose qu’un nombre.
Du coup ça peut fausser les historiques…
Je préfererais faire le check is_number sur chaque valeur et ne pas évaluer ou aditionner si ce n’est pas un nombre…

ça renvoie 0

Ajouter 0 ou ne rien ajouter c’est pareil…
1+0+2+0+3 c’est pareil que 1+2+3
:sweat_smile:

Pour une addition oui mais quand on veut travailler sur les historiques ou les moyennes apres coup, ça fausse les analyses…

Oui c’est bien ce que je dis et c’est bien la cas ici => une simple addition

Après il n’y a rien d’obligatoire mais faire un template avec 5 x le combo set/is_number/if/somme, je trouve ça un peu lourd

Là effectivement on peut discuter… des moyennes sur un nombre de valeurs variables, j’ai aussi du mal : comparer la moyenne obtenu avec 3 valeurs et obtenue avec 5 valeurs dans le même template, je ne suis pas certain que ce soit pertinent. Et puis quand tout le monde est à 0 ou unknown, ça ne veut carrément plus rien dire si on les exclues

OK
C’est lourd mais du coup je préfère checker comme ça. Au moins pas de sujet et les capteurs sous jacents ne sont pas rafraichis tant que le capteur n’es pas available

 availability:   "{{ states('sensor.piscine_puissance')        | is_number and 
                            states('sensor.electromenager_puissance') | is_number and
                            states('sensor.eclairage_puissance')      | is_number and
                            states('sensor.domotique_puissance')      | is_number and
                            states('sensor.eau_chaude_puissance')     | is_number and
                            states('sensor.chauffage_puissance')      | is_number 
                        }}"

@Loic69 je crois que tu as une coquille dans ton 1er post:

« ET bloquer le calcul » j’imagine?

As-tu souvent tes sensor qui ne fonctionnent pas? Car c’est un problème il faut peut-être se concentrer pour trouver une solution pour celui ci? :slight_smile:

J’ai corrigé mon poste initial. Oui coquille.

1 « J'aime »

Non ! Heuresement
Mais quand des templates sont basées sur des entités provenant d’intégration, il peut arriver que les intégrations fournissent au démarrage ou dans certains cas des valeurs éronnées ou des unvailable… Au moins c’est propre avec la propriété availability

1 « J'aime »