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.

4 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ó.