Home Assistant Fácil

Curso de Home Assistant y domótica

  • Blog
  • Soy un pardillo
  • Podcast
  • Curso Arduino
  • Curso Domótica
  • Acceder
Usted está aquí: Inicio / Domótica / Controlar las luces con gestos con ESPHome y Home Assistant

Controlar las luces con gestos con ESPHome y Home Assistant

Luis del Valle Hernández

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.

Indice de contenidos

  • 1 Capítulos controla las luces con gestos
  • 2 Material y esquema del proyecto
  • 3 Código control de luces con gestos
  • 4 Integración y automatización con Home Assistant

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:

  • Sensor Sharp IR
  • Placa ESP8266

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.

NUKI SMART LOCK

Nuki Smart Lock Go, Pro o Ultra: cuál comprar y la prueba que lo decide todo

Mira chapapote, imagina la cara de tonto que se te queda cuando te gastas casi 350 pavos en una cerradura inteligente Nuki, llega a casa, la abres con … [+ info...]

slzb-06

SLZB-06U: migrar coordinador Zigbee desde Sonoff Dongle P (y por qué el Dongle E es diferente)

Vale, lo confieso: no hay nada que me dé más pereza en domótica que tener que migrar toda la red Zigbee. El típico momento en el que tu viejo … [+ info...]

Home Assistant 2026.6

Home Assistant 2026.6: dashboard inteligente, IR bidireccional y automatizaciones más claras

Llevas meses peleándote con el dashboard de Home Assistant: añadir una tarjeta requería saber de memoria el nombre de cada tipo de bloque, y al final … [+ info...]

Copyright © 2026 · Programar Fácil · Aviso legal