Petit recueil de manipulations Jinja

Hello,

ça fait quelque temps que je stocke mes diverses expérimentations en Jinja, et il était temps de les partager :slight_smile:

Mais surtout, n’hésitez pas à manger la doc, elle est vraiment de mieux en mieux faite et de plus en plus complète !

Afficher toutes les entités des domaines 'light' et 'switch' d'une pièce
{# Parcours toutes les entités de la zone bureau, puis les filtre par domaine #}
{% for myElt in (expand(area_entities('bureau')) | selectattr('domain', 'in', ['switch', 'light'])) %}
  {{ myElt.entity_id }}
{% endfor %}

OU BIEN (même si je pense que la première version est plus performante) :

{# Parcours toutes les entités de domaine light ou switch, puis les filtre par la zone bureau #}
{% for myElt in ((states.light | list + states.switch | list) | selectattr('entity_id','in',area_entities('bureau'))) %}
  {{ myElt.entity_id }}
{% endfor %}
Afficher toutes les entités d'une pièce du domaine 'light'
{% set myEntities = (expand(area_entities('salon')) | selectattr('domain', 'eq', ('light'))) |list  %}
{% for myEntity in myEntities %}
  {{ myEntity.domain }} - {{ myEntity.entity_id }} - {{ myEntity.name }}
{% endfor %}
Jouer avec les pièces
{# Liste des pièces #}
{{ areas() }}
{# Nom de la pièce qui contient une entité #}
{{ area_name('climate.bureau') }} 
{# ID de la pièce qui contient une entité #}
{{ area_id('switch.prise_chauffage_sdb_bas') }} 
{# Liste des entities d'une pièce #}
{{ area_entities('salon') }}
Toutes les entités d'une intégration
{{ integration_entities('gree') }}
{# En filtrant sur les résultats #}
{{ integration_entities('versatile_thermostat') | select('match', 'climate') | list }}
Savoir si un élément est contenu dans une liste
{# Est-ce que "donald" est contenu dans la liste ['riri', 'fifi', 'loulou'] => Retourne un booléen #}
{{ ['riri', 'fifi', 'loulou'] | select('eq', 'donald') | list | count > 0 }}

Récupère toutes les entity d'un device à partir d'une des entity_id de ce device
{# entity_id => device_id => all devices entities #}
{{ expand(device_entities(device_id('climate.salon'))) }}
Récupère un entity_id 'soeur' au sein d'un device à partir d'un autre entity_id
{# ici, on part de 'sensor.humidite_bureau', on remonte aux entités du device "père", on recherche les entités qui commencent par "sensor.etat_batterie" et on retourne la première occurence #}
{{ device_entities(device_id('sensor.humidite_bureau')) | select('match', '^sensor.etat_batterie') | first }}
Lister toutes les entity_id contenues dans un groupe
{{ expand('group.climate_all') | map(attribute='entity_id') | list }}
Récupère le device id à partir d'un entity_id
{{ device_id('climate.salon') }}
Supprimer les éléments vides dans une liste
{{ ['bonjour', '', '', 'les', '', '', 'enfants'] | select('!=', '') | list }}
capitalize puis str_replace
{## Retourne "Riri et fifi" #}
{{ 'riri_et_fifi' | capitalize | replace('_', ' ') }}

En espérant que ça puisse aider du monde :pray: Et n’hésitez pas si vous avez des retours.

10 « J'aime »

Bonjour @titoumimi
Top, j’ajoute un peu de mon stock aussi.

Liste fenêtres ouvertes
{% set sensors = states.binary_sensor | selectattr('entity_id', 'search', 'binary_sensor.open') | selectattr('state', 'eq', 'on') | map(attribute='name') | list -%}
{%- if sensors | length > 0 -%}
Les fenêtres suivantes sont ouverts : {{ sensors | join(', ') }}
{%- else -%}
Aucune fenêtre actuellement ouverte.
{%- endif %}
Dernières automatisations exécutées
{% for state in (states.automation
   | selectattr('attributes.last_triggered', 'defined')
   | selectattr('attributes.last_triggered')
   | sort(attribute='attributes.last_triggered', reverse=true)) [0:4] -%}
  {{ state.attributes.last_triggered.timestamp()
  | timestamp_custom('%d/%m %H:%M:%S') }} : {{ state.name }}
{% endfor %}
Nombres de jours entre date et aujourd'ui avec texte
{% from 'easy_time.jinja' import custom_time_between %}
{% set nbjour = custom_time_between("2024-04-05 12:00:00", now() , 'day', language='fr') %}
Nb jours avec texte {{ nbjour  }}
Nombres de jours sans cigarettes
{% from 'easy_time.jinja' import count_the_days %}
{% set nb_jour = (count_the_days("2024-04-05 12:00:00") |int(0)) * -1 %}
Nb jours sans tabac -> {{ nb_jour }}
Economie réalisée ->  {{ (nb_jour * 10) - 60 }}
Nombres de lumière indispo / allumées dans un groupe

Nb Lumières
{% set lumiere_bas =expand('light.groupe_lumieres_bas') %}
Indisponible:
{{ lumiere_bas | selectattr('state', 'eq', 'unavailable')  | list | count}}
Allumée:
{{ lumiere_bas | selectattr('state', 'eq', 'on')  | list | count}}

Et je remercie HACF pour l’aide :wink:
Bob

2 « J'aime »

Pour ça il y a quand même easy-time et relative-time qui rendre les choses simples/traduites

1 « J'aime »

Bonjour @Pulpy-Luke
Oui c’est bien avec ça, suite à la lecture d’un de tes post :wink:

Bob

1 « J'aime »