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:
O produto está neste link: https://www.banggood.com/0_512345M-SMD5050-RGB-LED-Strip-Lamp-Bar-TV-Back-Lighting-Kit-USB-Remote-Control-DC5V-p-1135234.html
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):
led_liga:
alias: Ligar Led
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABMZMVERURFRAVERURFRAUEhQSFTUVNRQ2FTUWEBQ2FjUUNhU1FTUVERQSFBEVERURFREUERQSFDYVNRU2FTUVNRQ2FQAFRQABMUgVAAxhAAEwSBUADQU=
service: broadlink.send
led_desliga:
alias: Desligar Led
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABMJMVEBURFRAUEhURFBEVERUQFTUVNRU1FTYVEBQ2FjUVNRURFTUVERQSFRAVERUQFREVNRUQFTUUNhY1FTUVNRU1FQAFRQABLkkVAAxhAAEwSRUADQU=
service: broadlink.send
led_brilhomais:
alias: Brilho +
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABLpMVEBQSFRAVERQRFREVEBQSFTUVNRU1FDYUERU1FTUVNRQSFBEUEhUQFBIUERQSFRAVNRU1FTUUNhU1FTUVNRU1FQAFRgABLUkVAA0FAAAAAAAAAAA=
service: broadlink.send
led_brilhomenos:
alias: Brilho -
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABLpMVEBURFBEVERQRFRETEhURFDUVNRU1FDYVERQ2FDYUNhQ2FREUERUQFREUERURFBEVERU1FDYVNRU1FDYUNhQ2FQAFRgABLkgVAA0FAAAAAAAAAAA=
service: broadlink.send
led_branco:
alias: Branco
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABLpQUERQSFBEVERQRFBIVEBURFDYUNhQ2FTUUEhQ2FDYVNRQ2FDYVNRURFBEUEhUQFREVEBQSFRAUNhQ3FDYUNhQ2FAAFRwABLkkUAAxjAAEuSBUADQU=
service: broadlink.send
led_strobe:
alias: Strobe
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABLpMVEBYQFRAUEhUQFREVEBURFTUVNRU1FTUVEBQ2FDYUNhQ2FDYVNRU1FREVEBQSFRAVERUQFREVEBU1FDYVNRU1FQAFRgABLUkVAAxiAAEtSRUADQU=
service: broadlink.send
led_fade:
alias: Fade
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABLZQUERQSFRAUEhUQFREUERURFDYVNRU1FTUVEBQ2FTUVNRU1FTUVERQRFDYVERQRFREVEBQSFTUUNhUQFDYVNRQ2FAAFRwABLkgVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor1:
alias: Cor 1
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMpIWERQSFBEUFRESFBIVERURFTUVNRU1FTUUEhU1FDYVNRQSFBEUNhQSFBEUEhQSFBEVNRU1FBIVNRQ2FTUVNRU1FQAFRQABLkkVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor2:
alias: Cor 2
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMJMVERUQFREUEhQSFBEVERQSFTUUNhU1FDYUEhU1FTUVNhUQFhAVERU1FBIUERURFREVNRQ2FTUVERU1FTUVNRQ2FQAFRgABL0kUAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor3:
alias: Cor 3
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABNJMVEhQQFhEUEhQRFREVEBQSFTUVNRQ3FDYUEhQ2FDYUNhQSFBIUNhQ2FBMTERURFREUNhU1FREUERU2FDAaNhQ2FQAFRQABMUkUAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor4:
alias: Cor 4
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABL5QVERURFBEVERURFBEVERURFDYVNRU1FTUVERU1FTUVNRQSFREVEBURFTUUEhUQFBIUNhQ2FjUUNhURFDYUNhU1FgAFMQABMkgVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor5:
alias: Cor 5
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMpMWERURFBIVEBYQFREUEhUQFTYVNRU1FTYUEhY0FTYVNRURFREVNRURFDYVERUQFREUNhU1FREUNhURFTUVNRU1FQAFRAABMEkUAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor6:
alias: Cor 6
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABLpMVERUQFBIUERURFRAVERQRFDYVNRU2EzcUERU1FTUUNhU1FREVNRURFBEUEhQRFREUEhU1FBEUNhU1FDYUNxQ2FAAFRgABL0kVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor7:
alias: Cor 7
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMJMUERQSFBIVEBQSFREUERURFDYVNRU1FDYVERQ2FTUUNhU1FREVERQ2FRAWEBURFBEUEhQ2FTUUEhQ2FTUVNRQ2FQAFRQABMUkUAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor8:
alias: Cor 8
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMJIUERQSFBIUERQSFBIUERURFDYUNhU1FjUUERY1FTUUNhU1FBIVNRU1FREVERUQFBIVEBU1FREVERU1FTUVNRU2FQAFOQABL0kVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor9:
alias: Cor 9
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABMJMUERQSFBEVERQRFREVEBURFDYVNRU1FTUVERU1FTUUNhQ1FhAUEhQSFDYUEhQSFRAVERQ2FTUVNhUQFTUVNRU2FQAFPgABL0oVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor10:
alias: Cor 10
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBQAAABL5MVERQSFRAVERURFBEUEhURFDYUNhU1FDYUERU1FDcUNhQ2FBEVNRURFTUUERURFREVEBU1FREVNRQSFDYVNRU1FAAFOQABL0gVAA0FAAAAAAAAAAA=
service: broadlink.send
led_cor11:
alias: Cor 11
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABLZQVERUQFBIVEBURFRAVERUQFTUVNRU2FDYVEBU1FTUUNhURFTUUNhUQFREVEBURFRAVNRQSFRAUNhU1FDYVNhQ2FQAFRgABL0cVAAxXAAEuSBUADQU=
service: broadlink.send
led_cor12:
alias: Cor 12
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABL5MUEhUQFREUEhUQFREVEBQSFDYWNBQ2FjUUERU1FDYUNhQSFDYUERU1FBIUEhQRFREVNRUQFDYVERU1FDYVNhQ2FQAFQQABL0kUAAxUAAEuSRUADQU=
service: broadlink.send
led_cor13:
alias: Cor 13
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABMJMVERQSFRAVERUQFhAVERQRFTUUNhU1FTYVEBU1FTYVNRUQFTYUNhU1FREVEBURFBEUNhURFRAVERU1FTUVNRU1FAAFPgABMUgUAAxHAAEwSBYADQU=
service: broadlink.send
led_cor14:
alias: Cor 14
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBUAAABL5QVERQRFREVERUQFREUEhQRFDYVNRU1FDYVERU1FDYVNRURFDYVEBURFTUVEBURFRAVNRURFDYVNRURFTUVNRU1FQAFRgABLkkUAAiyCwANBQAAAAA=
service: broadlink.send
led_cor15:
alias: Cor 15
sequence:
- data:
host: !secret ip_centralbl
packet:
- JgBYAAABLpMVERURFBEVERQRFBIVEBURFTUVNRU1FDYVERQ2FDYVNRUQFDYVNRURFTUVERMSFREVNRQRFREVNRUQFTUUNhU2FAAFRwABLkkUAAxVAAEuSRUADQU=
service: broadlink.send
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.