Icono del sitio Home Assistant Fácil

Controlar las luces con gestos con ESPHome y Home Assistant

controlar las luces con gestos home assistant
Controla las luces de Home Assistant como un Jedi gracias a ESPHome

En este tutorial vas a ver cómo puedes controlar las luces con gestos gracias a Home Assistant y a un sensor capaz de medir la distancia con infrarrojos con ESPHome.

En concreto vamos a utilizar el sensor Sharp IR GP2Y0A21YK0F conectado a una placa ESP8266 aunque podrías utilizar un ESP32.

La idea es poder activar un conjunto de luces cuando situamos la mano encima del sensor durante un tiempo. Esto activará el sensor y nos permitirá controlar el brillo de las luces según vamos acercando o alejando la mano del sensor.

Vamos a ver muy por encima las partes de este proyecto.

Capítulos controla las luces con gestos


00:
00 Introducción

01:10 Mini curso gratuito de Home Assistant

02:00 Bases del proyecto control luces con gestos

04:06 Código ESPHome para controlar luces con gestos

11:16 Cómo cargar el código a un ESP8266 o un ESP32

12:45 Integración y automatización en Home Assistant

17:05 Cierre y despedida

Material y esquema del proyecto

El material que vamos a utilizar es el siguiente:

Las conexión de los componentes es la siguiente.

El sensor va conectado al pin analógico A0, a GND y al pin de 5V. A continuación vamos a ver el código.

Código control de luces con gestos

El código que voy a utilizar es de la plataforma ESPHome y es el siguiente.

esphome:
  name: lucesjedi

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: ""

ota:
  password: ""

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "lucesjedi"
    password: "0UOwT1uPMMyY"

captive_portal:

globals:
  - id: tiempoActivo
    type: unsigned long
    restore_value: yes
    initial_value: "0"
  - id: tiempoMax
    type: int
    restore_value: yes
    initial_value: "3"
  - id: modo
    type: int
    restore_value: yes
    initial_value: "0"
# Modos:
# 0 -> modo inicial
# 1 -> modo contador tiempo para iniciar regulador
# 2 -> modo regulador de luz
# 3 -> modo contador tiempo para apagar regulador


time:
  - platform: sntp
    id: sntp_time
    on_time_sync:
      then:
        lambda: |-
          id(modo) = 0;
          id(estado).publish_state("Inicial");

switch:
  - platform: template
    name: "Jedi Interruptor"
    id: interruptor
    optimistic: true

text_sensor:
  - platform: template
    name: "Jedi Estado"
    id: estado
    lambda: |-
      std::string resultado;
      if(id(modo) == 0){
        resultado =  "Inicial";
      }else if(id(modo) == 1){
        resultado =  "Init Regulador";
      }else if(id(modo) == 2){
        resultado =  "Regulador";
      }else if(id(modo) == 3){
        resultado =  "Fin Regulador";
      }
      return resultado;
    update_interval: 1s

sensor:
  - platform: template
    name: "Jedi Control"
    id: regulador
    update_interval: never
    filters:
      - calibrate_linear:
         method: least_squares
         datapoints:
          - 100.0 -> 100.0
          - 25.0 -> 0.0
      - clamp:
          min_value: 0.0
          max_value: 100.0
          ignore_out_of_range: true
  - platform: adc
    pin: A0
    name: "lucesjedi"
    disabled_by_default: true
    update_interval: 500ms
    filters:
      - round: 2
      - multiply: 100
    on_value:
      then:
        lambda: |-
          // Si está en modo contador inicial
          if (id(modo) == 1){
            // Comprobamos el tiempo que ha pasado
            auto time = id(sntp_time).now();
            if(time.timestamp - id(tiempoActivo) >= id(tiempoMax)){
              // Activar modo regulador
              id(modo) = 2;
              // Activar swtich
              id(interruptor).publish_state(true);

              ESP_LOGD("custom", "Activa modo regulador");
            }
          // Si está en modo regulador
          }else if (id(modo) == 2){
            // Enviar la información al sensor
            id(regulador).publish_state(x);
          // Si está en modo contador final
          }else if (id(modo) == 3){
            // Comprobamos el tiempo que ha pasado
            auto time = id(sntp_time).now();
            if(time.timestamp - id(tiempoActivo) >= id(tiempoMax)){
              // Activar modo inicial
              id(modo) = 0;
              // Desactivar swtich
              id(interruptor).publish_state(false);

              ESP_LOGD("custom", "Activa modo inicial");
            }
          }
    on_value_range:
      - above: 25
        below: 100
        then:
          lambda: |-
            ESP_LOGD("custom", "Modo: %d", id(modo));
            // Si está en modo Inicio
            if (id(modo) == 0){
                // Contar tiempo
                auto time = id(sntp_time).now();
                id(tiempoActivo) = time.timestamp;
                // Cambio de modo
                id(modo) = 1;
            // Si está en modo contador final
            } else if (id(modo) == 3 ){
              // Cambia a modo regulador
              id(modo) = 2;
              ESP_LOGD("custom", "Volver modo regulador");
            }
      - below: 25
        then:
          lambda: |-
            // Si está en modo inicio contador
            if(id(modo) ==  1){
              // Volvemos al modo inicial
              id(modo) = 0;
              ESP_LOGD("custom", "Volver modo inicial");
            // Si está en modo regulador
            }else if (id(modo) == 2){
              // Contar el tiempo
              auto time = id(sntp_time).now();
              id(tiempoActivo) = time.timestamp;
              // Cambio modo contador final
              id(modo) = 3;
              ESP_LOGD("custom", "Cambio modo contador final");
            }

Lo puedes copiar, modificar y utilizar a tu antojo.

Integración y automatización con Home Assistant

Para poder integrar y automatizar con Home Assistant he utilizado esta automatización. Tienes que modificar los nombres de las entidades para utilizar entidades de tu sistema domótico.

alias: Jedi
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.jedi_control
condition:
  - condition: state
    entity_id: switch.jedi_interruptor
    state: "on"
action:
  - service: light.turn_on
    target:
      entity_id: light.wled
    data:
      brightness_pct: |
        {{ states.sensor.jedi_control.state|int }}
mode: single

Y poco más, cualquier duda en los comentarios.

Gracias a Depositphotos por ceder el derecho de algunas imágenes de este artículo.

Salir de la versión móvil