Еще летом, когда светило яркое солнце, мне надоело крутить ручку закрытия/открытия жалюзи в офисе как на этой гифке и пришла в голову идея их автоматизировать.
Перед покупкой жалюзи от Леруа Мерлен У меня была идея установить электрические шторы, но цена на них несколько лет назад, когда я делал выбор, была довольно высокой.
Кроме того, из-за высоты и ширины окна размер штор был нестандартным, что также увеличивало стоимость.
Результат моего проекта по автоматизации жалюзи от Леруа Мерлен.
После этого прошло пару лет и после количества "умных" вещей в офисе на базе Домашний помощник начал расти, я вернулся к идее автоматизации жалюзи.
Мониторинг вариантов толком ничего не дал.
Все проекты автоматизации жалюзи, которые я видел, были для двухдюймовых жалюзи, тогда как почти все жалюзи, которые продаются в РФ, имеют ширину в один дюйм.
Автоматизированные жалюзи на окне офиса
1. Выбор двигателя и управляющего микроконтроллера.
Сначала было не понятно, с чего вообще начать.
Для автоматизации в других проектах часто использовали шаговый двигатель 28BYJ-48 примерно по 130 рублей за штуку (в Китае).
С контроллером управления проблем не возникло, так как использую его практически везде ЛОЛИН (ВЕМОС) D1 мини .
Трансформированные и стандартные жалюзи: вид сверху
2. Прошивка микроконтроллера ESP8266 от китайского производителя Espressif Systems.
На следующем этапе - прошивка, не хотелось заморачиваться со сложным кодированием, а обычный Тасмота готовых вариантов не предоставил.
Потом я встретил ESPHome — прошивка, поддерживающая Home Assistant изначально и без MQTT.
Трансформированные и стандартные жалюзи: вид сбоку Приятным бонусом ESPHome было то, что он имеет компонент шагового двигателя , который в свою очередь поддерживает работу с микросхемой ULN2003, которая может использоваться для управления нагрузками большой мощности, в том числе электромагнитными реле, двигателями постоянного тока, электромагнитными клапанами, а также в различных схемах управления шаговыми двигателями.
Перепрофилированные жалюзи: вид сбоку Поскольку я использую Хасс.
io , то для компиляции прошивки я использовал самый простой для этого вариант - Дополнение ESPHome Hass.io .
На окне три жалюзи и три микроконтроллера.
Вот получившиеся прошивки: После тестов я обнаружил, что для правильного открытия/закрытия жалюзи необходимо установить разное количество шагов для каждой жалюзи.
window_1.yaml
окно_2.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
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
окно_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. Установка привода в жалюзи.
Шаговый двигатель в жалюзи полностью не влез, но так как в моем случае они не были прижаты к стене, то можно было часть двигателя переместить в прорезь с обратной стороны жалюзи.
На окне установлены моторизованные жалюзи Леруа Мерлен.
4. Установка конструкции на окно
Поскольку жалюзи уже были установлены строителями, мне оставалось только установить коробку с микроконтроллерами и источник питания рядом с окном.Блок питания не самый мощный, так как шаговые двигатели включаются последовательно - сначала первый, потом второй, потом третий.
Общее время работы около 20 секунд.
Коробка с тремя ESP8266 и блоком питания на стене офиса
5. Правила автоматизации закрытия жалюзи из Home Assistant
При превышении определенного порога жалюзи поворачиваются на 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.
P.S. После окончания работы мне сказали, что есть специальные соединительные втулки, которые позволят жестко соединить вал двигателя и вал жалюзи.Дополнительную информацию можно найти по адресу GitHub .Это позволит избежать перекручивания, которое может произойти в моем нынешнем случае из-за недостаточной фиксации соединительной трубки.
Автор: Михаил Шардин , 17 декабря 2019 г.
В опросе могут участвовать только зарегистрированные пользователи.
Войти , Пожалуйста.
Ваши жалюзи/шторы автоматизированы? 3,45% Да 8 92,67% Нет 215 3,88% Где-то да, где-то нет Проголосовали 9 232 пользователя.
30 пользователей воздержались.
Теги: #микроконтроллеры #Сделай сам или Сделай сам #поделки #Интернет вещей #Умный дом #сделай сам #умный дом #домашний помощник #ESP8266 #моторизованные шторы
-
Тонер-Картридж Samsung: Типы И Экологичность
19 Oct, 24 -
Как Docker Помог Нам В Написании Тестов
19 Oct, 24 -
Сервисное Меню В Benq E2220Hd
19 Oct, 24 -
О Соли С Точки Зрения Химика
19 Oct, 24 -
Wikileaks Запустил «Массовое Зеркалирование»
19 Oct, 24 -
Скрещивание Велотренажера С Компьютером
19 Oct, 24