Больше, чем понедельники, слякоть и безбашенные водятлы на дорогах, меня бесит будильник — маленький цифровой садист. Каждое утро он вырывает меня из сна с точностью и безжалостностью неумолимого палача.
Причём бесит не сам факт пробуждения (я всё-таки взрослый человек и понимаю, что проекты сами себя не напишут), а то, как именно это происходит. Резко. Грубо. Без предупреждения.
А за окном в декабрьском Петербурге такая же беспросветная тьма, как и в час ночи, когда я наконец заставил себя закрыть редактор кода. И тут раздаётся этот звук. И ты подскакиваешь с матюгами, как будто у тебя рабочий сервер упал.
И дело не в лени и не в слабой воле — дело в банальной физиологии, которую почему-то никто не хочет учитывать.
Немного физиологии (куда без неё)В глубине мозга у нас есть настоящий дирижёр суточных ритмов — крошечный, но очень важный центр, который держит в руках ниточки нашего бодрствования и сна. Он живёт по одному главному ориентиру — свету. Утром, когда лучи солнца попадают на сетчатку глаза, этот центр получает чёткий сигнал: «Всё, ночь закончилась — пора просыпаться!»
По сути, это внутренние часы организма, которые синхронизируются по внешнему источнику — солнцу. Когда света нет — а в Питере зимой его нет примерно пять месяцев — организм просто не получает команду «просыпайся». Он думает, что ещё ночь. Потому что, ну технически — ещё ночь.
62 солнечных дня в году, если верить статистике. Шестьдесят два. Это как часы без нормального источника точного времени: вроде тикают, но с такой погрешностью, что всё плывёт.
Зимняя ночь северных городов — это насилие над человеческим организмом приспособленным к жизни в африканских саваннах и немножко в Средиземноморье. Я живу в Петербурге уже много лет, и до сих пор каждую осень переживаю один и тот же кризис — когда солнце начинает заходить в четыре часа дня, а вставать по-прежнему нужно в шесть, моя нервная система просто отказывается это принимать.
Однажды я прочитал исследование о том, как свет влияет на пробуждение. Там была фраза примерно такая:
Сорок процентов! И это не какой-то сложный биологический хак — это просто свет. Который можно запрограммировать. Я пошёл по пути наименьшего сопротивления: купил готовый светобудильник за совершенно негуманные деньги. Потом ещё один.
И знаете что? Они работали. Реально. Просыпаться стало легче, утренний зомби-режим сократился. Но через пару месяцев начало накапливаться раздражение:
Убогое управление. Кнопки, примитивный дисплей, листание цифр по кругу. Каждый раз — как программирование калькулятора из восьмидесятых.
Слабые светодиоды. Для эффекта нужны нормальные лампы. И лучше больше.
В этот момент я понял: пора делать самому.
Идея была простая:
микроконтроллер;
симистор (диммирование);
выход на люстру.
Бюджет — около 1000 ₽.
Программирование — в классической IDE. Опторазвязки: одна — чтобы ловить фронт сетевого напряжения, вторая — чтобы управлять симистором.
Экран и нормальное управление я не сделал, потому что… великая лень. Время и «сигнал рассвета» задавал старым светобудильником — через фототранзистор.
Свет светодиодных ламп (и тогдашних на момент проектирования люминисцентных энергосберегаек) меня как сигнал к пробуждению категорически не устраивал. Есть что-то неестественное в их спектре.
Поэтому я поставил обычные лампы накаливания.
Работало. И работало хорошо:
яркий приятный свет на уровне подушки;
плавный «рассвет».
И да — нет ничего более постоянного, чем что-то временное. Агрегат так и не дождался нормального корпуса и экрана, но прожил лет 7.
И вот наконец дошли руки интегрировать всё это безобразие в умный дом на ZigBee:
менять время будильника с телефона, не вставая с кровати;
интегрировать с остальным умным домом;
автоматически сдвигать «рассвет» по дням недели;
добавить вечерний режим — плавный закат перед сном.
Заниматься прошивкой старого микроконтроллера для этого мне уже сильно не хотелось.
Система умного дома управляет беспроводным диммером, который регулирует люстру на лампах накаливания.
Железо
Беспроводной диммер 900 ₽
Координатор умного дома 900-3000р
Почему ZigBee, а не Wi‑Fi? Да хотелось, чтобы датчики жили от батареек долго и потому что устройства объединяются в устойчивую сеть через друг друга, энергоэффективны, и я устал от гаджетов, которые отваливаются при каждом чихе роутера.
И вот тут начинаются грабли: закрытая система eWeLink + китайское облако, постоянные отвалы интернета, отсутствие уверенности, что всё это будет жить дальше.
Несмотря на то, что у меня уже были координатор, датчики протечки и краны, последней каплей стала совместимость: при подключении любого устройства ты играешь в лотерею — заработает или нет. В частности, выбесила невозможность подружить мой координатор с новыми умными розетками:
Так я принял решение уйти в открытую прошивку Tasmota. Далее почти весь процесс шёл с активной помощью современных LLM (названия не привожу, чтобы не обвинили в рекламе).
Без этой помощи я бы не перевёл свой умный дом на открытую прошивку за один день.
Помня, сколько времени я тратил на написание скетчей для будильника, подозреваю: чтобы завести весь свой зоопарк устройств вручную, мне бы потребовалась неделя.
Для начала я просто спрашивал LLM: как прошить мой координатор Sonoff ZBBridge Pro на Tasmota. Для сравнения: поиск через Google/Яндекс на первой странице не дал ничего толкового. Да, для заливки нужен паяльник (подпаяться к плате) и программатор. У меня был такой:
.Дальше на координаторе появляется желаемая прошивка:
И вот начинается самое неприятное: надо прописать все устройства на координатор и заставить их работать по сценариям.
Снова помогает 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 написал мне готовый сценарий настройки координатора на Berry Script (встроенный язык сценариев в Tasmota)», «autoexec.be — файл автозагрузки для настройки координатора
Код autoexec.beimport 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 прошивки, на координатор и шлюз зигби, да еще следить за питанием, да еще аккуратно замыкать контакты для включения загрузки. Без крепкого опыта по прошивке аналогичных устройств браться не советую. Если никогда не прошивали аналогичные железки через программатор - не рекомендую. Лучше купить готовое.
Источник


