我们便宜地管理英寸百叶窗

回到夏天,当灿烂的阳光照耀着我时,我厌倦了像在这个GIF中那样转动旋钮来关闭/打开办公室中的百叶窗,然后想到了使它们自动化的想法。



从勒沃伊·梅林Leroy Merlin)购买百叶窗之前,我曾想过要安装电动窗帘,但是几年前当我做出选择时,它们的价格相当可观。 另外,由于窗户的高度和宽度,窗帘的尺寸被证明是非标准的,这也增加了成本。



我的Leroy Merlin百叶窗自动化项目的结果


在那之后的几年中,基于Home Assistant的办公室中“智能”物品的数量开始增长,我回到了自动百叶窗的想法。


监控选项无效。 我看到的所有百叶窗自动化项目都是针对2英寸的百叶窗,而在俄罗斯联邦出售的几乎所有百叶窗都是1英寸宽。



办公室窗户上的自动百叶窗


1.电机和控制微控制器的选择


起初,根本不知道从哪里开始。 在自动化方面,其他项目经常使用28BYJ-48步进电机每台价格约130卢布(在中国)。 我对控制控制器没有任何疑问,因为我几乎在所有地方都使用LOLIN(WEMOS)D1 mini



转换百叶窗和标准百叶窗:顶视图


2.中国制造商Espressif Systems的ESP8266微控制器的固件


下一步-固件,我不想打扰复杂的编码,通常的Tasmota也没有提供现成的选项。 然后我遇到了ESPHome-本机固件,没有Home Assistant支持的MQTT。



转换百叶窗和标准百叶窗:侧视图


ESPHome的一个不错的好处是它具有用于步进电机组件,组件又支持ULN2003芯片的运行,该芯片可用于控制各种步进电机的控制电路中的大功率负载,包括电磁继电器,直流电机,电磁阀引擎。



重做百叶窗:侧视图


由于使用Hass.io ,因此使用了最简单的选项来编译固件-ESPHome Hass.io Add-On
窗户上有三个百叶窗,并获得了三个微控制器。 以下是生成的固件:
经过测试,我发现为了正确打开/关闭百叶窗,有必要为每个百叶窗设置不同数量的步骤。



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.将驱动器安装在百叶窗中


步进电机无法完全安装到百叶窗中,但是由于在我的情况下,步进电机没有被压在墙上,因此可以将部分电机从百叶窗的背面移入插槽。



电动百叶窗从Leroy Merlin


4.在窗户上安装结构


由于建筑商已经安装了百叶窗,所以我只能在窗户旁边安装一个装有微控制器和电源的盒子。 该电源不是最强大的电源,因为步进电机是串联打开的-首先是第一,然后是第二,然后是第三。 总运行时间约为20秒。



带有三个ESP8266的盒子和办公室墙上的电源


5.家庭助理自动关闭百叶窗的规则


当超过某个阈值时,百叶窗旋转90度,然后相应地向后旋转。


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 

总结


这是一个用于百叶窗自动化的项目,该项目仅耗时,但组件本身并不昂贵。 该项目具有一定的优势。 最重要的优势:便宜。
但是也有缺点-ESP8266永远不知道百叶窗的当前位置。 有时,例如当轴滚动时,您必须通过按Home Assistant界面中的按钮将其手动调整到其初始位置。


PS完成工作后,他们告诉我,有特殊的连接套,可以使您牢固地连接电动机轴和百叶窗轴。 这样可以避免由于连接管紧固不充分而在当前情况下发生涡旋。

可以在GitHub上找到更多详细信息。


发表者: Mikhail Shardin
2019年12月17日

Source: https://habr.com/ru/post/zh-CN480690/


All Articles