Comandando várias lâmpadas através de um Light Template

Imagine a seguinte situação: Você tem uma luminária na sua sala com duas ou mais lâmpadas led RGB e quer controlar todas ao mesmo tempo pelo Home Assistant. Você pode recorrer a diversas automações para que as demais lâmpadas sejam atualizadas a partir do status de uma primeira, mas isso fica muito mais fácil utilizando o Light Template.

Documentação da integraação Template Light:

Para demonstrar vamos criar um light template para representar uma luminária da sala que possui duas lâmpadas físicas que são as entidades:

  • Lâmpada 1: light.led_sala_1
  • Lâmpada 2: light.led_sala_2

Segue o código com comentários do template, é necessário incluir este código no seu arquivo de configuração do Home Assistant (configuration.yaml).

light:
  - platform: template
	  luz_sala: #ID da entidade modelo
		friendly_name: "Luzes Sala" #Nome da entidade modelo
		#Status da lâmpada criada pela entidade de modelo
		#Neste caso ele verifica se a lâmpada 1 está disponível, 
		#se estiver utiliza o status da lâmpada 1, senão utiliza o status da lâmpada 2
        value_template: >-
          {% if (is_state('light.led_corredor','on') or is_state('light.led_quarto_2','on')) %}
            {{ 'on' }}
          {% else %}
            {{ 'off' }}
          {% endif %}
		#Verifica se os dispositivos estão disponíveis
		availability_template: >-
		  {% if (states('light.led_sala_2')!='unavailable' and states('light.led_sala_2')!='unknow') %}
			{{ true }}
		  {% elif (states('light.led_sala_1')!='unavailable' and states('light.led_sala_1')!='unknow') %}
			{{ true }}
		  {% else %}
			{{ false }}
		  {% endif %}
		#Usa o brilho da lâmpada 1 como referência para a entidade modelo, se disponível, senão usa a da lâmpada 2
		level_template: >-
		  {% if (states('light.led_sala_2')!='unknow') and (states('light.led_sala_2')!='unavailable') %}
			{{ state_attr('light.led_sala_2', 'brightness') | int }}
		  {% else %}
			{{ state_attr('light.led_sala_1', 'brightness') | int }}
		  {% endif %}          
		# Usa a temperatura de cor da lâmpada 1 como referência para a entidade de modelo, se disponível, senão usa a da lâmpada 2
		temperature_template: >-
		  {% if (states('light.led_sala_2')!='unknow') and (states('light.led_sala_2')!='unavailable') %}
			{{ state_attr('light.led_sala_2', 'color_temp') }}
		  {% else %}
			{{ state_attr('light.led_sala_1', 'color_temp') }}
		  {% endif %}
		# Usa a cor da lâmpada 1 como referência para a entidade de modelo, se disponível, senão usa a da lâmpada 2
		color_template: >-
		  {% if (states('light.led_sala_2')!='unknow') and (states('light.led_sala_2')!='unavailable') %}
			{{ state_attr('light.led_sala_2', 'hs_color')}}
		  {% else %}
			{{ state_attr('light.led_sala_1', 'hs_color')}}
		  {% endif %}
		turn_on: #Ação a ser executada quando ligar a entidade de modelo
		  #Chama o serviço light.turn_on e liga as entidades das lâmpadas físicas
		  - service: light.turn_on
			data_template:
			  entity_id:
				- light.led_sala_1
				- light.led_sala_2
		turn_off: #Ação a ser executada quando desligar a entidade de modelo
		  #Chama o serviço light.turn_off e desliga as entidades das lâmpadas físicas
		  - service: light.turn_off
			data_template:
			  entity_id: 
				- light.led_sala_1
				- light.led_sala_2
		set_level: #Ação a ser executada quando alterar o brilho da entidade de modelo
		  #Chama o serviço light.turn_on e define o brilho das entidades das lâmpadas físicas com base na entidade modelo
		  - service: light.turn_on
			data_template:
			  entity_id: 
				- light.led_sala_1
				- light.led_sala_2
			  brightness: "{{ brightness }}" #Define o brilho de acordo com o definido na entidade de modelo
		  - service: input_boolean.toggle
			entity_id: input_boolean.bright_boolean
		set_temperature: #Ação a ser executada quando alterar a temperatura de cor da entidade de modelo
		  #Chama o serviço light.turn_on e a temperatura de cor das entidades das lâmpadas físicas com base na entidade modelo
		  - service: light.turn_on
			data_template:
			  effect: "White" #Aqui define o efeito da lâmpada para branco (necessário para alguns modelos de lâmpadas)
			  entity_id:
				- light.led_sala_1
				- light.led_sala_2
			  color_temp: "{{ color_temp }}" #Define a temperatura de cor de acordo com a entidade de modelo
		  - service: input_boolean.toggle
			entity_id: input_boolean.temp_boolean
		set_color: #Ação a ser executada quando alterar a cor da entidade de modelo
		  - service: light.turn_on
			data_template:
			  effect: "Color"
			  hs_color: #Define a cor de acordo com a entidade de modelo
				- "{{ h }}"
				- "{{ s }}"
			  entity_id:
				- light.led_sala_1
				- light.led_sala_2
		  - service: input_boolean.toggle
			entity_id: input_boolean.color_boolean
		supports_transition_template: "{{ true }}"

Após incluir o código acima na configuração e alterar as entidades das lâmpadas físicas, recarregue as entidades de modelo (Configurações > Controle do Servidor > Recarregar as entidades de modelo) ou reinicie o Home Assistant.

A partir daí a nova entidade estará disponível, teste a vontade!

É possível usar outras ações para os eventos (turn_on, turn_off, etc) pode acionar switchs, scripts, etc.

2 curtidas

Por que utilizar um template em vez de um group?

Quase nenhuma diferença, mais uma forma de fazer a mesma coisa.

Porém com o template você pode comandar outros dispositivos que não sejam do domínio light (o que não é possível nos lights groups), por exemplo, as entidades switchs que comumente são usadas com iluminação também ou qualquer outra ação via serviços ou scripts.

Nunca tinha visto template ser usado dessa maneira mas realmente achei esse aspecto de poder controlar outros dispositivos sem criar uma automação realmente interessante, tipo abrir uma cortina quando a luz tiver apagada e fechar quanto estiver acesa.

Agora se for só para agrupar luzes o group me parece mais fácil de usar pois switches podem ser convertidos para lights:

1 curtida