Administramos persianas de pulgadas a bajo costo

En el verano, cuando el sol brillaba, estaba cansado de girar la perilla para cerrar / abrir las persianas en la oficina como en este GIF y surgi贸 la idea de automatizarlas.



Antes de comprar las persianas de Leroy Merlin , tuve la idea de poner cortinas el茅ctricas, pero el precio por ellas hace varios a帽os, cuando tom茅 una decisi贸n, fue bastante mordaz. Adem谩s, debido a la altura y el ancho de la ventana, el tama帽o de las cortinas result贸 no ser est谩ndar, lo que tambi茅n aument贸 el costo.



El resultado de mi proyecto para la automatizaci贸n de persianas de Leroy Merlin


Despu茅s de eso, pasaron un par de a帽os y despu茅s de que la cantidad de cosas "inteligentes" en la oficina basadas en Home Assistant comenz贸 a crecer, volv铆 a la idea de automatizar las persianas.


Las opciones de monitoreo no funcionaron. Todos los proyectos de automatizaci贸n de persianas que vi fueron para persianas de dos pulgadas, mientras que casi todas las persianas que se venden en la Federaci贸n de Rusia tienen una pulgada de ancho.



Persianas automatizadas en la ventana de una oficina


1. La elecci贸n de motor y microcontrolador de control


Al principio no estaba claro por d贸nde empezar en absoluto. Para la automatizaci贸n, otros proyectos a menudo usaban el motor paso a paso 28BYJ-48 por aproximadamente 130 rublos cada uno (en China). No ten铆a una pregunta con el controlador de control, porque uso LOLIN (WEMOS) D1 mini en casi todas partes.



Persianas convertidas y est谩ndar: vista superior


2. Firmware para el microcontrolador ESP8266 del fabricante chino Espressif Systems


En el siguiente paso: el firmware, no quer铆a molestarme con la codificaci贸n compleja, y la Tasmota habitual no daba opciones listas para usar . Luego me reun铆 con ESPHome , firmware que es nativo y sin MQTT compatible con Home Assistant.



Persianas convertidas y est谩ndar: vista lateral


Una buena ventaja de ESPHome es que tiene un componente para trabajar con motores paso a paso , que a su vez admite el funcionamiento con el chip ULN2003, que puede usarse para controlar una carga de potencia significativa, incluidos rel茅s electromagn茅ticos, motores de CC, v谩lvulas de solenoide, en circuitos de control de varios motores paso a paso. motores



Redid persianas: vista lateral


Desde que uso Hass.io , utilic茅 la opci贸n m谩s f谩cil para esto para compilar firmware: ESPHome Hass.io Add-On .
Hay tres persianas en la ventana y se obtienen tres microcontroladores. Aqu铆 est谩n el firmware resultante:
Despu茅s de la prueba, descubr铆 que, para la correcta apertura / cierre de las persianas, es necesario establecer un n煤mero diferente de pasos para cada persiana.



window_1.yaml
substitutions: devicename: window_1 upper_devicename: Window 1 esphome: name: $devicename platform: ESP8266 board: d1_mini wifi: ssid: "xxx" password: "xxx" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Window 1 Fallback Hotspot" password: "xxx" captive_portal: # web_server: # port: 80 # css_url: http://192.168.15.10:8123/local/webserver-v1.min.css # js_url: http://192.168.15.10:8123/local/webserver-v1.min.js # Enable Home Assistant API api: services: - service: control_stepper variables: target: int then: - stepper.set_target: id: my_stepper target: !lambda 'return target;' # Enable OTA Access ota: # Enable verbose logging over serial logger: # physical connection stepper: - platform: uln2003 id: my_stepper pin_a: D0 pin_b: D5 pin_c: D6 pin_d: D7 max_speed: 250 steps/s sleep_when_done: true acceleration: inf deceleration: inf i2c: cover: - platform: template name: "Zhaliuzi 1" id: window1 device_class: blind open_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: -1550 close_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: 1550 stop_action: - stepper.set_target: id: my_stepper target: !lambda return id(my_stepper).current_position; optimistic: true assumed_state: true sensor: - platform: bh1750 name: "Osveshchennost u okna" address: 0x23 update_interval: 40s # General device data - platform: uptime id: uptime_sec - platform: wifi_signal name: ${upper_devicename} WiFi Signal id: wifis_signal update_interval: 900s text_sensor: - platform: template name: ${upper_devicename} Uptime lambda: |- int seconds = (id(uptime_sec).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; icon: mdi:clock-start update_interval: 113s - platform: template name: ${upper_devicename} Wifi Strength icon: "mdi:wifi" lambda: |- if (id(wifis_signal).state > -50 ) { return {"Excellent"}; } else if (id(wifis_signal).state > -60) { return {"Good"}; } else if (id(wifis_signal).state > -70) { return {"Fair"}; } else if (id(wifis_signal).state < -70) { return {"Weak"}; } else { return {"None"}; } update_interval: 900s - platform: version name: ${upper_devicename} Version - platform: template name: ${upper_devicename} MAC Address lambda: 'return {WiFi.macAddress().c_str()};' icon: mdi:fingerprint update_interval: 1d switch: - platform: restart name: ${upper_devicename} Restart 

window_2.yaml
 substitutions: devicename: window_2 upper_devicename: Window 2 esphome: name: $devicename platform: ESP8266 board: d1_mini wifi: ssid: "xxx" password: "xxx" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Window 2 Fallback Hotspot" password: "xxx" captive_portal: # web_server: # port: 80 # css_url: http://192.168.15.10:8123/local/webserver-v1.min.css # js_url: http://192.168.15.10:8123/local/webserver-v1.min.js # Enable Home Assistant API api: services: - service: control_stepper variables: target: int then: - stepper.set_target: id: my_stepper target: !lambda 'return target;' # Enable OTA Access ota: # Enable verbose logging over serial logger: # physical connection stepper: - platform: uln2003 id: my_stepper pin_a: D0 pin_b: D5 pin_c: D6 pin_d: D7 max_speed: 250 steps/s sleep_when_done: true acceleration: inf deceleration: inf cover: - platform: template name: "Zhaliuzi 2" id: window2 device_class: blind open_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: -1800 close_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: 1800 stop_action: - stepper.set_target: id: my_stepper target: !lambda return id(my_stepper).current_position; optimistic: true assumed_state: true # General device data sensor: - platform: uptime id: uptime_sec - platform: wifi_signal name: ${upper_devicename} WiFi Signal id: wifis_signal update_interval: 900s text_sensor: - platform: template name: ${upper_devicename} Uptime lambda: |- int seconds = (id(uptime_sec).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; icon: mdi:clock-start update_interval: 113s - platform: template name: ${upper_devicename} Wifi Strength icon: "mdi:wifi" lambda: |- if (id(wifis_signal).state > -50 ) { return {"Excellent"}; } else if (id(wifis_signal).state > -60) { return {"Good"}; } else if (id(wifis_signal).state > -70) { return {"Fair"}; } else if (id(wifis_signal).state < -70) { return {"Weak"}; } else { return {"None"}; } update_interval: 900s - platform: version name: ${upper_devicename} Version - platform: template name: ${upper_devicename} MAC Address lambda: 'return {WiFi.macAddress().c_str()};' icon: mdi:fingerprint update_interval: 1d switch: - platform: restart name: ${upper_devicename} Restart 

window_3.yaml
 substitutions: devicename: window_3 upper_devicename: Window 3 esphome: name: $devicename platform: ESP8266 board: d1_mini wifi: ssid: "xxx" password: "xxx" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Window 3 Fallback Hotspot" password: "xxx" captive_portal: # web_server: # port: 80 # css_url: http://192.168.15.10:8123/local/webserver-v1.min.css # js_url: http://192.168.15.10:8123/local/webserver-v1.min.js # Enable Home Assistant API api: services: - service: control_stepper variables: target: int then: - stepper.set_target: id: my_stepper target: !lambda 'return target;' # Enable OTA Access ota: # Enable verbose logging over serial logger: # physical connection stepper: - platform: uln2003 id: my_stepper pin_a: D0 pin_b: D5 pin_c: D6 pin_d: D7 max_speed: 250 steps/s sleep_when_done: true acceleration: inf deceleration: inf cover: - platform: template name: "Zhaliuzi 3" id: window3 device_class: blind open_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: -1600 close_action: - stepper.report_position: id: my_stepper position: 0 - stepper.set_target: id: my_stepper target: 1600 stop_action: - stepper.set_target: id: my_stepper target: !lambda return id(my_stepper).current_position; optimistic: true assumed_state: true # General device data sensor: - platform: uptime id: uptime_sec - platform: wifi_signal name: ${upper_devicename} WiFi Signal id: wifis_signal update_interval: 900s text_sensor: - platform: template name: ${upper_devicename} Uptime lambda: |- int seconds = (id(uptime_sec).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; icon: mdi:clock-start update_interval: 113s - platform: template name: ${upper_devicename} Wifi Strength icon: "mdi:wifi" lambda: |- if (id(wifis_signal).state > -50 ) { return {"Excellent"}; } else if (id(wifis_signal).state > -60) { return {"Good"}; } else if (id(wifis_signal).state > -70) { return {"Fair"}; } else if (id(wifis_signal).state < -70) { return {"Weak"}; } else { return {"None"}; } update_interval: 900s - platform: version name: ${upper_devicename} Version - platform: template name: ${upper_devicename} MAC Address lambda: 'return {WiFi.macAddress().c_str()};' icon: mdi:fingerprint update_interval: 1d switch: - platform: restart name: ${upper_devicename} Restart 

3. Instalaci贸n de la unidad en las persianas


El motor paso a paso no encajaba completamente en las persianas, pero como en mi caso no estaban presionadas contra la pared, era posible mover parte del motor a la ranura desde la parte posterior de las persianas.



Persianas el茅ctricas de ventana de Leroy Merlin


4. Instalaci贸n de la estructura en la ventana.


Como los constructores ya instalaron las persianas, solo pude instalar una caja con microcontroladores y una fuente de alimentaci贸n junto a la ventana. La fuente de alimentaci贸n no es la m谩s potente, ya que los motores paso a paso se encienden en serie: primero el primero, luego el segundo y luego el tercero. El tiempo total de ejecuci贸n es de unos 20 segundos.



Caja con tres ESP8266 y fuente de alimentaci贸n en la pared de la oficina


5. Reglas para automatizar el cierre de persianas desde Home Assistant


Cuando se excede un cierto umbral, las persianas giran 90 grados y luego vuelven en consecuencia.


automations.yaml
 - alias: Covers OPEN trigger: - platform: numeric_state entity_id: sensor.osveshchennost_u_okna above: 0 below: 2500 condition: - condition: state entity_id: cover.zhaliuzi_3 state: 'closed' - condition: state entity_id: cover.zhaliuzi_2 state: 'closed' - condition: state entity_id: cover.zhaliuzi_1 state: 'closed' action: - service: cover.open_cover data: entity_id: cover.zhaliuzi_3 - delay: '00:00:06' - service: cover.open_cover data: entity_id: cover.zhaliuzi_2 - delay: '00:00:06' - service: cover.open_cover data: entity_id: cover.zhaliuzi_1 - alias: Covers CLOSE trigger: - platform: numeric_state entity_id: sensor.osveshchennost_u_okna above: 2501 below: 50000 condition: - condition: state entity_id: cover.zhaliuzi_3 state: 'open' - condition: state entity_id: cover.zhaliuzi_2 state: 'open' - condition: state entity_id: cover.zhaliuzi_1 state: 'open' action: - service: cover.close_cover data: entity_id: cover.zhaliuzi_3 - delay: '00:00:06' - service: cover.close_cover data: entity_id: cover.zhaliuzi_2 - delay: '00:00:06' - service: cover.close_cover data: entity_id: cover.zhaliuzi_1 

Resumen


Aqu铆 hay un proyecto para la automatizaci贸n de persianas, que requiere solo mucho tiempo, pero los componentes en s铆 son econ贸micos. El proyecto tiene ciertas ventajas. La ventaja m谩s importante: lo barato.
Pero tambi茅n hay desventajas: ESP8266 nunca conoce la posici贸n actual de las persianas. A veces, cuando, por ejemplo, el eje se desplaza, debe ajustarlo manualmente a su posici贸n inicial presionando un bot贸n en la interfaz del Asistente de inicio.


PD: Despu茅s de terminar el trabajo, me dijeron que hay manguitos de conexi贸n especiales que le permitir谩n conectar r铆gidamente el eje del motor y el eje de las persianas. Esto evitar谩 el desplazamiento que puede ocurrir en mi caso actual debido a la fijaci贸n insuficiente del tubo de conexi贸n.

Se pueden encontrar m谩s detalles en GitHub .


Publicado por: Mikhail Shardin ,
17 de diciembre de 2019

Source: https://habr.com/ru/post/480690/


All Articles