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.