Olá galera! Meu primeiro post! Pesquisei na internet e não achei ninguém falando sobre isto. Então, fiz eu mesmo minha solução.
Meu caso: comprei uma fita de LED colorida. Era na época a opção mais barata (já que comprei para testar, sem destino específico). Ela vem com um controlezinho destes genéricos. Mais precisamente este produto aqui (mas poderia ser qualquer um com controle infravermelho):
O produto está neste link: 0.5/1/2/3/4/5m smd5050 rgb led strip lamp bar tv backlilghting kit + usb remote control dc5v Sale - Banggood.com sold out-arrival notice-arrival notice
Vamos então para a solução!
Pré-requisito: ter algum broadlink configurado, integrado com o HA com a integração padrão.
A primeira coisa que fiz foi clonar todos os códigos do meu controle. Caso meu código não funcione para você, talvez seja necessário que você também o faça e substitua os valores (caso o controle seja de outro fabricante).
Depois, basta criar uma lâmpada do tipo template. Assim podemos “brincar” com uma lampada completa, independente da “engrenagem” que a faça funcionar por trás.
Configurei uma nova light com este código (configuration.yaml, dentro de “light:”)
- platform: template
lights:
led_sala:
friendly_name: "LED Sala"
turn_on:
service: script.led_liga
turn_off:
service: script.led_desliga
set_level:
service: script.led_setbrilho
data_template:
brightness: "{{ brightness }}"
set_color:
- service: input_number.set_value
data_template:
value: "{{ h }}"
entity_id: input_number.h_input
- service: input_number.set_value
data_template:
value: "{{ s }}"
entity_id: input_number.s_input
Este código vai chamar um script para ligar e outro para desligar. Para o brilho também vai chamar um script, mas vai passar esta variável “brightness” como parâmetro. Para as cores, o HA tem uma “bolinha” de seleção de cores. Girando pelas bordas, vamos passar por 24 opções de cores. Se parar em uma cor e “entrar”, temos as suas variações mais claras até atingir o branco ao centro. Percebi, por acaso, que o espectro de cores que ele segue é também a mesma sequencia de cores do meu controle (de cima para baixo, da esquerda para a direita). Daí foi só relacionar as 24 possibilidades de cores do HA (cada uma em um ângulo, de 0 a 360) com as 15 possibilidades de cores do meu controle.
Para auxiliar e pegar as cores precisei de 5 input_number, para guardar temporariamente os cálculos. (em configuration.yaml)
input_number:
h_input:
min: 0
max: 360
s_input:
min: 0
max: 100
led_brilho_atual:
min: 0
max: 255
led_brilho_destino:
min: 0
max: 255
led_brilho_diferenca:
min: -255
max: 255
Agora, meus scripts. Inicialmente, os scripts que clonam o controle remoto (dentro de script: no configuration.yaml): [ATUALIZADO 2021]
led_liga:
alias: Ligar
sequence:
- data:
command:
- JgBYAAABMZMVERURFRAVERURFRAUEhQSFTUVNRQ2FTUWEBQ2FjUUNhU1FTUVERQSFBEVERURFREUERQSFDYVNRU2FTUVNRQ2FQAFRQABMUgVAAxhAAEwSBUADQU=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_desliga:
alias: Desligar Led
sequence:
- data:
command:
- JgBYAAABMJMVEBURFRAUEhURFBEVERUQFTUVNRU1FTYVEBQ2FjUVNRURFTUVERQSFRAVERUQFREVNRUQFTUUNhY1FTUVNRU1FQAFRQABLkkVAAxhAAEwSRUADQU=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_brilhomais:
alias: Brilho +
sequence:
- data:
command:
- JgBQAAABLpMVEBQSFRAVERQRFREVEBQSFTUVNRU1FDYUERU1FTUVNRQSFBEUEhUQFBIUERQSFRAVNRU1FTUUNhU1FTUVNRU1FQAFRgABLUkVAA0FAAAAAAAAAAA=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_brilhomenos:
alias: Brilho -
sequence:
- data:
command:
- JgBQAAABLpMVEBURFBEVERQRFRETEhURFDUVNRU1FDYVERQ2FDYUNhQ2FREUERUQFREUERURFBEVERU1FDYVNRU1FDYUNhQ2FQAFRgABLkgVAA0FAAAAAAAAAAA=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_branco:
alias: Branco
sequence:
- data:
command:
- JgBYAAABLpQUERQSFBEVERQRFBIVEBURFDYUNhQ2FTUUEhQ2FDYVNRQ2FDYVNRURFBEUEhUQFREVEBQSFRAUNhQ3FDYUNhQ2FAAFRwABLkkUAAxjAAEuSBUADQU=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_strobe:
alias: Strobe
sequence:
- data:
command:
- JgBYAAABLpMVEBYQFRAUEhUQFREVEBURFTUVNRU1FTUVEBQ2FDYUNhQ2FDYVNRU1FREVEBQSFRAVERUQFREVEBU1FDYVNRU1FQAFRgABLUkVAAxiAAEtSRUADQU=
service: remote.send_command
target:
entity_id: remote.bl_sala_remote
led_fade:
alias: Fade
sequence:
- data:
command:
- JgBQAAABLZQUERQSFRAUEhUQFREUERURFDYVNRU1FTUVEBQ2FTUVNRU1FTUVERQRFDYVERQRFREVEBQSFTUUNhUQFDYVNRQ2FAAFRwABLkgVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor1:
alias: Cor 1
sequence:
- data:
command:
- JgBQAAABMpIWERQSFBEUFRESFBIVERURFTUVNRU1FTUUEhU1FDYVNRQSFBEUNhQSFBEUEhQSFBEVNRU1FBIVNRQ2FTUVNRU1FQAFRQABLkkVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor2:
alias: Cor 2
sequence:
- data:
command:
- JgBQAAABMJMVERUQFREUEhQSFBEVERQSFTUUNhU1FDYUEhU1FTUVNhUQFhAVERU1FBIUERURFREVNRQ2FTUVERU1FTUVNRQ2FQAFRgABL0kUAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor3:
alias: Cor 3
sequence:
- data:
command:
- JgBQAAABNJMVEhQQFhEUEhQRFREVEBQSFTUVNRQ3FDYUEhQ2FDYUNhQSFBIUNhQ2FBMTERURFREUNhU1FREUERU2FDAaNhQ2FQAFRQABMUkUAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor4:
alias: Cor 4
sequence:
- data:
command:
- JgBQAAABL5QVERURFBEVERURFBEVERURFDYVNRU1FTUVERU1FTUVNRQSFREVEBURFTUUEhUQFBIUNhQ2FjUUNhURFDYUNhU1FgAFMQABMkgVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor5:
alias: Cor 5
sequence:
- data:
command:
- JgBQAAABMpMWERURFBIVEBYQFREUEhUQFTYVNRU1FTYUEhY0FTYVNRURFREVNRURFDYVERUQFREUNhU1FREUNhURFTUVNRU1FQAFRAABMEkUAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor6:
alias: Cor 6
sequence:
- data:
command:
- JgBQAAABLpMVERUQFBIUERURFRAVERQRFDYVNRU2EzcUERU1FTUUNhU1FREVNRURFBEUEhQRFREUEhU1FBEUNhU1FDYUNxQ2FAAFRgABL0kVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor7:
alias: Cor 7
sequence:
- data:
command:
- JgBQAAABMJMUERQSFBIVEBQSFREUERURFDYVNRU1FDYVERQ2FTUUNhU1FREVERQ2FRAWEBURFBEUEhQ2FTUUEhQ2FTUVNRQ2FQAFRQABMUkUAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor8:
alias: Cor 8
sequence:
- data:
command:
- JgBQAAABMJIUERQSFBIUERQSFBIUERURFDYUNhU1FjUUERY1FTUUNhU1FBIVNRU1FREVERUQFBIVEBU1FREVERU1FTUVNRU2FQAFOQABL0kVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor9:
alias: Cor 9
sequence:
- data:
command:
- JgBQAAABMJMUERQSFBEVERQRFREVEBURFDYVNRU1FTUVERU1FTUUNhQ1FhAUEhQSFDYUEhQSFRAVERQ2FTUVNhUQFTUVNRU2FQAFPgABL0oVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor10:
alias: Cor 10
sequence:
- data:
command:
- JgBQAAABL5MVERQSFRAVERURFBEUEhURFDYUNhU1FDYUERU1FDcUNhQ2FBEVNRURFTUUERURFREVEBU1FREVNRQSFDYVNRU1FAAFOQABL0gVAA0FAAAAAAAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor11:
alias: Cor 11
sequence:
- data:
command:
- JgBYAAABLZQVERUQFBIVEBURFRAVERUQFTUVNRU2FDYVEBU1FTUUNhURFTUUNhUQFREVEBURFRAVNRQSFRAUNhU1FDYVNhQ2FQAFRgABL0cVAAxXAAEuSBUADQU=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor12:
alias: Cor 12
sequence:
- data:
command:
- JgBYAAABL5MUEhUQFREUEhUQFREVEBQSFDYWNBQ2FjUUERU1FDYUNhQSFDYUERU1FBIUEhQRFREVNRUQFDYVERU1FDYVNhQ2FQAFQQABL0kUAAxUAAEuSRUADQU=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor13:
alias: Cor 13
sequence:
- data:
command:
- JgBYAAABMJMVERQSFRAVERUQFhAVERQRFTUUNhU1FTYVEBU1FTYVNRUQFTYUNhU1FREVEBURFBEUNhURFRAVERU1FTUVNRU1FAAFPgABMUgUAAxHAAEwSBYADQU=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor14:
alias: Cor 14
sequence:
- data:
command:
- JgBUAAABL5QVERQRFREVERUQFREUEhQRFDYVNRU1FDYVERU1FDYVNRURFDYVEBURFTUVEBURFRAVNRURFDYVNRURFTUVNRU1FQAFRgABLkkUAAiyCwANBQAAAAA=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
led_cor15:
alias: Cor 15
sequence:
- data:
command:
- JgBYAAABLpMVERURFBEVERQRFBIVEBURFTUVNRU1FDYVERQ2FDYVNRUQFDYVNRURFTUVERMSFREVNRQRFREVNRUQFTUUNhU2FAAFRwABLkkUAAxVAAEuSRUADQU=
service: broadlink.send
target:
entity_id: remote.bl_sala_remote
Pronto! Agora falta o último script, para processar o brilho. eu contei que para sair do brilho mais baixo até o mais alto, pelo controlezinho remoto, são necessários 25 “cliques”. E o range do HA é 255. Então, abreviei dividindo o resultado por 10. Por exemplo, se o brilho estava em 200 e a pessoa aumentou para 250 eu calculei a diferença, 50. Daí dividi por 10. Deu 5. Ou seja, o HA vai enviar 5 vezes o botão de aumentar brilho. Se der negativo é porque está diminuindo, então envio o outro botão (de diminuir brilho). Tem um delay de dois segundos para evitar algum erro. Segue o último script:
led_setbrilho:
alias: Define Brilho
sequence:
- service: input_number.set_value
data_template:
entity_id: input_number.led_brilho_destino
value: '{{ brightness }}'
- delay: 00:00:01
- service: input_number.set_value
data_template:
entity_id: input_number.led_brilho_diferenca
value: "{{ (((states('input_number.led_brilho_destino')|int) - (states('input_number.led_brilho_atual')|int))/10)|int }}"
- delay: 00:00:01
- service: input_number.set_value
data_template:
entity_id: input_number.led_brilho_atual
value: '{{ brightness }}'
- choose:
- conditions:
- condition: numeric_state
entity_id: input_number.led_brilho_diferenca
above: 0
sequence:
repeat:
count: "{{ states('input_number.led_brilho_diferenca')|int }}"
sequence:
- service: script.led_brilhomais
- conditions:
- condition: numeric_state
entity_id: input_number.led_brilho_diferenca
below: 0
sequence:
repeat:
count: "{{ (states('input_number.led_brilho_diferenca')|int) * (-1) }}"
sequence:
- service: script.led_brilhomenos
Por fim, preciso de algumas automações para as cores. Eu rastreei o raio input_number.h_input e a profundidade (s_input) e fiz automações para trocar as cores de acordo com a melhor aproximação. Seguem as automações (configuration.yaml na opção automation:)
- alias: 'LED Cor 1'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 344
- platform: numeric_state
entity_id: input_number.h_input
below: 16
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor1
- alias: 'LED Cor 2'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 59
below: 61
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor2
- alias: 'LED Cor 3'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 59
below: 61
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor3
- alias: 'LED Cor 4'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 74
below: 76
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor4
- alias: 'LED Cor 5'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 89
below: 106
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor5
- alias: 'LED Cor 6'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 119
below: 151
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor6
- alias: 'LED Cor 7'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 164
below: 166
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor7
- alias: 'LED Cor 8'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 179
below: 181
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor8
- alias: 'LED Cor 9'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 194
below: 196
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor9
- alias: 'LED Cor 10'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 209
below: 211
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor10
- alias: 'LED Cor 11'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 224
below: 241
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor11
- alias: 'LED Cor 12'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 254
below: 256
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor12
- alias: 'LED Cor 13'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 269
below: 271
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor13
- alias: 'LED Cor 14'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 284
below: 286
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor14
- alias: 'LED Cor 15'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.h_input
above: 299
below: 331
condition:
- condition: numeric_state
entity_id: input_number.s_input
above: 15
action:
- service: script.turn_on
entity_id: script.led_cor15
- alias: 'LED Cor Branco'
initial_state: on
trigger:
- platform: numeric_state
entity_id: input_number.s_input
below: 15
action:
- service: script.led_branco
Espero que seja útil para alguém! Se tiverem alguma dica de como melhorar, me avisem.