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 (mas poderia ser qualquer um com controle infravermelho):

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): [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.

7 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…

Como coloco num package? Tentei colocar no configuration.yaml. Mas não sei exatamente onde colocar. Deu erro.

O meu está dando erro no broadlink_send…

Alguém pra ajudar?

Só me apresenta esse erro em todas as ações que tento realizar:

image

Tenho o broadlink totalmente funcional com os controles da tv e decodificador já configurados no HA…

Tenho uma fita de led, mas não é controlada pelo broadlink… é um aplicativo proprio “magic home”, tem como eu integrar essa fita de led direto no HA?

Esse comando broadlink.send é do home assistant dele, tem que ver qual é o seu no meu caso por exemplo é remote.send_command.

Pois é, j´tentei de tudo e sempre da erro…já até desistir de tentar rs

Estou ainda aprendendo, mas adaptei o seu código para comandar por mqtt.publish, pq uso um Hub IR com Tasmota. Funcionou perfeitamente, mas estou tendo dificuldades em portar para usar mais de uma fita no mesmo ambiente… Dupliquei a light no configuration.yaml e todos os scripts.
Deu certo em parte, consigo ligar a nova fita, mas não comanda corretamente, mudando inclusive da primerira fita.

Olá acredito que o problema está na própria natureza de um controle infravermelho. Ele não é endereçado como Wi-Fi, ele envia o comando e se algo qualquer receber recebeu. Quando você utiliza um controle remoto tradicional o infravermelho sai pela frente logo o comando vai onde você aponta, mas os hubs infravermelho são feitos pra enviar comando em todas direções para você poder usar um hub para vários dispositivos, logo ambas as fitas recebem o sinal infravermelho e mudam ao mesmo tempo.
Para solucionar isso você precisaria de um hub dedicado para cada fita, que tenha seu sinal direcionado a apenas essa fita. Eu diria que o jeito mais fácil seria simplesmente tampar a linha de visão de um hub para a outra fita. Mas a melhor solução mantendo infravermelho seria na minha opinião um esp8266 com um led infravermelho colada direto no receptor infravermelho da fita.

Outra opção seria controlar a fita direto com um esp removendo o controlador infravermelho mas essas leds geralmente são 5v ou 12v e os microcontroladores são 3.3V então precisaria de um circuitinho pra converter as tensões por isso manter o infravermelho é mais fácil.

Obrigado pelo trabalho

Consegui fazer tudo funcionar, mas gostaria de relatar alguns bugs:

  • depois de definir o branco, a mudança de cor não funciona (você tem que alterar a cor duas vezes, e se você tentar substituir o branco às vezes pisca com a cor que você tentou definir antes de colocar o branco)
  • a mudança de cor para laranja claro (a sudoeste do círculo de cores) não funciona
  • depois de reiniciar o assistente de casa os LEDs ficam sempre apagados (acho melhor manter o estado anterior)

Também deixo um vídeo que espero que esclareça os dois primeiros problemas (primeiro mostro o funcionamento normal, depois a mudança do branco que não funciona e depois a mudança para o laranja)
https://photos.google.com/share/AF1QipOGHcMq4_ZUqZo2aZt0HCZ-v6w2DBAZNLsvagxcpfN3iUiKRwY1v2bPrBF8SMRPfg/photo/AF1QipMQ_0V2waKDbyKvGrFkucNUMoqZngPonnD_n5z4?key=dWNPbmR5NnZrR0FFX1RnQTZZbWhoN2JQVFhyTm9B

desculpe, mas estou usando um tradutor

até hoje eu não consegui realizar esse tutorial…sempre da erro na hora de chamar o serviço :pensive:

Edit: Agora ele não acusa erro no serviço, porém não acontece nada quando ligo o botão…alguém sabe o que pode ser?

Edit2: Voltou dar falha no serviço…
Sem título

Finalmente o problema foi resolvido…

1 Like