[Résolu] 2 petits codes qui ne fonctionnent plus

Bonjour,

Je me suis rendu compte que j’avais 2 petits bouts de code qui ont très bien fonctionnés pendant bien des lunes qui désormais renvoyaient des erreurs. J’ai très certainement du rater le fait qu’une mise à jour de HA les rendait obsolètes d’une façon ou d’une autre mais je ne saurais dire laquelle… Tout simplement parce que ce sont des scripts de « monitoring » donc pas vraiment le truc qu’on vérifie au quotidien.

BREF, si vous pouviez jeter un oeil et m’aider à les adapter, ce serait vraiment bien sympathique.

Je me permet de mettre 2 soucis dans un topic, désolé d’avance si ça dérange :expressionless:

premier bout de code

C’est un filtre dans une custom-card type bar-card qui me renvoie le pourcentage de batterie des capteurs:

    {% for item in states.sensor  |
    selectattr('attributes.device_class','==','battery') %}
      {{ item.entity_id }}
    {% endfor %}

Il m’affiche tous mes sensors avec une batterie à 100% et ça n’est pas le cas. Quand je le copie dans les outils de développement, ça me renvoie l’erreur suivante :

UndefinedError: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'device_class'

Je comprends bien le sens de l’erreur mais du coup, je n’ai aucune idée comment mettre à jour ce code :expressionless:

deuxième bout de code [RESOLU]

Assez similaire sur le but que le premier mais avec une finalité toute autre. C’est un code récupéré par ici d’ailleurs je crois, une automation pour alerter quand les batteries des capteurs descendent sous un seuil (25% dans mon cas) :

{%- set threshold = 25 -%} {%- for item in states 
    if (item.attributes.battery_level is defined and 
        item.attributes.battery_level | int < threshold) or
        ("battery" in item.name | lower and "temperature" not in item.name | lower and
         ((item.state | int < threshold and item.state|int != 0) or 
           item.state | lower == "low" or 
           item.state | lower == "unknown"))-%}
    {%- if loop.first -%} {{ true }} {%- endif -%}
{%- endfor -%}

Ici, l’erreur retournée dans les outils de dev est :

ValueError: Template error: int got invalid input 'off' when rendering template '{%- set threshold = 25 -%} {%- for item in states 
    if (item.attributes.battery_level is defined and 
        item.attributes.battery_level | int < threshold) or
        ("battery" in item.name | lower and "temperature" not in item.name | lower and
         ((item.state | int < threshold and item.state|int != 0) or 
           item.state | lower == "low" or 
           item.state | lower == "unknown"))-%}
    {%- if loop.first -%} {{ true }} {%- endif -%}
{%- endfor -%}' but no default was specified

Merci d’avance pour vos lumières et votre aide.

Belle journée

Ma configuration


System Information

version core-2022.8.7
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.5
os_name Linux
os_version 5.15.32-v8
arch aarch64
timezone Europe/Zurich
config_dir /config

Home Assistant Supervisor

host_os Home Assistant OS 8.5
update_channel stable
supervisor_version supervisor-2022.08.5
agent_version 1.2.1
docker_version 20.10.14
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok

Bonjour,
Pour ta 2eme erreur, il faut depuis (3 ou 4 mois), mettre une valeur par défaut pour ton |int dans le cas où il y a pas de remonter d’information de ton capteur.

bonjour,
pour la première erreur essai

    {% for item in states.sensor  
            | selectattr('attributes.device_class', 'defined') 
            | selectattr('attributes.device_class', 'eq', 'battery')  %}
      {{ item.entity_id }}
    {% endfor %}

il faut d’abord filtrer les éléments qui ont un device_class définis avant de rechercher ceux qui ont device_class battery

Ok, merci. Comme mes batteries sont loin d’être dans les critères d’alerte, je ne m’étais pas inquiété de ne pas avoir de notif donc en effet, ça peut durer depuis un moment que ce code soit obsolète. Et concrètement je lui passe ça comment ? | int(0) ?

Je viens d’essayer ça et ça semble ok. MERCI beaucoup ! Une de résolue !

Ça fonctionnait sans pourtant jusque là. Je vais essayer, merci ! :wink: