Авторизация
Регистрация

Напомнить пароль

Устрашающе умный выключатель

Недавно я писал статью про радиовыключатели. Ну что ж, пора написать про их начальника. Встречайте, умный хаб! В начале это было дешевое wi-fi реле на основе bk7231. Теперь эта штука может управлять светом в половине дома и напичкана сверхсовременными решениями по самое не могу. Какие возможности открывает платформа ESPHome на HomeAssistant и как их применить на практике я расскажу прямо под катом!

В принципе, философия прописана в статье про сенсорные радиовыключатели, но кратко пройдемся еще раз. Умный дом построен на платформе HomeAssistant. Среди устройств есть как многофункциональные (хабы), так и выполняющие простейшие функции (slave-устройства). Над всеми ними стоит локальный сервер умного дома.


Никаких китайских управляющих серверов с задержкой в полминуты, никакой зависимости от щедрот корпораций (и их санкций), никакого компрометирования тайны личной жизни и сливов данных хакерам. Все прозрачно, чисто и быстро. А еще дешево. Конечно, есть и минусы. Например, радио и ИК-приборы не защищены от хакеров-любителей. Пока что…

Теперь к делу! На руки мне попалось вот такое умное wifi-реле.


Я решил сделать на его основе управление освещением на кухне, но «с небольшими доработками».

По заводу это крайне простое устройство. Оно состоит из блока питания на 5V, который питает реле и через стабилизатор на 3.3V wifi-чип. Блок находится прямо под чипом, который присобачен на переходной плате.


А что это у нас за чип? Маркировка чипа — WB2S. Интернет сообщает, что данный чип семейства OpenBeken bk7231t является pin-to-pin аналогом другого известного чипа умных устройств — ESP8266.


Как известно, ESP8266 отлично совместим с ESPHome — платформой, на которой можно делать вполне себе продвинутые умные устройства, совместимые с HomeAssistant (локальный умный дом). Ранее в коммерческие умные устройства поголовно пихали esp-шки, но прогресс не стоит на месте (шутка), и на их место стали пихать чипы OpenBeken. Как говорилось выше, отличия между модулями минимальные, да только так же просто они не прошиваются… Не прошивались!

С недавних пор разработчик ESPHome добавил поддержку данных чипов, а с ними и вменяемый способ взаимодействия с этими устройствами. Теперь любой коммерческий обрубок можно превратить в универсальный контроллер, сейчас покажу как.

Есть два способа прошить устройство на чипах OpenBeken в ESPHome. Первый способ подойдет тем, кто любит возиться с консолью и пакетными зависимостями. Имя ему CloudCutter. Необходимо установить данный пакет на сервер умного дома, воспользовавшись SSH-соединением. Опуская подробности, скажу, что настроив CloudCutter, все устройства, подключившиеся к сети можно будет прошить прямо по воздуху, немного помучав консоль.



Второй способ состоит в прошивке TTL-программатором, и требует пайки. Его-то я и выбрал. Прошивка довольно проста. Добавляем устройство через веб-интерфейс ESPHome, что позволит нам скомпилировать прошивку. Данную прошивку нужно загрузить, подключив чип к программатору и воспользовавшись программой ItChipTool (ссылка).


Кстати, в один момент антивирус взбесился и удалил программу. Я попытался скачать ее снова, но загрузить он ее опять почему-то не давал. Причем за пару дней до этого все было в порядке. И на 10 винде все работает, а вот 11 барахлит. Пришлось в реестре отрубать антивирус. Скорее всего у вас все будет нормально, но имейте в виду, если захотите попробовать.

Схема подключения программатора стандартная (TX программатора на RX1 чипа, RX программатора на TX1 чипа). Во время прошивки необходимо кратковременно замкнуть выход CEN чипа на GND. Единственно, стоит запитать плату от выделенного источника, потому как работать с голой платой под напряжением 220V небезопасно.


У меня программа все время сыпала ошибкой контрольной суммы, но скорее всего потому, что для чтения логов чипа OpenBeken нужен второй программатор, которого у меня нет. Так или иначе, прошивка была загружена.

Теперь стоит рассказать о том, зачем все затевалось. Идея состояла в том, чтобы управлять светом на основе данных с радарного датчика ld2420, 10 штук которых было куплено на распродаже за 1300 рублей.


Эти датчики могут обнаруживать как подвижные, так и неподвижные объекты, а также расстояние до них. Они могут калиброваться программно и общаются с контроллером по UART-шине.


Также на кухне есть лампочка с ИК-управлением. Для нее была собрана цепь передатчика на ИК-диодах.


В прихожей и туалете недавно были установлены радиореле для управления светом, а также радиовыключатель на батарейках (подробнее в статье). Я решил сделать сделать удаленное управление и для них, потому применил валявшиеся радиомодули SYN480R и SYN115R.


Гулять так гулять! В наличии у меня оказался датчик звука, который я впихнул уже чисто ради интереса.


Как видно, он был немного доработан, чтобы отсеять низкие звуковые частоты. Таким образом реагирует теперь он только на резкие звуки вроде хлопков… Как хлопковый выключатель.

Оставшийся цифровой пин я занял классическим PIR-датчиком. Просто потому, что он достаточно интересно выглядит (имхо). Так-то радарный датчик в разы точнее и лучше.


Когда все было готово, я вспомнил, что вообще-то забыл самое главное — базовый выключатель-то никак не задействован в управлении… Ну не беда, прибегнем к хитрости. Безопасных цифровых пинов не осталось (одни служебные), зато есть аналоговый. Вот такая нехитрая схема позволяет нам определить, нажат выключатель или нет.


А вот общая схема.


Время пайки! Сам модуль пришлось немного изменить. Отсоединил кнопку на модуле, убрав резистор. На ее пине теперь PIR-сенсор. На место светодиода припаял его резистор и вывел через него сигнал на транзистор для ИК-передатчика (резистор оказался как раз тот, что нужно).


Датчики я решил смонтировать на крышке распределительной коробки, вырезав в ней отверстия под PIR-сенсор и IR-диоды.


Также я распечатал декоративную крышку, потому что могу.


Провода я собрал в косу и соединил с модулем WB2S. Напаял делитель напряжения ADC прямо на модуль в виде двух резисторов. Чип пришлось выпаять, чтобы подпаяться к выводу на другой стороне платы. Потом запаял все обратно.


Поскольку с модификацией прежней крышкой он не закрывался, я распечатал новую.


Пришло время устанавливать все в коробку. Рисовать коробку мне лень, а фото внутренностей вам мало что скажет, поэтому просто замечу, что подключение не отличается от заводского. Разве что теперь выключатель подсоединен к аналоговому входу. В сборе выглядит… Ну вы видели.


Я ни слова не сказал о прошивке, потому что я ей и не панировал до этого заниматься — ведь я могу в любой момент прошить хаб прямо по воздуху. Так я думал, зашивая пробную прошивку. На деле я сильно пожалел, что не попробовал сделать этого раньше.

Код хаба
esphome:
  name: kitchen-hub
  friendly_name: Kitchen Hub

bk72xx:
  board: wb2s

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "!secret_key"

ota:
  - platform: esphome
    password: "!secret_pass"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Kitchen-Hub Fallback Hotspot"
    password: "DWdZyVB9NEJ4"

captive_portal:
  
uart:

  tx_pin: P11
  rx_pin: P10
  baud_rate: 115200
ld2420:

remote_transmitter:
    # IR передатчик
  - pin: PWM1
    carrier_duty_percent: 50%
    id: ir_transmitter

  # RF433 передатчик
  - pin: PWM2
    carrier_duty_percent: 100%
    id: rf_transmitter

remote_receiver:
  pin: PWM3
  dump: rc_switch

text_sensor:
  - platform: ld2420
    fw_version:
      name: LD2420 Firmware
  - platform: template
    name: ${friendly_name}_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) +" д. " + String(hours) +" ч. " + String(minutes) +" мин.").c_str() };
    icon: mdi:clock
    update_interval: 113s
      
sensor:
  - platform: ld2420
    moving_distance:
      name : Moving Distance
  - platform: uptime  
    name: ${devicename}_uptime
    id: uptime_sec
    internal: true
  - platform: wifi_signal
    name: ${devicename}_WiFi_Signal"
    update_interval: 60s
  - platform: adc
    pin: ADC3
    name: "Kitchen Switсh"
    update_interval: 0.3s

binary_sensor:
  - platform: ld2420
    has_target:
      name: Presence
  - platform: gpio
    pin: PWM0
    name: "PIR Sensor"
    device_class: motion
  - platform: gpio
    pin: PWM5
    name: "Clap Sensor"
    filters:
      - invert:


select:
  - platform: ld2420
    operating_mode:
      name: Operating Mode

number:
  - platform: ld2420
    presence_timeout:
      name: Detection Presence Timeout
    min_gate_distance:
      name: Detection Gate Minimum
    max_gate_distance:
      name: Detection Gate Maximum
    # See "Number" section below for detail
    gate_select:
      name: Select Gate to Set
    still_threshold:
      name: Set Still Threshold Value
    move_threshold:
      name: Set Move Threshold Value

button:
  - platform: ld2420
    apply_config:
      name: Apply Config
    factory_reset:
      name: Factory Reset
    restart_module:
      name: Restart Module
    revert_config:
      name: Undo Edits

switch:
  - platform: template
    name: Hall Button
    turn_on_action:
      then:
        - remote_transmitter.transmit_rc_switch_raw:
            transmitter_id: rf_transmitter
            code: '000010000001111011110111'
            protocol: 1
            repeat:
              times: 10
              wait_time: 0s
        - delay: 5s
    turn_off_action:
      then:
        - remote_transmitter.transmit_rc_switch_raw:
            transmitter_id: rf_transmitter
            code: '111110010001111000000110'
            protocol: 1
            repeat:
              times: 10
              wait_time: 0s
        - delay: 5s
    optimistic: True
  - platform: gpio
    pin: PWM4
    name: "Kitchen Main Light"


В этой прошивке есть один небольшой изъян. Вы его видите? Дам вам пару минут на размышление. Синтаксис довольно простой, и… Да ладно, короче, здесь не указан uart_id для подключения к радарному сенсору. «Ну и что же?» — спросите вы. А то, что он вешает радар на тот же UART1, на котором висит связь с хабом. После залития этой прошивкой ни управлять хабом, ни прошить его по воздуху не выйдет. Поэтому добавляем ма-а-аленькую строчку…

id: uart_ld2420

А мне же пришлось снимать хаб и прошивать его программатором еще раз…

И вот перед нами готовый хаб. Можно потыкать выключателем с телефона. Можно посмотреть на всякие сенсоры. Но что он реально умеет?


Чтобы раскрыть его возможности, нам нужны автоматизации. Во-первых, автоматизируем свет через радарный сенсор, при этом оставив управление с выключателя (принудительное отключение света по выключателю). Для этого нам нужен параметр Presenсe и данные с аналогового сенсора (у нас он отвечает за выключатель). Скрипт для включения по присутствию выходит примерно такой:

alias: Управление светом на основе выключателя и присутствия
description: Включение света, если ток меньше 1.1 В и присутствие.
trigger:
  - platform: state
    entity_id: binary_sensor.kitchen_hub_presence
    to: "on"
  - platform: numeric_state
    entity_id: sensor.kitchen_hub_kitchen_swit_h
    below: 1.1
condition:
  - condition: numeric_state
    entity_id: sensor.kitchen_hub_kitchen_swit_h
    below: 1.1
  - condition: state
    entity_id: binary_sensor.kitchen_hub_presence
    state: "on"
action:
  - entity_id: switch.kitchen_hub_kitchen_main_light
    action: switch.turn_on
mode: single

Выключение более примитивное:

alias: Выключение света выключателем
description: Выключение света, если ток больше 1.1 В.
trigger:
  - platform: numeric_state
    entity_id: sensor.kitchen_hub_kitchen_swit_h
    above: 1.1
action:
  - entity_id: switch.kitchen_hub_kitchen_main_light
    action: switch.turn_off
mode: single

Пока что подумываю сделать еще автоподсветку ночью, если идти в туалет. Но для этого нужно еще пару хабов, чтобы отслеживать присутствие в других комнатах.

Кроме того, на другом моем хабе из статьи про управления жалюзи есть датчик освещенности. Его также можно использовать в автоматизации освещения.

Также я могу отслеживать нажатие радиовыключателя, поскольку в хабе есть приемник 433 МГц. Планирую взять еще парочку, чтобы с их помощью активировать различные сценарии освещения.


В другой статье я делал управляемые по радиоканалу штору, которые можно легко активировать этим хабом.

А еще хлопковый датчик, ИК-трансмиттер, PIR… В следующих статьях я покажу еще один самодельный хаб, а также настрою сложные автоматизации на основе датчиков нескольких хабов. Новый год обещает быть интересным! Если же вам показалась вся эта возня с автоматизацией и кодом муторной, вы всегда можете воспользоваться услугами интеллектуальных чат-ботов. Просто рассказываете, что вам нужно, а он генерирует весь необходимый код.


И помните:
Будущее
Осталось в прошлом
Добавить в избранное
+43 +64
свернутьразвернуть
Комментарии (28)
RSS
+
avatar
+5
Так глядишь в 2025 и на ESP32 постепенно перейдут.
На esp32s3 говорят даже Linux умельцы ставят)
wiki.osll.ru/doku.php/etc:users:jcmvbkbc:linux-xtensa:esp32s3
Дополнительная информация
+
avatar
+2
  • l1bbcsg
  • 29 декабря 2024, 06:11
Sonoff давно перешёл.
Даже S3 или C6 с маттером уже ставят ставят.
+
avatar
+6
  • Alax
  • 29 декабря 2024, 07:46
Для несложного проекта, где и Ардуино нано справится, хотел заказать esp8266. Посмотрел на ценник — оказалось, что проще (и дешевле) взять esp32
+
avatar
+4
  • nochkin
  • 29 декабря 2024, 08:01
Вроде как в этом и есть намёк, что пора переходить с этого мамонта ESP8266 на ESP32. У них как раз есть ESP32-C серия под замену — такая же недорогая, но возможностей больше.
+
avatar
+1
  • willrain
  • 29 декабря 2024, 12:54
ESP01 дешевле бакса можно набрать, ESP32 C3 где-то пару баксов. В общем, держу в хозяйстве жменю и тех, и тех. Если не нужны какие-то продвинутые возможности, то ESP01 — вполне ходовой вариант.
+
avatar
0
  • nochkin
  • 29 декабря 2024, 20:37
ESP01 — это вообще ни о чём, там полтора IO есть и всё. При цене примерно $1,50. Для меня это бесполезно.
Модули ESP32-C3 на том же Али примерно по $1,60-$2,00 можно найти. А там сразу дюжина IO, нормальный PWM и прочие радости.

Если ESP-01 уже есть в наличии с покупок многолетней давности, то можно понять. Но для новых проектов закупаться ESP-01 очень сомнительно. Экономия 50 рублей? Но ради каких плюшек?
Я перестал покупать ESP8266 уже года как три-четыре назад. У меня есть в закромах несколько ESP-12, но даже их использовать я не собираюсь.
+
avatar
0
  • willrain
  • 29 декабря 2024, 20:58
там полтора IO есть и всё.
4 ноги. Вполне достаточно для самых разных применений. У меня даже поливной контроллер собран на таком, с управлением пачкой сервоприводов и работой с местной клавиатурой. Можно было бы еще и дисплей прилепить, ибо все на i2c.

При цене примерно $1,50
Глянул Али, последняя покупка ESP01 — в сентябре, $26.98 за 30 штук.

Экономия 50 рублей? Но ради каких плюшек?
Могу все то же самое сказать в обратную сторону :)
Я потрачу на полтора доллара больше ради каких плюшек, если все, что мне надо — это прицепить пару, допустим, термодатчиков на точке?

У меня есть в закромах несколько ESP-12, но даже их использовать я не собираюсь.
Кстати, тоже лежат (и вроде ESP07 накупил несколько — но то для принтера планировалось). Но с ними минус еще в том, что паять на плату-переходник надо для легкого использования. А у ESP01 — готовые пины. В итоге или ESP01 (если что-то простое), или ESP32 C3 Super mini, когда больше ног нужно.
+
avatar
0
  • Kroock
  • 29 декабря 2024, 10:52
вчера ESP32-H2 по 330р заказал
+
avatar
0
  • sedoy287
  • 29 декабря 2024, 12:13
Где брали, Сслылочку)
+
avatar
+1
  • Kroock
  • 29 декабря 2024, 14:11
сегодня закончились, на озоне — в поиске забить 1489052397
+
avatar
-1
даже type c дешевле чем на micro usb
+
avatar
-1
  • tirarex
  • 29 декабря 2024, 13:25
Где найти Esp32 дешевле 8266? я беру модули Wemos D1 mini с USB-C портом по 150-170руб/штука, самые же дешевые 32 уже от 350руб.
+
avatar
+1
  • Alax
  • 29 декабря 2024, 18:57
+
avatar
+1
  • nochkin
  • 29 декабря 2024, 20:41
Кстати, эти C3 классные. Маленькие, 4 метра флеша, неплохой набор IO, сразу есть USB порт, есть нужные инструменты для разработки под ESP-IDF и Arduino, можно запаять как модуль или на ножки поставить.
Если мне выходов хватает, то использую эти C3. Если не хватает, то беру ESP32-S3-DevKitC-1.
+
avatar
+1
  • willrain
  • 29 декабря 2024, 21:02
Главное на брак не нарваться.
+
avatar
0
  • nochkin
  • 29 декабря 2024, 21:30
Согласен. Это можно про все покупки сказать.
Для тех, кто не в курсе, среди ESP32-C3 Super Mini есть «брак» когда китайцы от жадности припаивают ESP32-C3 без встроенной флешки. В этом случае модуль совершенно бесполезен. Надо проверять сразу хотя бы тем же «esptool flash_id».
+
avatar
+6
  • l1bbcsg
  • 29 декабря 2024, 06:52
при этом оставив управление с выключателя (принудительное отключение света по выключателю)
Не очень принудительно получилось. Выключатель пинает чип, тот по вайфаю передаёт в HA, сервер принимает решение и передаёт обратно. Если заболеет чип, роутер, сервер или хоумассистант, то свет включаться не будет.
Как простой вариант можно в коробке поставить переключатель который замкнёт цепь в обход контроллера. Так хоть легко восстановить тупую работу можно вручную, например на время техобслуживания вайфая или обновления сервера.
Либо перенести автоматизацию на устройство, так можно уменьшить точки отказа, останется только чип. Более сложных вариантов тоже много.
+
avatar
+3
это не умный дом если он постоянно не отваливается)
+
avatar
+1
  • ploop
  • 29 декабря 2024, 17:28
Да ладно. Заводские умные выключатели так и работают — как обычные, но с возможностью удалённого управления. Отвалился сервер — не страшно, выключатель остаётся выключателем.
+
avatar
0
  • Omnicorn
  • 29 декабря 2024, 17:02
Скрипт можно установить и через ESPHome. Я выбрал через сервер, поскольку отказ локального сервера маловероятен. Наиболее возможный вариант — отключение света. Но тут все понятно.

Код локального управления прилагаю:
esphome:
  name: kitchen_switch
  platform: ESP8266  # или ESP32 в зависимости от вашего устройства
  board: nodemcuv2  # или другая ваша плата

wifi:
  ssid: "your_wifi"
  password: "your_password"

sensor:
  - platform: adc
    pin: GPIO34  # замените на ваш пин ADC (например, ADC3)
    name: "Kitchen ADC Sensor"
    update_interval: 0.3s
    accuracy_decimals: 2
    filters:
      - multiply: 3.3  # если ваш ADC работает от 3.3V (для ESP32 это актуально)

output:
  - platform: gpio
    pin: GPIO5  # замените на пин, к которому подключен свет
    id: kitchen_light

script:
  - id: turn_on_light
    then:
      - output.turn_on: kitchen_light
  - id: turn_off_light
    then:
      - output.turn_off: kitchen_light

# Lambda для проверки значения ADC и управления светом
interval:
  - interval: 0.5s
    then:
      - lambda: |
          if (id(kitchen_adc_sensor).state > 1.0) {
            // Если напряжение больше 1 В, включаем свет
            id(turn_on_light).execute();
          } else {
            // Если напряжение меньше или равно 1 В, выключаем свет
            id(turn_off_light).execute();
          }
+
avatar
+13
  • Kwasti
  • 29 декабря 2024, 08:08
Ничего не понятно, но было интересно почитать.
+
avatar
+3
Представляю, что может устроить соседский мамкин хакер, если сподобится взломать wi-fi…
+
avatar
+1
  • Johnmat
  • 29 декабря 2024, 09:00
Синяк себе под глазом? :)
Вряд ли что более существенное… это эе не хирургия и не РВСН
+
avatar
0
Если роутер не провайдерский и не какая-нибудь tenda, если прошивка свежая, а пароль хотя бы 10-12 символов, да с хорошей энтропией, мамкин хакер будет его ломать годами даже на 4090
+
avatar
+4
  • DVANru
  • 29 декабря 2024, 12:02
… но прогресс не стоит на месте...
+
avatar
+1
  • redcap
  • 29 декабря 2024, 14:31
Если же вам показалась вся эта возня с автоматизацией и кодом муторной
Столько времени прошло, а нормальных готовых решений так и не появилось? :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.