Gerenciamos cortinas de polegada mais baratas

No verão, quando o sol brilhava, eu estava cansado de girar o botão do obturador / obturador no escritório, como neste gif, e surgiu a idéia de automatizá-los.



Antes de comprar as persianas da Leroy Merlin , tive a ideia de colocar cortinas elétricas, mas o preço para elas há vários anos, quando fiz uma escolha, era bastante cortante. Além disso, devido à altura e largura da janela, o tamanho das cortinas não era padrão, o que também aumentou o custo.



O resultado do meu projeto de automação de persianas da Leroy Merlin


Depois disso, alguns anos se passaram e depois que o número de coisas "inteligentes" no escritório, com base no Home Assistant, começou a crescer, voltei à idéia de automatizar persianas.


As opções de monitoramento não funcionaram. Todos os projetos de automação de persianas que vi foram para persianas de duas polegadas, enquanto quase todas as persianas que são vendidas na Federação Russa têm uma polegada de largura.



Persianas automatizadas em uma janela do escritório


1. A escolha do motor e do microcontrolador de controle


No começo, não estava claro por onde começar. Para automação, outros projetos costumavam usar o motor de passo 28BYJ-48 por cerca de 130 rublos cada (na China). Não tive uma dúvida com o controlador de controle, porque uso o LOLIN (WEMOS) D1 mini quase em todos os lugares.



Persianas convertidas e padrão: vista superior


2. Firmware para o microcontrolador ESP8266 do fabricante chinês Espressif Systems


Na próxima etapa - o firmware, eu não queria me preocupar com codificação complexa, e o Tasmota usual não dava opções prontas. Então eu me encontrei com o ESPHome - firmware nativo e sem MQTT suportado pelo Home Assistant.



Persianas convertidas e padrão: vista lateral


Um bom bônus do ESPHome é que ele possui um componente para trabalhar com motores de passo , que, por sua vez, suporta a operação com o chip ULN2003, que pode ser usado para controlar uma carga de energia significativa, incluindo relés eletromagnéticos, motores DC, válvulas solenóides, em circuitos de controle de vários motores de passo motores.



Redid blinds: vista lateral


Como uso o Hass.io , usei a opção mais fácil para compilar o firmware - o ESPHome Hass.io Add-On .
Existem três persianas na janela e três microcontroladores são obtidos. Aqui está o firmware resultante:
Após o teste, descobri que, para a correta abertura / fechamento dos blinds, é necessário definir um número diferente de etapas para cada blind.



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. Instalação da unidade nos estores


O motor de passo não se encaixava completamente nas persianas, mas, como no meu caso, elas não eram pressionadas contra a parede, era possível mover parte do motor para o slot da parte traseira das persianas.



Persianas elétricas de Leroy Merlin


4. Instalação da estrutura na janela


Como as persianas já foram instaladas pelos construtores, só consegui instalar uma caixa com microcontroladores e uma fonte de alimentação ao lado da janela. A fonte de alimentação não é a mais potente, pois os motores de passo são ligados em série - primeiro o primeiro, depois o segundo e depois o terceiro. O tempo total de execução é de aproximadamente 20 segundos.



Caixa com três ESP8266 e fonte de alimentação na parede do escritório


5. Regras para automatizar o fechamento de blinds no Assistente de Casa


Quando um certo limite é excedido, os blinds giram 90 graus e depois retornam de acordo.


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 

Sumário


Aqui está um projeto para a automação de persianas, que exige apenas tempo, mas os componentes são baratos. O projeto tem certas vantagens. A vantagem mais importante: baixo custo.
Mas também há desvantagens - o ESP8266 nunca sabe a posição atual dos blinds. Às vezes, quando, por exemplo, o eixo rola, é necessário ajustá-lo manualmente para sua posição inicial pressionando um botão na interface do Assistente de residência.


PS: Após o término do trabalho, eles me disseram que existem mangas de conexão especiais que conectam rigidamente o eixo do motor e o eixo das persianas. Isso evitará o deslocamento que pode ocorrer no meu caso atual devido à fixação insuficiente do tubo de conexão.

Mais detalhes podem ser encontrados no GitHub .


Publicado por: Mikhail Shardin ,
17 de dezembro de 2019

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


All Articles