Безумная розетка с мозгами лампочки. Пятничные эксперименты со здравым смыслом.
В относительно недавнем материале был рассмотрен Реверс-инжиниринг копеечных умных лампочек, но только в теории. Пришла пора немного размяться и заняться практикой. Для этого на базе мозгов лампочки соберем розетку. Да-да! В полку HomeAssistant ожидается пополнение. Заинтересованных прошу под кат.
Прежде чем собирать какое-либо устройство, следует определиться с его назначением, списком требуемых материалов и примерным планом работы. Без этого набора лучше за инженерный проект не браться! Описывать буду в порядке хода работы.
Задумка
Итак, мне понадобилась умная розетка в прихожую. Для тех, кто не в курсе, это устройство, способное активировать и деактивировать питание 220В на подключенные устройства по автоматизации, таймеру, либо удаленно. Некоторые розетки поставляются с датчиками, например температуры и влажности, либо, что намного полезнее, мощности.

В моем случае мощность я буду измерять другим устройством и в другом месте, намного полезнее будет установить туда датчик движения. Дело в том, что я уже устанавливал умное устройство управления освещением в прихожую (см. Безумный радиошлюз для контроля освещения и многого другого), но как оказалось, покрытия его датчика движения не хватает для того, чтобы надежно фиксировать людей в нижней половине комнаты. А поскольку в прихожей необходимо снимать обувь… В общем, чтобы пофиксить эту досадную оказию, мне и понадобился еще один датчик на уровне ног. Так как информация с розетки будет поступать на центральный сервер умного дома напрямую, мне придется добавить лишь пару строчек в код автоматизаций, чтобы интегрировать новый сенсор. Очень удобно!
Что касается самой розетки, я решил взять за основу существующую видавшую виды двойную, лишь модифицировав корпус под электронику. Жаль, не додумался заранее ее разобрать, увидел бы, что контактные группы тоже придется дорабатывать...

Идея с датчиком климата (температура и влажность) мне тоже понравилась, так что решил воплотить и ее.

И вообще, кто мне запретит? Я тут свою розетку делаю, с мозгами лампочки и гирляндой сенсоров!

В прихожей у меня также расположены светильники на аккумуляторах из поста Автономный светильник с датчиком движения и освещения (подсветка полок). В какой-то момент заряжать их мне надоело, так что решил их запитать на постоянку. И тут как раз вспомнил о розетке — почему бы в нее не вмонтировать порт для запитки? Питания от стандартного БП должно быть за глаза и для контроллера с реле, и для подзарядки светильников. На том и порешил.
Реализация
С основными фичами ТЗ разобрались, теперь можно приступать к технической части. На основе имеющейся рассыпухи и модулей, набросал схему в KiCAD.
Схема

В качестве драйвера 5В реле выступает ULN2003. Достаточно дешевая (<10 р./штука) и универсальная сборка транзисторов (в принципе пригодна для коммутации любых небольших потребителей, даже униполярных шаговиков).

Датчиком температуры и влажности был выбран AM2320. Это крайне удобный, достаточно точный и дешевый сенсор, подключаемый по I2C. Удобство в том, что его можно подключить еще и по шине 1Wire (ВАЖНО, нужен подтягивающий резистор 5.1 кОм — у меня вместо него параллельные по 10 кОм). Это не только экономит выводы контроллера, но и в данном конкретном проекте вообще позволило хоть как-то приделать эту периферию. Об этом чуть позже расскажу.

Датчиком присутствия взял LD2420. Тому всего две причины: его относительно легко настроить прямо в интерфейсе умного дома, и у меня их много. Рекомендовать не могу. Довольно капризные и ужасно дружат с дешевыми сенсорами (неудивительно — скорость обмена UART 115200 бод, сильно забивают I/O), плохо калибруются (честно говоря, вообще не разобрался, может нужно на esp32 калибровать — там UART устойчивее), а значения Gate по умолчанию странноватые. И нет именно определения присутствия, только микродвижения. В общем, решил влепить что есть, благо лежать в прихожей не собираюсь.

И, наконец, венцом всей этой схемотехники выступил бывший мозг умной лампочки, чип BK7231N под маркировкой CB2L.

Когда я писал предыдущий разбор, то нормально почитать даташит не удосужился, а зря. Оказывается, контроллер-то голый! Вернее, в нем не выведено никаких портов, ни I2C, ни SPI, только UART. И вроде бы ничего есть же эмуляция. Есть же?..
Ну если эмуляция и есть, то не в текущей версии LibreTiny. Тут-то мой сенсор AM2320 и должен был покинуть чат, но повезло, что я нашел его даташит со схемой для 1Wire. Потому-что 1Wire-то как раз эмулируется без проблем.
Кстати, схема изначально была немного другая. Я пробовал эмулировать UART на пинах контроллера для LD2420, но это работало настолько нестабильно, что я просто вынужден был перейти на аппаратный UART. Это возможно только в случае отключения логов api в прошивке, иначе датчик сойдет с ума.
По итогу имеем следующий список деталей:
- CB2L (или любой аналогичный)
- Реле с 5В питанием, 220В 10А, 2 шт.
- Драйвер реле ULN2003
- Блок питания 5В (нашел какой-то из неиспользуемых)
- Преобразователь в 3.3 вольта LM1117. Нестареющая классика.
- Сенсор климата AM2320
- Датчик присутствия LD2420
Ну и всяких там конденсаторов с резисторами и прочего по мелочи.
Предварительная прошивка
Чтобы не морочиться с пайкой программатора на смонтированную схему, обычно контроллер прошивается без ничего. Общий принцип описан в статье про реверс-инжиниринг. Здесь оставлю схему. Она от другого контроллера, но названия пинов те же.

Вкратце, понадобится программа ITChipTool (не забудьте замкнуть пин CEN на землю когда попросит!), UART-программатор и базовая прошивка, которую генерирует ESPHome. В ней нет пинов, но имплантируется связь через API и прошивка по воздуху. Это реально удобнее, чем морочиться с проводами. Шить конечную прошивку в общем случае не рекомендую. Хотя бы потому, что она будет спамить неверные показания в историю умного дома при включении.
В моем случае у меня все время выдавало какую-то ошибку, так что я даже подумал в какой-то момент, что ничего не выйдет. В итоге на пятидесятый раз прошило. В общем, не теряйте надежду!
Пайка
Плату решил пока делать на макетке. Лень заморачиваться, плюс остался кусок макетки от прошлых паек. Надо будет попозже попробовать выфрезировать плату на моем самодельном адаптере фрезы для 3Д принтера, но это уже тянет на отдельный проект...

Так или иначе, собрал я все довольно быстро. Силовая часть отделена от логической, сенсор вывел на проводе подальше, чтобы он все-таки измерял температуру среды, а не электроники. В качестве порта для питания светильников использовал выпаянный разъем флоппи-привода. Можно было и круглым обойтись, но флоппи-разъем фиксируется в гнезде, да и чего он просто так валяется?..
Прошивка
Теперь, когда есть базовая схема без подключения 220В, в пору писать и тестировать прошивку. Углубляться сильно не буду, все конфиги стандартные. Гуглятся буквально на раз-два у каждого сенсора. Собственно, я и нагуглил. Часть, сгенерированную ESPHome с паролями я пропущу.
uart:
id: uart_bus
# Используем аппаратные пины UART1
tx_pin: TX1 # или явно GPIO11
rx_pin: RX1 # или явно GPIO10
baud_rate: 115200
parity: NONE
stop_bits: 1
ld2420:
uart_id: uart_bus
###############################################################################
number:
- platform: ld2420
presence_timeout:
name: Detection Presence Timeout
min_gate_distance:
name: Detection Gate Minimum
max_gate_distance:
name: Detection Gate Maximum
###############################################################################
button:
- platform: shutdown
name: "Shutdown"
- platform: restart
name: "Restart"
- platform: safe_mode
name: "Restart (Safe Mode)"
- platform: factory_reset
disabled_by_default: True
name: "Factory Reset ESP"
id: factory_reset_all
- platform: ld2420
apply_config:
name: Apply Config
factory_reset:
name: Factory Reset
restart_module:
name: Restart Module
revert_config:
name: Undo Edits
select:
- platform: ld2420
operating_mode:
name: Operating Mode
###############################################################################
binary_sensor:
- platform: ld2420
has_target:
name: Presence
- platform: gpio
pin: P8
name: "Присутствие в прихожей"
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: ${name}-uptime
id: uptime_sec
internal: true
- platform: wifi_signal
name: ${name}-WiFi-Signal"
update_interval: 60s
- platform: dht
pin: P7
temperature:
name: "Температура в прихожей"
id: hallway_temperature
humidity:
name: "Влажность в прихожей"
id: hallway_humidity
update_interval: 60s
################################################################################
switch:
- platform: gpio
pin: P24
inverted: True
restore_mode: RESTORE_DEFAULT_ON
id: outlet1
name: "Розетка 1"
- platform: gpio
pin: P26
id: outlet2
restore_mode: RESTORE_DEFAULT_ON
inverted: True
name: "Розетка 2"Думаю, все названия говорят сами за себя. Для LD2420 предусмотрены дополнительные фичи вроде перезагрузки контроллера или его самого в целях отладки.
Проверил — все работает. Реле щелкают, датчик климата корректно показывает, присутствие фиксируется — идем дальше.
Корпус
После всех флюсо-паечных работ и прошивки пришло время поговорить о корпусе, куда это все будет помещаться.
Розетка состоит из двух частей — собственно, круглых гнезд для электрических вилок и ободка. Гнезда я оставил как есть, а вот обод расширил, чтобы поместить в него электронные кишочки.
Собственно, весь реверс-инжиниринг состоял в том, чтобы подогнать внутреннюю раму под размеры гнездовой запчасти во Freecad. Зачем-то по инерции я и скругление корпуса сначала повторил, так что вышла полная копия обода.

Но быстро одумался, и низ расширил.

Поскольку размеры макетки я изначально прикинул так, чтобы в сборе с БП оно не было сильно шире исходного корпуса розетки, мне оставалось только примерно попасть в габариты распаянного флоппи-разъема. Чтоб не запарывать большую деталь при печати (или не колхозить), отверстие я сделал пошире, а для разъема уже после печати вымерял размеры рамы.

Мелкую раму перепечатать не жалко пару раз, а фиксируется она вполне жестко.

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

Оставалась самая простая часть — выключить свет и на клеммных разъемах подключить схему к сети...
«Самая простая часть»
В общем, выключая свет, разбираю розетку, а там...

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

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

А еще долго пытался все провода с клеммами уложить, чтобы они удобно разбирались потом, и чтобы не мешали сборке. В итоге часа 4 возился с этой частью. Мораль? Быть предусмотрительнее во время планирования!
Интеграция
Теперь, когда розетка полностью работает (а включилось все без сюрпризов), интегрируем ее, как и планировалось, в умный дом. Для этого я добавил на страничку прихожей графики и переключатели, отвечающие за работу розетки.

Также необходимо добавить логику запрета выключения света, если сенсор в розетке фиксирует человека. Вначале это зависело только от сенсора в хабе.
Теперь добавим в прошлую автоматизацию условие от нового сенсора в пункте «И если». Также учел, если сенсор по каким-то причинам станет недоступным.

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

Сделано это потому, что сенсоры могут барахлить, но делают они это абсолютно независимо. Поэтому проблема ложных срабатываний полностью нивелируется, если за выключение отвечают они оба. Свет может включиться и выключиться, если кто-то находится у проема прихожей, но он не остается гореть до следующего обнаружения присутствия.
Итоги
Думаю, очевидно, что проект не предусматривает полного повторения, ибо некоторые аспекты сделаны колхозно, а другие начерно. Еще в цвет не попал… Моей задачей было собрать устройство под свою среду, что благополучно и было сделано. Оно работает уже где-то месяц без нареканий, потому сам подход (хаб с множеством сенсоров) могу рекомендовать. И чип лампочки, хоть и не без ограничений, вполне подходит для небольших DIY-проектов. Сейчас, глядя на девайс, добавил бы индикаторы включенных розеток. Ну и само собой сделал бы на печатной плате...
В дальнейшем хочу потыкать BLE-стек у этого самого контроллера лампочки. По идее, с его помощью можно организовать крайне дешевый беспроводной датчик, или подключить как хаб. В LibreTiny такое не предусмотрено, а тыкать голый камень пока что лень. В любом случае, спасибо, что зашли. Приятного вечера (утра, дня, ночи)!
- 20 марта 2026, 22:57
- 20 марта 2026, 23:02
- 20 марта 2026, 23:05
- 20 марта 2026, 23:34
| +82 |
4361
152
|
| +52 |
2748
101
|
| +42 |
2360
36
|