في فصل الصيف ، عندما كانت الشمس الساطعة مشرقة ، سئمت من تشغيل مفتاح الغالق / المصراع في المكتب كما هو الحال في هذه الصورة المتحركة ، وقد ظهرت الفكرة لأتمتة هذه الأجهزة.

قبل شراء الستائر من Leroy Merlin ، كان لدي فكرة عن وضع ستائر كهربائية ، لكن الثمن بالنسبة لهم قبل عدة سنوات ، عندما اخترت ذلك ، كان قليلًا. بالإضافة إلى ذلك ، بسبب ارتفاع وعرض النافذة ، اتضح أن حجم الستائر غير قياسي ، مما زاد من التكلفة أيضًا.
نتيجة مشروعي لأتمتة الستائر من Leroy Merlin
بعد ذلك ، مر عامين ، وبعد أن بدأ عدد الأشياء "الذكية" في المكتب على أساس Home Assistant في النمو ، عدت إلى فكرة أتمتة الستائر.
خيارات المراقبة لم تنجح. جميع مشاريع الأتمتة الأعمى التي رأيتها كانت مخصصة للستائر ثنائية البعد ، بينما جميع الستائر المبدئية التي تباع في الاتحاد الروسي تقريبًا بعرض بوصة واحدة.

الستائر الآلية على نافذة المكتب
1. اختيار المحركات والتحكم متحكم
في البداية لم يكن واضحًا من أين نبدأ على الإطلاق. من أجل التشغيل الآلي ، تستخدم المشاريع الأخرى غالبًا محرك السائر 28BYJ-48 لنحو 130 روبل لكل قطعة (في الصين). لم يكن لدي سؤال مع وحدة التحكم ، لأنني استخدم LOLIN (WEMOS) D1 mini في كل مكان تقريبًا.

الستائر المحولة والمعيارية: منظر علوي
2. البرامج الثابتة لجهاز التحكم ESP8266 الخاص بالمصنع الصيني Espressif Systems
في الخطوة التالية - البرنامج الثابت ، لم أكن أريد أن أزعج الترميز المعقد ، ولم يقدم Tasmota المعتاد خيارات جاهزة. ثم قابلت ESPHome - البرامج الثابتة الأصلية وبدون MQTT المدعوم من Home Assistant.

الستائر المحولة والمعيارية: منظر جانبي
هناك مكافأة لطيفة من ESPHome تتمثل في أنه يحتوي على مكون للعمل مع محركات السائر ، والتي بدورها تدعم التشغيل مع شريحة ULN2003 ، والتي يمكن استخدامها للتحكم في حمولة ذات قوة كبيرة ، بما في ذلك المرحلات الكهرومغناطيسية ومحركات التيار المستمر وصمامات الملف اللولبي في دوائر التحكم في مختلف محركات السائر محركات.

الستائر Redid: عرض الجانب
منذ أن استخدمت Hass.io ، استخدمت الخيار الأسهل لهذا البرنامج الثابت لتجميع البرامج الثابتة - ESPHome Hass.io Add-On .
هناك ثلاث ستائر على النافذة ويتم الحصول على ثلاثة ميكروكنترولر. فيما يلي البرامج الثابتة الناتجة:
بعد الاختبار ، وجدت أنه من أجل الفتح / الإغلاق الصحيح للستائر ، من الضروري تعيين عدد مختلف من الخطوات لكل أعمى.

window_1.yamlsubstitutions: 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.
ملاحظة: بالفعل بعد الانتهاء من العمل ، أخبروني أن هناك أطواق ربط خاصة تسمح لك بالربط الصارم بعمود المحرك وعمود الستائر. سيؤدي ذلك إلى تجنب التمرير الذي قد يحدث في حالتي الحالية نظرًا لعدم كفاية تثبيت أنبوب الاتصال.
مزيد من التفاصيل يمكن الاطلاع على جيثب .
بواسطة: ميخائيل شاردين ،
17 ديسمبر 2019