Разбираю, как это устроено: два раздельных канала, deep sleep и почему будильник сознательно отделён от управления.
Задача: ПК нужен, но не круглосуточно
Уезжал в долгосрочный отпуск. Дома оставалась рабочая машина с RTX 5090, и я знал, что GPU понадобится: локальные модели, обработка медиатеки, эксперименты. Варианты были такие:
Почему не подошёл
Отклонённые альтернативы и причины: оставить ПК включённым на весь отпуск — недели 24/7 впустую тратят энергию, плюс ПК без присмотра; облачный GPU — платить аренду за железо, которое уже стоит дома; попросить родню нажать кнопку — ПК не у родни, а сценарии вроде «перезагрузи, если завис» они не осилят.
Оставалось четвёртое: пусть компьютер спит, а разбудить его я могу сам — одной кнопкой с телефона. Для этого нужен исполнитель, который живёт дома постоянно, почти ничего не потребляет и умеет послать компьютеру Wake-on-LAN. Это ровно описание ESP32.
Два канала: будильник и пульт
Ключевое решение проекта — разделить включение и управление. Они происходят в разных состояниях машины: wake-on-LAN нужен, когда ПК выключен и на нём нет ничего, кроме BIOS; команды — когда Windows уже загрузилась. Попытка уместить оба сценария в один механизм обычно и ломается: агенту нужен работающий ПК, а его как раз нет.

Схема: телефон → веб-панель на VPS → два канала — серверная команда/ESP32/Wake-on-LAN и MQTT/Windows-агент → домашний ПК
Канал-будильник. На VPS лежит маленькая веб-панель под паролем. Кнопка «Включить» оставляет на сервере короткую команду, которую плата забирает при очередном пробуждении. Дома плату ESP32 — размером примерно с флешку — разбудит магический пакет Wake-on-LAN: шесть байт FF и шестнадцать повторов MAC-адреса сетевки. Пакет летит по UDP на оба широковещательных адреса сразу — 255.255.255.255 и направленный типа 192.168.1.255, — потому что часть роутеров пропускает только один из них.
Командный канал. Когда Windows загрузилась, автоматически стартует агент на PowerShell и подключается к MQTT-брокеру на том же VPS. MQTT — очень лёгкий протокол обмена сообщениями, по сути маленький диспетчер: кто-то публикует команду в топик, кто-то её получает. Именно через него ПК начинает слушать всё, что я скажу.
Что делает ESP32 — и чего не делает
Плата почти всё время спит (deep sleep, единицы микроампер). Каждые пять минут просыпается по таймеру, подключается к Wi-Fi, читает команду и делает одно из:
включение — шлёт серию Wake-on-LAN и повторяет цикл, пока ПК не ответит: проверка простым TCP-подключением к агенту. Состояние «будим ПК» хранится в RTC-памяти и переживает собственный deep sleep — поэтому «уснул на полпути» здесь невозможен по построению.
- выключить / перезагрузить / заблокировать — передаёт работающему ПК через локальный агент.
- проверка связи — присылает отчёт в Telegram: Wi-Fi и уровень сигнала, температура чипа, онлайн ли ПК, причина последнего перезапуска платы.
- любая другая строка — уходит на ПК как команда cmd.exe.
Из приятного в железе: тактовая частота снижена до 80 МГц, у радиомодуля включён modem sleep и урезана мощность передатчика — плата с USB-питанием почти не греется. Telegram-уведомления идут не напрямую в API, а через личный n8n — так все сообщения системы собираются в одном месте.
Когда Windows проснулась
Загрузка Windows поднимает двух агентов (обычный start.bat в автозапуске): HTTP-агент на порту 8080, по которому ESP32 проверяет «жив ли ПК», и MQTT-агента, слушающего брокер. Дальше из панели доступны:
- ключевые слова: выключить, перезагрузить, заблокировать, усыпить;
- произвольные команды cmd и PowerShell — с возвратом вывода в Telegram;
- запуск программ: exe, bat, скрипты, python;
- кнопка, поднимающая программы удалённого подключения, — для ситуаций, когда нужен не чат с консолью, а экран.
Отдельный сценарий — домашний AI без облака: с телефона поднимается reverse SSH-туннель, и локальная Ollama на 5090 становится доступной снаружи так, будто это облачный эндпоинт. GPU работает ровно столько, сколько длится задача.
И предохранитель от меня самого: если я разбудил ПК и забыл о нём, агент простоя замечает 60 минут без движения клавиатуры и мыши, предупреждает в Telegram и выключает машину — с минутой на отмену.
Честные ограничения
- Нужен домашний интернет. Если роутер лёг или отключили свет, разбудить ПК нечем — ESP32 честно рапортует в Telegram, что Wi-Fi недоступен (команда ping_esp32 покажет и это).
- Wake-on-LAN надо один раз включить в BIOS/UEFI сетевой карты. Это единственная настройка «в железе», и о ней легко забыть до первого теста из отпуска. Тестируйте до отъезда.
- Зависшая Windows не управляется. Если система повисла так, что агент не отвечает, командный канал молчит. Wake-on-LAN здесь не поможет — машина уже включена.
- Будильник — это не шифрованное управление, а короткая команда на сервере. По сути, одно слово, которое плата забирает по HTTPS; безопасность держится на авторизации панели и том, что команды короткие и ожидаемые. Для домашнего сценария — достаточно; для «дать коллегам» — нет.
Во что это сложилось
Итоговая стоимость и состав системы:
~$7 единовременно (ESP32 ~$2 + уже имеющиеся USB-зарядка и скрипты) + ~$5/мес за VPS, где ESP32 выступает будильником, получающим команды с сервера и отправляющим Wake-on-LAN, USB-зарядка обеспечивает питание платы 24/7, VPS host’ит веб-панель, MQTT-брокер и файл команд, а PowerShell-агенты исполняют команды на ПК.
Итог: дома 24/7 работает плата за два доллара, а RTX включается только тогда, когда действительно нужна, — и сама гасится, если о ней забыли. Это первый работающий шаг из направления Robotics Lab: дальше — управление розетками и датчиками той же связкой, а потом и складские роботы.
FAQ
Почему не пробросить Wake-on-LAN из интернета напрямую? Проброс UDP-порта в домашнюю сеть — постоянная дыра в периметре. И нет статического IP адреса. ESP32 находится внутри сети, шлёт серию пакетов на оба broadcast-адреса и подтверждает включение — надёжнее и безопаснее.
Почему не умная розетка? Розетка рубит питание — для Windows это эквивалент выдёргивания шнура, с риском для файловой системы. И после обесточки Wake-on-LAN может не работать. Здесь выключение — штатное, через систему.
Сколько потребляет ESP32? В deep sleep — единицы микроампер. С учётом подъёма по таймеру раз в пять минут за год набегают копейки: питание идёт от обычной USB-зарядки.
А если ПК завис намертво? Командный канал замолчит — агенту нужна живая Windows. Признаём честно: от зависания спасает только обесточка, то есть умная розетка. Это следующий шаг той же лестницы.







Комментарии 3
Войти, чтобы комментировать