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.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170  | 
						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.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  | 
						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.



