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
Capítulos controla las luces con gestos
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.



