Натисніть "Ввід" щоб перейти до контенту.

Розумний вимикач освітлення на ESPHome

4.6
(12)

Зараз закінчую ремонт у квартирі, де було кільканадцять специфічних вимог, зокрема до освітлення. Зокрема керування освітленням повинно бути як доступним як за натиском на вимикач, так і з пульта. Резервний канал – керування із смартфона із будь-якого куточка світу. При цьому це все повинно мати максимально простий та надійний інтерфейс та реалізацію.

Так дійшов до рішення, у якому живлення усіх світильників підводиться до електрощитка, де вже керується специфічним реле. Цю ідею підглянув на ютюб-каналі Great Scott!

Тоді до вимикачів можна підвести низьковольтне керування, зокрема витою парою. Це і економія проводів і простіше підключення. А от у ролі реле – щось із наявних Wi-Fi реле із контактами для фізичної кнопки. Кілька таких подібних продуктів із різним маркуванням можна знайти на AliExpress.

Саме ці модулі із контактами для додаткової кнопки досить важко знайти, навіть щоб впевнитись, що воно варте тих грошей. Проте таки знайшов трохи відгуків, що модулі непогані. А на одному французькому сайті знайшов інформацію, що контакти для кнопки просто дублюють кнопку на модулі і є дійсно низьковольтними.

Ідея можливо хороша, але…

Все було б так, як і задумано, але особиста ситуація внесла корективи і часу чекати модулі з AliExpress не залишилось, а у квартирі вже потрібно жити. Тому взявся робити тимчасове рішення “на вже”.

Враховуючи те, як розведено живлення і як підключені вимикачі, спершу подумав зробити просту аналогову latch-схему на таймері 555. Все ніби просто і надійно, не потребує програмування та мікроконтролерів, а тому за справності використаних компонентів не повинного “глючити”. В теорії, звичайно.

Схема із сайту mechatrofice.com

Принцип роботи у тому, що на керуючих контактах (2 і 6) напруга становить половину від напруги живлення (Vcc/2). У такому стані нічого не відбувається і при запуску вихід схеми має низький логічний рівень (0 В). Конденсатор на виході також розряджений. При натиску кнопки конденсатор з’єднується із керуючими контактами, створюючи короткочасне просідання напруги нижче третини напруги живлення (Vcc/3). За такого тригеру мікросхема змінює свій стан, вихід стає логічно високим і конденсатор заряджається до напруги живлення. Повторне натискання на кнопку спричиняє короткочасне зростання напруги вище двох третин напруги живлення (2/3 Vcc), чим переводить мікросхему у вимкнений стан, а тому логічний вихід стає знову низьким. І коло закривається.

Спроба №1

Все виглядає просто, тому зібрав цю схему на прототипній платі. На виході використав твердотіле реле – чудовий варіант для LED-світильників, оскільки немає звуку перемикання контактів і електроди не прикипатимуть. Так, у лабораторних умовах, все запрацювало на ура.

Вимикач вимикав чи вмикав лампочку, час натиску вимикача нічого не змінював, тільки сам факт натиску змінював стан. Встановив вечором цей пробний модуль у квартирі, спробував – все теж працює добре. Тільки от помітив, що дотик до дроту змінює стан реле. Тобто схема надзвичайно чутлива. Головне, що натиск на будь-який вимикач у квартирі робив те, що повинен був, а тому залишив все на тест у бойових умовах.

Зранку були майстри по меблях і скаржились, що світило вимикається або вмикається коли працює електроінструмент. От і велика проблема з цією схемою – за “довгих плечей” до вимикачів, вони починають працювати як антени і реєструють електромагнітні імпульси при запуску потужних споживачів, що тригерить схему. Так діло не піде.

Спроба №2

Тут виникла ідея роз’єднати фізичний вимикач і керуючі контакти. Для цього підійде та ж оптопара. Ідея – при натиску кнопки повинна відкриватись оптопара і притягувати конденсатор на виході до керуючих контактів.

Цього разу розвів схему в EasyEDA, бо так і гарніше і практичніше.

Виготовив плату у домашніх умовах, з використанням персульфату натрію, який просто чудово використовувати у квартирі без страху все забруднити і пошкодити. Для шаблону використовую старенький лазерний принтер HP P1505. І от переніс тонер, трошки поправив маркером і вже на витравленій платі замітив, що лишній раз відзеркалив шаблон, а тому все треба переробляти. Але заодно помітив, що великі полігони вийшли як решето – таки попри ідеальне перенесення тонеру, потрібно маркером ці полігони домалювати, для найкращого ефекту.

Витравив нову плату, спаяв, тестую. І щось дивне. Схема вмикалась лише, якщо рукою торкнутись до керуючого контакту. А вимикалась вже від вимикача. Але сам вимикач освітлення не вмикав.

Дебаг схеми забрав трохи часу тих вихідних, але дійшов висновку, що використання оптопари із тим принципом, який описаний вище – неможливий. Так, коли вихід високий конденсатор має змогу розрядитись і дати імпульс на керуючий контакт. Але потрібного просідання напруги не виникає і схема не може змінити свій стан назад на увімкнутий. Тобто, у мене вийшов буквально “вимикач” – схема, яка тільки вимикає освітлення.

Спроби №3 і 4

Часу не залишалось, а тому за кілька хвилин допаяв Arduino UNO, написав коротенький скечт і до комендантської години встиг поставити нову схему, яка тепер змінювала стан освітлення на натиск кнопки. Все завелось за 10 хвилин, без танців з бубном.

Так дійшов до висновку, що аналог аналогом, а треба робити на мікроконтролері. І згадалось, як мені в коментарях у моєму телеграм каналі писали і за мікроконтролери, і за ESP-01. І ось воно – найкраще рішення. Невеличка плата із Wi-Fi, яка має два вільні GPIO – якраз для кнопки і для реле.

На цю платформу зразу є готове open-source програмне рішення – ESPHome. А тут вже і робота із безліччю сенсорів, і просте налаштування одним файлом, і OTA оновлення. І ще реалізована інтеграція з Home Assistant, зокрема я зможу використати свій сервер для роботи із цим модулем віддалено.

На цьому етапі сів розводити нову схему у тому ж EasyEDA. Тепер схема потребувала регулятора живлення на 3.3 В, але загалом попередні напрацювання не потребували багато змін. Так зробив четверту ревізію вимикача. Але я був би не я, якби не допустив помилок.

Витравивши плату і спаявши все, помітив, що не можу запрограмувати ESP-01. Знову кілька годин дебагу і знайшлась проблема – обидва GPIO у ESP-01 повинні бути високого рівня або плаваючі, щоб схема запустилась. GPIO0 низького рівня при запуску переводить мікроконтролер у режим програмування, а GPIO2 низького рівня спричиняє безкінечний потік помилок у терміналі. У моїй же реалізації кнопка-вимикач була низького рівня і визначався високий рівень як тригер. Та й вихід з реле був низького рівня по-замовчуванню. Тому плата просто не запускалась. Прийшлось перерізати декілька доріжок, а ще допаяти компонентів навісним монтажем, тільки так все і прошивалось і запрацювало справно.

Спроба №5

Навісний монтаж у ламповій техніці я люблю, але не тут. Сів розводити і виготовляти нову, п’яту, ревізію плати. І, о чудо, все запрацювало з першого разу. Вимикач вимикав і вмикав реле, стан відправлявся на MQTT сервер, який слухав мій Home Assistant, а з останнього я міг не тільки спостерігати стан кнопок, а ще й керувати реле. Чудово, несу монтувати на локацію. Поставив, перевірив справність і залишив на ніч. Але зранку мене догнала ще одна проблема.

Оскільки блок живлення використаний на 12 В, через те, що наявне реле потребувало саме 12 В, то для ESP-01 знижував напругу лінійним стабілізатором LT1083. Споживання ESP-01 становить приблизно 70 мА. А оскільки лінійний стабілізатор залишкову енергію трансформує у тепло, то він генерував 0,07 А * (12 В – 3,3 В) = 0,6 Вт. Це ніби і не багато, але при роботі Wi-Fi споживання зростало до 140 мА, а з цим кількість тепла зростала до 1,2 Вт, що вже на межі можливостей корпусу TO-220. Треба радіатор, однозначно. Ну що ж, шоста ревізія так шоста.

Спроба №6

Гербер-файл доступний ТУТ. А ось тут – шаблон для домашнього виготовлення плати.

Розвів і виготовив нову плату із радіатором, а ще змінив розміщення контактів UART. Щоб запрограмувати мікроконтролер, достатньо замкнути два контакти біля оптопари – це притягне GPIO0 до землі і переведе схему у режим прошивання при запуску. Сам контакт для UART справа має наступну послідовність – GND, Tx, Rx, Vcc, RST, GND. Остання земля суто для зручності перевантаження плати. Послідовність перших чотирьох контактів така, щоб зручно було використовувати програматори із контактами послідовністю GND, Rx, Tx, Vcc. Ну і потрібно пам’ятати, що ESP-01 не толерантний до 5 В, а тому програматор повинен працювати із рівнями тільки 3.3 В.

Тут ще виникла ідея – а що якщо використовувати Tx та Rx контакти замість власне UART для чогось іншого корисного вже після прошивання. Наприклад, для сенсорів. Взявся запрограмувати сенсор BMP280 – датчик тиску із зв’язком по I2C, для якого потрібні якраз два контакти. І, на диво, все завелось з першого ж разу.

Круто, але мені значення тиску не цікаві. З наявних на руках сенсорів знайшлись DS18B20 та DHT11 – перший дає досить точне значення температури, другий дає умовно точне значення вологості і температури. А головне – кожен потребує по одному контакті для даних, а тому якраз утилізовують два доступні контакти. Запрограмував плату і все теж завелось зразу же. Вийшла можливість використовувати додаткові плати розширення, нова функція, яку явно не можуть надати вищезгадані готові китайські Wi-Fi реле!

Залізо є, тепер прошивка.

Щодо ESPHome, то конфігурація досить проста. Я вибрав шлях із використанням Docker – простий і без потреби наявності потрібного середовища на комп’ютері – просто встановив потрібний мені контейнер і працював із ним.

$ docker pull ghcr.io/esphome/esphome

Далі з допомогою помічника згенерував початкову конфігурацію. Після цього потрібно лише буде змінювати цей згенерований файл.

$ docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome wizard switch.yaml

Після генерації можна зразу спробувати прошити вашу плату на основі ESP8266/ESP32 або ж розширити можливості згідно доступного на сайті. Щоб остаточно прошити мікроконтролер потрібно виконати наступну команду:

$ docker run --rm --privileged -v "${PWD}":/config --device=/dev/ttyUSB0 -it ghcr.io/esphome/esphome run switch.yaml

Тут /dev/ttyUSB0 це адреса вашого програматора.

Якщо все пройшло успішно і логер не був відключеним, то відкриється термінал із даними з того таки логера.

Приклади моїх налаштувань далі. Спершу приклад із використанням сенсора BMP280 на контактах Rx та Tx у платі ESP-01:

esphome:
  name: pym_switch

esp8266:
  board: esp01

wifi:
  ssid: "my_secure_wifi"
  password: "cnVzbmlfcCF6ZEA="
  fast_connect: true

  ap:
    ssid: "Switch Fallback Hotspot"
    password: ""


logger:
  baud_rate: 0

i2c:
  sda: GPIO1 # Tx
  scl: GPIO3 # Rx
  scan: true
  id: bus_a
  

captive_portal:

web_server:
  port: 80

binary_sensor:
  - platform: gpio
    internal: false
    name: "ESPHome Light Switch"
    pin:
      number: GPIO0
      inverted: true
    id: pym_input_btn
    filters:
      delayed_off: 100ms
    on_click:
      min_length: 150ms
      max_length: 5s
      then:
        - switch.toggle: pym_output_relay

sensor:
  - platform: uptime
    name: "ESPHome Uptime"
  - platform: wifi_signal
    name: "ESPHome WiFi Signal Sensor"
  - platform: bmp280
    temperature:
      name: "ESPHome Temperature"
      oversampling: 16x
    pressure:
      name: "ESPHome Pressure"
    address: 0x76
    update_interval: 60s

switch:
  - platform: gpio
    internal: false
    name: "ESPHome Light"
    pin:
      number: GPIO2
      inverted: true
    id: pym_output_relay

mqtt:
  broker: "my.mqtt.broker.url.com"
  port: 1883
  username: "some_secure_login"
  password: "cnVzbmlfcCF6ZEA="

А ось приклад із використанням сенсорів DS18B20 та DHT11 на тих же портах:

esphome:
  name: pym_switch

esp8266:
  board: esp01

wifi:
  ssid: "my_secure_wifi"
  password: "cnVzbmlfcCF6ZEA="
  fast_connect: true

  ap:
    ssid: "Switch Fallback Hotspot"
    password: ""


logger:
  baud_rate: 0

captive_portal:

web_server:
  port: 80

binary_sensor:
  - platform: gpio
    internal: false
    name: "ESPHome Light Switch"
    pin:
      number: GPIO0
      inverted: true
    id: pym_input_btn
    filters:
      delayed_off: 100ms
    on_click:
      min_length: 150ms
      max_length: 5s
      then:
        - switch.toggle: pym_output_relay


dallas:
  - pin: GPIO1

sensor:
  - platform: uptime
    name: "ESPHome Uptime"
  - platform: wifi_signal
    name: "ESPHome WiFi Signal Sensor"
  - platform: dallas
    index: 0
    name: "ESPHome DS18B20 Temperature"
  - platform: dht
    model: "DHT11"
    pin: GPIO3
    temperature:
      name: "ESPHome DHT11 Temperature"
    humidity:
      name: "ESPHome DHT11 Humidity"
    update_interval: 60s

switch:
  - platform: gpio
    internal: false
    name: "ESPHome Light"
    pin:
      number: GPIO2
      inverted: true
    id: pym_output_relay

mqtt:
  broker: "my.mqtt.broker.url.com"
  port: 1883
  username: "some_secure_login"
  password: "cnVzbmlfcCF6ZEA="

Навіть коли все здавалось готове, не буває без приколів.

Вже під час тестування із навантаження стався ElectroBOOM moment – я переплутав контакти і підключив 220 В до контактів кнопки. Від цього яскраво засвітився резистор і, як вже дізнався потім, згоріла оптопара. Проте решта схеми вижила і після заміни оптопари з резистором все запрацювало.

Зараз воно працює вже декілька днів, освітлення керується що вимикачами, що з Home Assistant – все без проблем. Температура на радіаторі LT1083 досягає максимум 55 градусів. А споживання всієї схеми становить 1,2 Вт при вимкнутому реле та 2 Вт – за комутації.

Сенсори теж присилають всі показники в Home Assistant. А ще ESPHome має гарну сторінку, де можна оглянути дані із сенсорів та змінити стан реле.

Замість висновків

Тепер вирішив, що не буду купувати китайські рішення невідомої якості, а сам розроблю хаб керування освітлення на всі світильники, цього разу на ESP32 та з використанням DC-DC конвертора (замість LT1083). При цьому замовлю виготовлення плати і все поміщу у корпус на DIN-рейку. Має вийти не гірше заводського рішення, а головне – можливостей із ESPHome буде безліч.

Наскільки цікавою була ця публікація

Середній рейтинг 4.6 / 5. Кількість голосів: 12

Будьте першим, хто проголосує!

4 коментарі

  1. Andrew 04/04/2023

    Нахрена MQTT если в esphome в home assiatant залетает сам, нативно?

    • UR5WKM 04/04/2023

      MQTT використав, оскільки фізично ESPHome модуль знаходиться у іншому будинку, тут тільки зв’язок через інтернет.

  2. Andrew 04/04/2023

    кнопку в интерфейс выводить бессмысленно – aeyrwbjyfkf bkb byajhvfnbdyjcnb jn ytt 0, только захламляет. поставь internal: true или убери это и имя, а оставь только id
    DHT11 просто выкинь. совсем. и забудь про него навсегда!!
    бмешку откалибруй по температуре по далласу и оставь ее. даллас – это эталон. точнее не бывает. при разной температуре будет разная погрешность(. датчики должны находиться максимально близко друг к другу и изменение температуры должно быть плавным, чтобы оба могли отработать.
    еще не заметил резюка с далласом. должен быть 4к7 между ногами питания и дата. без него может глючить.
    esp32 для простых вещей необоснованно дорого. d1 mini очень классные.
    а если нужна сила, мощь и надежность, да еще и по проводу, то WT32-ETH01

    • UR5WKM 04/04/2023

      Кнопка суто тестово, я бачу як моя теща користується вимикачем (вона в курсі, бере повноцінну участь в тестуванні), потім викину, згоден що лишнє.

      DHT11 був в наявності, було цікаво чи заведеться як таке. Хочу Si7021, це зразу і достатньо достовірна температура і вологість. Друге теж важливо з огляду на ситуацію, просто всі наявні Si7021 я десь задіяв. BMP280 буде менш точніша.

      Pull-up на OneWire є, 4,7кОм , куди без нього, тільки маленький, на 0,25 Вт, тому не видно.

      За light буду пробувати, дякую за ідею.

      ESP32 дорого, але дасть кращу підтримку езернету (є ідея такий же модуль на ще одну локацію встановити, а там тільки езернет; і так мінімальне замовлення на jlcpcb – 5 плат), плюс буде мати нативно всі потрібні входи-виходи без розширювачів GPIO.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *