Больше, чем понедельники, слякоть и безбашенные водятлы на дорогах, меня бесит будильник — маленький цифровой садист. Каждое утро он вырывает меня из сна с точБольше, чем понедельники, слякоть и безбашенные водятлы на дорогах, меня бесит будильник — маленький цифровой садист. Каждое утро он вырывает меня из сна с точ

Будильник для зимы: как я подружил лампу Ильича, ZigBee и LLM

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

Причём бесит не сам факт пробуждения (я всё-таки взрослый человек и понимаю, что проекты сами себя не напишут), а то, как именно это происходит. Резко. Грубо. Без предупреждения.

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

И дело не в лени и не в слабой воле — дело в банальной физиологии, которую почему-то никто не хочет учитывать.

Немного физиологии (куда без неё)

В глубине мозга у нас есть настоящий дирижёр суточных ритмов — крошечный, но очень важный центр, который держит в руках ниточки нашего бодрствования и сна. Он живёт по одному главному ориентиру — свету. Утром, когда лучи солнца попадают на сетчатку глаза, этот центр получает чёткий сигнал: «Всё, ночь закончилась — пора просыпаться!»

По сути, это внутренние часы организма, которые синхронизируются по внешнему источнику — солнцу. Когда света нет — а в Питере зимой его нет примерно пять месяцев — организм просто не получает команду «просыпайся». Он думает, что ещё ночь. Потому что, ну технически — ещё ночь.

62 солнечных дня в году, если верить статистике. Шестьдесят два. Это как часы без нормального источника точного времени: вроде тикают, но с такой погрешностью, что всё плывёт.

Зимняя ночь северных городов — это насилие над человеческим организмом приспособленным к жизни в африканских саваннах и немножко в Средиземноморье. Я живу в Петербурге уже много лет, и до сих пор каждую осень переживаю один и тот же кризис — когда солнце начинает заходить в четыре часа дня, а вставать по-прежнему нужно в шесть, моя нервная система просто отказывается это принимать.

Версия 1.0: покупные светобудильники (и почему они мне не понравились)

Китайские светобудильники
Китайские светобудильники

Однажды я прочитал исследование о том, как свет влияет на пробуждение. Там была фраза примерно такая:

Сорок процентов! И это не какой-то сложный биологический хак — это просто свет. Который можно запрограммировать. Я пошёл по пути наименьшего сопротивления: купил готовый светобудильник за совершенно негуманные деньги. Потом ещё один.

И знаете что? Они работали. Реально. Просыпаться стало легче, утренний зомби-режим сократился. Но через пару месяцев начало накапливаться раздражение:

  • Убогое управление. Кнопки, примитивный дисплей, листание цифр по кругу. Каждый раз — как программирование калькулятора из восьмидесятых.

  • Слабые светодиоды. Для эффекта нужны нормальные лампы. И лучше больше.

В этот момент я понял: пора делать самому.

Версия 2.0: самодельный светобудильник на Arduino и симисторе

Архивное фото: пыльная макетка и «Ардуинка».
Архивное фото: пыльная макетка и «Ардуинка».

Идея была простая:

  • микроконтроллер;

  • симистор (диммирование);

  • выход на люстру.

Бюджет — около 1000 ₽.

Программирование — в классической IDE. Опторазвязки: одна — чтобы ловить фронт сетевого напряжения, вторая — чтобы управлять симистором.

Экран и нормальное управление я не сделал, потому что… великая лень. Время и «сигнал рассвета» задавал старым светобудильником — через фототранзистор.

Важный момент — цветовая температура и спектр

Свет светодиодных ламп (и тогдашних на момент проектирования люминисцентных энергосберегаек) меня как сигнал к пробуждению категорически не устраивал. Есть что-то неестественное в их спектре.

Поэтому я поставил обычные лампы накаливания.

Лампы накаливания в дружбе со светодиодами
Лампы накаливания в дружбе со светодиодами

Что получилось

Работало. И работало хорошо:

  • яркий приятный свет на уровне подушки;

  • плавный «рассвет».

И да — нет ничего более постоянного, чем что-то временное. Агрегат так и не дождался нормального корпуса и экрана, но прожил лет 7.

Версия 3.0: умный диммер + система автоматизации

И вот наконец дошли руки интегрировать всё это безобразие в умный дом на ZigBee:

  • менять время будильника с телефона, не вставая с кровати;

  • интегрировать с остальным умным домом;

  • автоматически сдвигать «рассвет» по дням недели;

  • добавить вечерний режим — плавный закат перед сном.

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

Финальная архитектура

Система умного дома управляет беспроводным диммером, который регулирует люстру на лампах накаливания.

ZigBee Dimmer MOES ZM-105-M
ZigBee Dimmer MOES ZM-105-M

Железо

  • Беспроводной диммер 900 ₽

  • Координатор умного дома 900-3000р

Почему ZigBee, а не Wi‑Fi? Да хотелось, чтобы датчики жили от батареек долго и потому что устройства объединяются в устойчивую сеть через друг друга, энергоэффективны, и я устал от гаджетов, которые отваливаются при каждом чихе роутера.

И вот тут начинаются грабли: закрытая система eWeLink + китайское облако, постоянные отвалы интернета, отсутствие уверенности, что всё это будет жить дальше.

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

Часть зоопарка
Часть зоопарка

Так я принял решение уйти в открытую прошивку Tasmota. Далее почти весь процесс шёл с активной помощью современных LLM (названия не привожу, чтобы не обвинили в рекламе).

Без этой помощи я бы не перевёл свой умный дом на открытую прошивку за один день.

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

Автоматизация настройки умного дома (тут началась магия)

Для начала я просто спрашивал LLM: как прошить мой координатор Sonoff ZBBridge Pro на Tasmota. Для сравнения: поиск через Google/Яндекс на первой странице не дал ничего толкового. Да, для заливки нужен паяльник (подпаяться к плате) и программатор. У меня был такой:

USB‑SERIAL (USB, TTL, UART) адаптер CH340G, 3.3V–5V
USB‑SERIAL (USB, TTL, UART) адаптер CH340G, 3.3V–5V

.Дальше на координаторе появляется желаемая прошивка:

Настроенная под мой дом прошивка координатора в любом браузере
Настроенная под мой дом прошивка координатора в любом браузере

И вот начинается самое неприятное: надо прописать все устройства на координатор и заставить их работать по сценариям.

Снова помогает LLM. Например, настройка одной розетки выглядит так:

ZbSend {"Device":"0x0303","Send":{"Power":1}}

Настройка диммера уже так:

ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0101":1}} ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0202":500}}

У разных устройств команды разные. Я спрашивал, проверял через консоль, снова спрашивал…

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

Схема работы: запрос к LLM → проверка в железе через консоль
Схема работы: запрос к LLM → проверка в железе через консоль

.Финальный аккорд: LLM написал мне готовый сценарий настройки координатора на Berry Script (встроенный язык сценариев в Tasmota)», «autoexec.be — файл автозагрузки для настройки координатора

Код autoexec.be

import webserver import string class ZigbeeButtons # --- Инициализация класса (запускается при создании объекта) --- def init() # Подписываемся на событие срабатывания Таймера 1 # Когда в Tasmota сработает Timer1, запустится функция run_dimmer_sequence tasmota.add_rule("Clock#Timer=1", /-> self.run_dimmer_sequence()) end # --- Логика последовательности команд для диммера (Berry) --- def run_dimmer_sequence() print("ZigbeeButtons: Starting dimmer sequence.") # Переменная для хранения текущей яркости var current_bri = 10 # 1. Сразу подаем команду включения и установки яркости 10 tasmota.cmd('ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0101":1}}') tasmota.cmd(string.format('ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0202":%d}}', current_bri)) # Опредяляем функцию шага, которая будет вызываться каждые 3 секунды def dim_step() current_bri = current_bri + 2 # Увеличиваем на 2 if current_bri >= 1000 # Если яркость достигла 1000 (или больше) print("Sequence finished. Resetting to 10 and Turning OFF.") # Ставим яркость 10 tasmota.cmd('ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0202":10}}') # Выключаем tasmota.cmd('ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0101":0}}') else # Если меньше 1000, отправляем новую яркость и планируем следующий шаг print(string.format("Setting brightness to: %d", current_bri)) tasmota.cmd(string.format('ZbSend {"Device":"0xEF0C","Endpoint":1,"Write":{"EF00/0202":%d}}', current_bri)) # Рекурсивно запускаем этот же таймер через 3 секунды (3636 мс) tasmota.set_timer(3636, dim_step) end end # 2. Запускаем первый таймер цикла через 3 секунды после старта tasmota.set_timer(3636, dim_step) end # --- Веб-интерфейс (без изменений) --- def web_add_main_button() webserver.content_send("<p></p>") # Кнопки для устройства 0x0303 webserver.content_send("<button onclick='la(\"&zb303_on=1\");'>0x0303 ON</button>") webserver.content_send("<button onclick='la(\"&zb303_off=1\");'>0x0303 OFF</button>") webserver.content_send("<br>") # Кнопки для устройства 0x554E webserver.content_send("<button onclick='la(\"&zb554e_on=1\");'>0x554E ON</button>") webserver.content_send("<button onclick='la(\"&zb554e_off=1\");'>0x554E OFF</button>") end def web_sensor() # --- 1. Логика обработки нажатий кнопок --- if webserver.has_arg("zb303_on") tasmota.cmd('ZbSend {"Device":"0x0303","Send":{"Power":1}}') end if webserver.has_arg("zb303_off") tasmota.cmd('ZbSend {"Device":"0x0303","Send":{"Power":0}}') end if webserver.has_arg("zb554e_on") tasmota.cmd('ZbSend {"Device":"0x554E","Send":{"Power":1}}') end if webserver.has_arg("zb554e_off") tasmota.cmd('ZbSend {"Device":"0x554E","Send":{"Power":0}}') end # --- 2. Вывод времени (Local Time) --- var now = tasmota.rtc() var time_str = tasmota.strftime("%H:%M:%S", now['local']) # Формируем строку и отправляем var msg = string.format("{s}Local Time{m}%s{e}", time_str) tasmota.web_send_decimal(msg) # --- 3. Вывод Timer 1 --- # Запрашиваем информацию о первом таймере var t1_res = tasmota.cmd("Timer1") # Проверяем, что ответ получен и содержит ключ Timer1 if t1_res != nil && t1_res.contains("Timer1") var t1_time = t1_res["Timer1"]["Time"] # Получаем время, например "07:00" # Формируем строку по тому же шаблону var msg_t1 = string.format("{s}Timer 1{m}%s{e}", t1_time) tasmota.web_send_decimal(msg_t1) end end end var zb_buttons = ZigbeeButtons() tasmota.add_driver(zb_buttons)

Процесс был итеративным: спросил → скопипастил → перезапустил → не заработало → скормил логи → повторил. Ну да, вайбкодинг для embedded.

Настроечный стенд
Настроечный стенд

Что настроил

Утренний рассвет

  • За 30 минут до будильника свет начинает разгораться с минимума.

  • Цветовая температура меняется от тёплой (примерно 2000K, как свечи) до более белой (2700K, как утренний свет), во всяком случае, я так думаю, глядя на раскаляющуюся вольфрамовую нить.

  • Если в календаре ранняя командировка — рассвет начнётся раньше.

  • Выходной — сдвигается на более позднее время.

Попробуйте сделать такое с покупным светобудильником.

Розетки с главного экрана

Включение/выключение нужных розеток без лишних приложений и квестов.

Защита от протечек

После срабатывания любого датчика протечки закрываются оба крана — на горячей и холодной воде.

Вечерний режим

Раз уж система готова, добавил обратный процесс — плавный закат за час до сна.

Свет постепенно теплеет (до 2000K) и гаснет. Организм получает сигнал: пора вырабатывать мелатонин.

Засыпание улучшилось ощутимо — неожиданно приятный бонус.

Что в итоге изменилось

Без иллюзий и восторженных соплей — сухие факты через месяц вывода света на люстру, пишу по памяти от варианта номер 2.0, эта статья - кейс по помощи LLM в настройках умного дома.

Утро

  • Просыпаюсь за 5–10 минут до звукового будильника (теперь он просто страховка).

  • Нет ощущения «вырвали из сна».

  • Первый час — нормальная работоспособность, не зомби-режим.

  • Кофе стал вкусовым выбором, а не медицинской необходимостью.

Вечер

  • Засыпаю быстрее (субъективно минут на 15–20).

  • Меньше туплю в телефон перед сном — тёплый свет как-то настраивает на отключение.

Общее

  • Ощущение «день/ночь» вернулось даже в декабре, когда за окном вечная тьма.

  • Настроение стабильнее, меньше зимней хандры.

Я не стал бодрее как кролик из рекламы батареек — давайте без иллюзий. Но я хотя бы перестал начинать каждый день как зомби…

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

Для тех, кто хочет повторить

Работа с 220В опасна! Если нет опыта — лучше нанять электрика для монтажа электропроводки.

Минимальный вариант (если не хочется паять)

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

(Внимание: возможна несовместимость! Из трёх купленных мной диммеров нормально заработал только третий. Первый, заказанный на Ozon, оказался нерабочим. Второй понимал только команды вкл/выкл, игнорируя уровень яркости. Будьте готовы к перебору железа)

Продвинутый вариант

Кастомная прошивка железок, интеграция с кучей сервисов, автоматические сценарии на все случаи жизни. Потолка нет.

Главное — не покупайте закрытые коробочные решения. Они умрут, устареют или просто не будут делать то, что вам нужно. А вы останетесь с железом, которое невозможно перенастроить, переделать и нормально интегрировать.

А как вы планируете возвращаться в рабочий ритм после праздников? И какие DIY-проекты пилите на каникулах, пока есть время?

P.S. В заключение повторюсь, что на деле не все так радужно, как у меня написано в статье. Про прошивку моего координатора стоит написать отдельную статью, что там надо прошивать 2 прошивки, на координатор и шлюз зигби, да еще следить за питанием, да еще аккуратно замыкать контакты для включения загрузки. Без крепкого опыта по прошивке аналогичных устройств браться не советую. Если никогда не прошивали аналогичные железки через программатор - не рекомендую. Лучше купить готовое.

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу [email protected] для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.