Añadiendo funcionalidades a WLED en Home Assistant

Una de las características mas curiosas de wled es que genera una pagina en /liveview que nos hace una previsualizacion de como estan las tiras de los leds en funcion del efecto y de la paleta de colores

La pagina quedaria asi en el navegador

Insertaremos esta pagina en una card view con un iframe , pero con la particularidad que solo puede displayar paginas https , por ello tendremos que crear un subdominio para cada uno de los controladores y de esta forma acceder por https , vamos que si no es así no hay otra forma por muchas vueltas que le he dado , https si o si !!!!

Empezaremos modificando nuestro fichero dyn-config.yml y añadiendo dos services en nuestro fichero

    xxxxxxxxxarbolyyyyyy:
      loadBalancer:
        servers:
          - url: "http://192.168.1.103"

    xxxxxxxxxbalconyyyyyy:
      loadBalancer:
        servers:
          - url: "http://192.168.1.104"

En ese mismo fichero añadiremos dos routers

    xxxxxxxxxbalconyyyyyy-1-http-cloud:
      entryPoints:
        - http
      service: xxxxxxxxxbalconyyyyyy
      middlewares:
        - redirect
      rule: "Host(`xxxxxxxxxbalconyyyyyy.rivas.cloud`)"
    wledbalcon-1-https-cloud:
      entryPoints:
        - https
      service: xxxxxxxxxbalconyyyyyy
      rule: "Host(`xxxxxxxxxbalconyyyyyy.rivas.cloud`)"
      tls:
        certResolver: le
        domains:
          - main: "rivas.cloud"
            sans:
              - "*.rivas.cloud"   

    xxxxxxxxxarbolyyyyyy-1-http:
      entryPoints:
        - http
      service: xxxxxxxxxarbolyyyyyy
      middlewares:
        - redirect
      rule: "Host(`xxxxxxxxxarbolyyyyyy.antrivas.duckdns.org`)"
    xxxxxxxxxarbolyyyyyy-1-https:
      entryPoints:
        - https
      service: xxxxxxxxxarbolyyyyyy
      rule: "Host(`xxxxxxxxxarbolyyyyyy.antrivas.duckdns.org`)"
      tls:
        certResolver: le     
        

Tocaremos la configuración en cloudfare si es necesario

Añadiremos dos cards condicionales en función de si están activas o no cada una de las luces de navidad , asignaremos las urls de los subdominios que hemos creado , y aspect_ratio pondremos un 5% para poder verlo como una tira horizontal

      - type: conditional
        conditions:
          - entity: light.wled_arbol    
            state: "on"
        card:
          type: iframe
          aspect_ratio: 5%
          url: https://xxxxxxxxxarbolyyyyyy.rivas.cloud/liveview    
          
      - type: conditional
        conditions:
          - entity: light.wled_balcon    
            state: "on"
        card:
          type: iframe
          aspect_ratio: 5%
          url: https://xxxxxxxxxbalconyyyyyy.rivas.cloud/liveview       
          

Este seria el resultado , aquí se ve fijo pero es espectacular como se ve exactamente como las tiras de leds

Lo añadiremos a la tarjeta del árbol y la tira de leds que habíamos creado previamente dándole forma poco a poco al panel lovelace

Ahora crearemos todo lo necesario para poder temporizar el funcionamiento de ambas tiras de led , el objetivo es que al final quede así

crearemos unos input_numeric en nuestro configuration.yaml

  slider_inicio_encendido_wled_arbol:
    name: Hora inicio
    initial: 17
    min: 0
    max: 23
    step: 1 
    unit_of_measurement: "H"    
    icon: mdi:clock-start
    
  slider_inicio_apagado_wled_arbol:
    name: Hora fin
    initial: 5
    min: 0
    max: 23
    step: 1 
    unit_of_measurement: "H"    
    icon: mdi:clock-end
   
  slider_inicio_encendido_wled_balcon:
    name: Hora inicio
    initial: 17
    min: 0
    max: 23
    step: 1 
    unit_of_measurement: "H"    
    icon: mdi:clock-start
    
  slider_inicio_apagado_wled_balcon:
    name: Hora fin
    initial: 5
    min: 0
    max: 23
    step: 1 
    unit_of_measurement: "H"    
    icon: mdi:clock-end

Luego unos input_boolean

  input_temporizador_wled_arbol:
    name: Temporizador arbol
    # initial: off
    icon: mdi:timer-outline

  input_temporizador_wled_balcon:
    name: Temporizador balcon
    # initial: off
    icon: mdi:timer-outline

Y crearemos unos sensores que nos indiquen si estamos dentro del periodo prefijado de funcionamiento

############################################################
#  Sensores luces wled
############################################################

  - platform: template
    sensors:
      luces_wled_arbol_encendido:
        value_template: >-
          {% if ( now().strftime("%-H") | int(0) )  >= (states.input_number.slider_inicio_encendido_wled_arbol.state | int) 
          or ( now().strftime("%-H") | int(0) )  < (states.input_number.slider_inicio_apagado_wled_arbol.state | int) %}
          on
          {% else %}
          off
          {% endif %}
        friendly_name: Encendido automatico leds arbol
        icon_template: "mdi:power"
        
  - platform: template
    sensors:
      luces_wled_balcon_encendido:
        value_template: >-
          {% if ( now().strftime("%-H") | int(0) )  >= (states.input_number.slider_inicio_encendido_wled_balcon.state | int) 
          or ( now().strftime("%-H") | int(0) )  < (states.input_number.slider_inicio_apagado_wled_balcon.state | int) %}
          on
          {% else %}
          off
          {% endif %}
        friendly_name: Encendido automatico leds balcon
        icon_template: "mdi:power"

Ahora implementaremos las automatizaciones de cada una de las funciones

############################################################
#### Automatizaciones luces navidad
############################################################   
     
- alias: cambio de efecto en wled programado tira led balcon si tiempo ON
  id: cambio de efecto en wled programado tira led balcon si tiempo ON
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: input_boolean.input_aleatorio_wled_balcon
      state: 'on'
    - condition: state
      entity_id: sensor.luces_wled_balcon_encendido
      state: 'on'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_balcon
      state: 'on'    
  action:
    - service: light.turn_on  
      data:
        entity_id: light.wled_balcon
    - service: input_select.select_next
      entity_id: input_select.wled_effect_balcon
    # Enviamos el efecto
    - data_template:
        topic: "wled/balcon/api"
        payload: 'FX={{ states(''input_select.wled_effect_balcon'')[:3] }}'
      service: mqtt.publish
    - delay: "00:00:01"      
    - service: input_select.select_next
      entity_id: input_select.wled_palette_balcon
    # Enviamos la paleta de colores
    - data_template:
        topic: "wled/balcon/api"
        payload: 'FP={{ states(''input_select.wled_palette_balcon'')[:2] }}'
      service: mqtt.publish
    - delay: "00:00:01"      
    # Brillo a maximo ( 255)
    - data_template:
        topic: "wled/balcon/api"
        payload: 'IX=255'
      service: mqtt.publish     
    - delay: "00:00:01"      
    # Desactivamos enviar notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/balcon/api"
        payload: 'SN=0'
      service: mqtt.publish        
    - delay: "00:00:01"      
    # Desactivamos recibir notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/balcon/api"
        payload: 'RN=0'
      service: mqtt.publish 


- alias: cambio de efecto en wled programado tira led arbol si tiempo ON
  id: cambio de efecto en wled programado tira led arbol si tiempo ON
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: input_boolean.input_aleatorio_wled_arbol
      state: 'on'
    - condition: state
      entity_id: sensor.luces_wled_arbol_encendido
      state: 'on'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_arbol
      state: 'on'    
  action:
    - service: light.turn_on  
      data:
        entity_id: light.wled_arbol
    - service: input_select.select_next
      entity_id: input_select.wled_effect_arbol
    # Enviamos el efecto
    - data_template:
        topic: "wled/arbol/api"
        payload: 'FX={{ states(''input_select.wled_effect_arbol'')[:3] }}'
      service: mqtt.publish
    - delay: "00:00:01"      
    - service: input_select.select_next
    # Enviamos la paleta de colores
      entity_id: input_select.wled_palette_arbol
    - data_template:
        topic: "wled/arbol/api"
        payload: 'FP={{ states(''input_select.wled_palette_arbol'')[:2] }}'
      service: mqtt.publish
    - delay: "00:00:01"      
    # Brillo a maximo ( 255)
    - data_template:
        topic: "wled/arbol/api"
        payload: 'IX=255'
      service: mqtt.publish     
    - delay: "00:00:01"      
    # Desactivamos enviar notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/arbol/api"
        payload: 'SN=0'
      service: mqtt.publish        
    - delay: "00:00:01"      
    # Desactivamos recibir notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/arbol/api"
        payload: 'RN=0'
      service: mqtt.publish 

- alias: encendido wled programado tira led balcon si tiempo ON
  id: encendido wled programado tira led balcon si tiempo ON
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: input_boolean.input_aleatorio_wled_balcon
      state: 'off'
    - condition: state
      entity_id: sensor.luces_wled_balcon_encendido
      state: 'on'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_balcon
      state: 'on'    
  action:
    - service: light.turn_on  
      data:
        entity_id: light.wled_balcon
    # Brillo a maximo ( 255)
    - data_template:
        topic: "wled/balcon/api"
        payload: 'IX=255'
      service: mqtt.publish     
    - delay: "00:00:01"      
    # Desactivamos enviar notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/balcon/api"
        payload: 'SN=0'
      service: mqtt.publish        
    - delay: "00:00:01"      
    # Desactivamos recibir notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/balcon/api"
        payload: 'RN=0'
      service: mqtt.publish 


- alias: encendido wled programado tira led arbol si tiempo ON
  id: encendido wled programado tira led arbol si tiempo ON
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: input_boolean.input_aleatorio_wled_arbol
      state: 'off'
    - condition: state
      entity_id: sensor.luces_wled_arbol_encendido
      state: 'on'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_arbol
      state: 'on'    
  action:
    - service: light.turn_on  
      data:
        entity_id: light.wled_arbol
    # Brillo a maximo ( 255)
    - data_template:
        topic: "wled/arbol/api"
        payload: 'IX=255'
      service: mqtt.publish     
    - delay: "00:00:01"      
    # Desactivamos enviar notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/arbol/api"
        payload: 'SN=0'
      service: mqtt.publish        
    - delay: "00:00:01"      
    # Desactivamos recibir notificaciones UDP para evitar el SYNC
    - data_template:
        topic: "wled/arbol/api"
        payload: 'RN=0'
      service: mqtt.publish      
      
- alias: apagado wled programado tira led balcon si tiempo OFF
  id: apagado wled programado tira led balcon si tiempo OFF
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: sensor.luces_wled_balcon_encendido
      state: 'off'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_balcon
      state: 'on'    
  action:
    - service: light.turn_off
      data:
        entity_id: light.wled_balcon


- alias: apagado wled programado tira led arbol si tiempo OFF
  id: apagado wled programado tira led arbol si tiempo OFF
  initial_state: 'on'
  trigger:
    - platform: time_pattern
      minutes: '/1'
      seconds: 00
  condition:
    - condition: state
      entity_id: sensor.luces_wled_arbol_encendido
      state: 'off'
    - condition: state
      entity_id: input_boolean.input_temporizador_wled_arbol
      state: 'on'    
  action:
    - service: light.turn_off 
      data:
        entity_id: light.wled_arbol
    
  

Básicamente tendremos en cuenta que este activado o no el programado , que este o no activado el cambio de efecto y paleta y en función de eso enviamos por MQTT todos los comandos , los efectos y las paletas de colores vienen de otra entrada del blog previa

EL objetivo final es que nos quede un panel como este

Y con esto y un bizcocho ……