Hola gente!
Aprovechando que tuve que revisar por qué se me estaban calculando mal la cantidad de luces encendidas que aparecen en el tablero del celular, quise dejar por acá una breve explicación de qué son YAML y Jinja2, y cómo se pueden usar juntos en Home Assistant.
Cuando recién empecé con Home Assistant, rápidamente me encontré con las plantillas o con la necesidad de editar el famoso configuration.yaml. Ahí uno se empieza a preguntar:
¿Qué significan esos símbolos raros como {{ }} y {% %}?
¿Qué es YAML?
YAML (Yet Another Markup Language) es el formato que usa Home Assistant para configurar sensores, automatizaciones, scripts, etc.
Es lo que está “detrás” de muchos elementos que también puedes configurar desde la interfaz gráfica, pero con mucha más flexibilidad.
¿Qué es Jinja2?
Jinja2 es el lenguaje de plantillas que permite usar lógica dentro del YAML.
Se usa principalmente en value_template: para generar valores dinámicos.
Tiene dos tipos de bloques:
• {{ ... }} → para mostrar valores.
• {% ... %} → para hacer lógica (condiciones, ciclos, variables, etc).
Ejemplo práctico: contar luces encendidas
Quería contar y mostrar cuántas luces están encendidas en mi casa, excluyendo controladores LED o interruptores siempre activos, e incluyendo algunos enchufes inteligentes específicos que uso para lámparas.
Aquí va un ejemplo real de un sensor:
- platform: template
sensors:
cantidad_luces_encendidas:
unique_id: "cantidad_luces_encendidas"
friendly_name: "Cantidad Luces/Enchufes Encendidos"
value_template: >-
{% set luces = states.light
| selectattr('attributes.entity_id', 'undefined')
| selectattr('state', 'eq', 'on')
| rejectattr('attributes.friendly_name', 'search', 'WLEDCocina01')
| list
%}
{% set luces_extra = [
states.light.wledcocina01_principal
] | selectattr('state', 'eq', 'on') | list %}
{% set switches_incluir = [
'switch.lampara_sala_enchufe_1'
] %}
{% set enchufes = states.switch
| selectattr('entity_id', 'in', switches_incluir)
| selectattr('state', 'eq', 'on')
| list
%}
{{ luces | count + luces_extra | count + enchufes | count }}
¿Qué hace cada parte?
- states.light obtiene todas las luces del sistema.
- selectattr(‘state’, ‘eq’, ‘on’) filtra las que están encendidas.
- rejectattr(…) descarta luces “fantasma”, que en mi caso no son directamente luces, pero están encendidos siempre como el driver WLED. Esto tiene un efecto indeseado y es que no cuenta la cinta LED “real”, lo que se resuelve en el punto siguiente.
- states.light.wledcocina01_principal se incluye forzadamente si está encendida.
- states.switch permite incluir ciertos enchufes inteligentes específicos.
- Todo se suma con count.
En mi caso uso el valor retornado y que muestre el número de luces encendidas en el tablero que tengo para el celular.
