Fita de LED com controle Infravermelho + Broadlink + HA

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.

5 Likes

Obrigado @aribarreto pelo post… serviu perfeitamente na minha.
Uma sugestão para quem for usar…é colocar tudo num package… assim fica tudo num arquivo só.

Revivendo aqui, ainda funcional?
To pensando em tentar o mesmo aqui, só que não entendo muito bem onde vão todos os códigos e etc…