Накопилось много чего для публикации. Но я всё откладывал, потому что подозреваю, что публика ждёт от меня проектов на 1С, например новый релиз ИИконы, поэтому хотел закончить её. Но от 1С меня уже тошнит, хватает задач и на работе, поэтому отвлекаюсь прокрастинацией, то есть побочными проектами для души. Недавно посмотрел, как чувак сделал реальный светофор сбоку экрана, который показывает текущий статус работы ИИ. Подумал — чем я хуже, полезная же вещь, тем более у меня завалялась лампа Гайвера — прикольная штука, если её включать) Но я её больше года не включал — в общем, решил приобщить её к своей работе…
Главный цвет — тот, который зовёт
На словах проект звучит почти глупо: лампа меняет цвет, когда клод-код что-то делает. Ну да, ещё одна мигалка на столе, спасибо, очень не хватало.
Но смысл оказался не в том, что синий означает работу.
Смысл в жёлтом.
Жёлтый — это когда я нужен. Клод просит разрешение на команду или задаёт вопрос и стоит. Не просто красиво светится — буквально зовёт меня обратно.
Для меня это важнее, чем кажется. Я могу отвернуться от терминала, залезть в другую задачу, провалиться в свой 1С-шный колодец, и лампа боковым зрением скажет: Роман, подойди, без тебя дальше не поедем.
Раскладка получилась такая: синий — агент копает, жёлтый — ждёт меня, зелёный — затих и можно не смотреть, красный — что-то умерло.

Технически там вообще без магии. Клод-код умеет дёргать хуки на событиях. Хук запускает маленький Python-скрипт, тот отправляет один HTTP-запрос в лампу и заканчивает работу.
Никакой вечной службы рядом я не держал. Хватило команды, которая просыпается на секунду.
Мне нужен был светофор, а не дискотека
Сначала я полез смотреть, что вообще можно залить в лампу Гайвера.
Родные и околородные прошивки там бодрые: эффекты, будильники, рассветы, огоньки, вся эта красота для нормальных людей. Проблема в том, что мне не нужна красота. Мне нужен тупой цвет по сети.
В гайверовских форках я не нашёл удобного способа командовать ровным цветом снаружи. Может, он там где-то и был, но после нескольких заходов я понял, что опять иду чинить не свою задачу.
Взял WLED.
Он шьётся из браузера, умеет пресеты, нормально принимает команды по HTTP и не делает вид, что лампа обязательно должна изображать северное сияние. Для моего светофора этого хватало.
Дальше началась возня с кабелями.
Micro-USB как проверка характера
Я воткнул лампу в компьютер. COM-порт не появился.
И тут была не одна причина, а сразу две. Очень удобно, когда железо не просто ломается, а устраивает тебе маленький квест.
Первая — кабели. Воткнул один, поменял на второй — оба «только зарядка»: с виду нормальные micro-USB, а внутри нет линий данных. Подошёл только третий. Таких кабелей у меня хватает, чтобы убить вечер, но недостаточно, чтобы сразу понять подвох.
Вторая — мост CP2102. Windows сама драйвер не поставила, поэтому даже с рабочим кабелем счастья сразу не случилось. Поставил руками — порт появился.
Вот так и выглядит хард-дебаг без романтики: пара врущих кабелей и не вставший драйвер. Прошивка в этот момент вообще ни при чём.
Роутер был слишком умный
WLED прошился. Лампа подняла свою точку доступа. Я скормил ей домашний WiFi — и она не вошла в сеть.
Клод бодро начал копать в сторону «ты, наверное, выбрал не ту сеть». А у меня где-то в памяти чесалось другое.
вроде бы я читал что лучше разделить, по-моему именно в этом ошибка
И да, тут я оказался прав.
ESP8266 умеет только 2.4 ГГц b/g/n. А Redmi у меня держал 2.4 ГГц в Wi-Fi 6, то есть ax, плюс 2.4 и 5 ГГц жили под одним именем через band-steering. Для современных устройств удобно. Для старого чипа — каша, в которой он просто молчит.
Разделил диапазоны. Включил у Xiaomi «режим совместимости Wi-Fi 5» — по факту он гасит ax. После этого 2.4 стала обычной 802.11n, и лампа зашла в сеть с первого раза.
Я угадал, а клод копал не туда. Не удержался, потребовал признания:
ну вот скажи мне «ты как всегда прав»))) а я тебе же говорил)
Пины не надо угадывать
После WLED всплыла сенсорная кнопка на макушке. Лампа физически её имела, но прошивка не знала, где она висит.
Можно было тыкать пины наугад или лезть смотреть на самой плате, куда идёт провод. Но проще оказалось открыть исходник Гайвера на гитхабе и прочитать.
Там лежало BTN_PIN D2. Заодно там же нашлись параметры матрицы: 16×16, GRB, зигзаг.
Зелёный оказался болтуном
Когда лампа уже светилась, я повесил хуки клод-кода на пресеты и решил, что дело почти закрыто.
Потом запустил агента на фоновую работу: клод думает, а лампа зелёная.
вот ты сейчас думаешь, а лампа зелёная — что-то не так работает
Вот тут стало ясно, что цветом по событию не отделаешься.
Я сначала повесил зелёный на Stop. Звучит логично: ход закончился, значит можно зеленеть. Только у клод-кода Stop — это не «всё готово». Это конец текущего хода. Агент мог отдать работу в фон, сам вернуться в ожидание, а лампа уже сообщала мне: расслабься, всё спокойно.
Враньё.
Я убрал Stop из зелёного сценария. Теперь зелёный приходит от простоя: отдельное событие срабатывает примерно после минуты тишины, когда сессия реально не дёргается и не ждёт моего ответа.
Да, зелёный стал не мгновенным. Зато он начал означать нормальную вещь: можно не смотреть — сессия затихла и меня не дёргает.
Одна лампа, много желающих
Потом я сам себе усложнил жизнь, потому что гоняю несколько сессий клод-кода одновременно.
Одна сессия ждёт моего разрешения и просит жёлтый. Вторая в этот момент работает и ставит синий. Если просто слать цвета в лампу, побеждает последний запрос. А последний запрос — не всегда самый важный.
Пропустить синий не страшно. Пропустить жёлтый — это весь смысл проекта выбросить.
Я сделал арбитра. Лампа больше не верит каждой сессии по отдельности, а смотрит на общее состояние. Если хоть одна сессия ждёт меня, жёлтый залипает, пока я её не разблокирую. Синий или зелёный из другой вкладки его не перекрасят.
Поймал это почти сразу, вживую. Смотрю на лампу, внутренне уже начинаю ругаться, потом сам себя останавливаю:
а не, я вижу, есть активная сессия
И да, лампа была права. Во второй сессии клод ещё работал.
Обидно: железка следит за сессиями внимательнее меня.
Аудит ударил туда, где смешнее всего
Когда репозиторий был уже более-менее собран, я отдал его на ИИ-аудит. Пять агентов под разными углами: код, безопасность, документация — каждый своё.
И четыре из пяти независимо ткнули в одно и то же.
В публичном репозитории лежал ровно тот баг, который я у себя уже починил: Stop → зелёный.
То самое ложное «готово». То самое место, где лампа врала, пока клод ещё работал. У меня на столе это уже было исправлено, а в README и примерах конфига — нет.
Чинил живой экземпляр, а публиковал по памяти. Тупо.
Теперь перед публикацией просто сверяю репо с тем, что реально крутится у меня на столе.
Заодно аудит поймал более тихую мину. .gitignore в публичном репо не закрывал мой локальный файл с реальным IP и заметками. До утечки не дошло, но шёл я к этому уверенно: ещё один ленивый git add, и привет.
Исправил. Хорошо, что аудит это поймал.
Кто кого тут заменил
Код и инструкция лежат тут: github.com/andromanpro/claude-code-status-lamp.
На столе теперь стоит лампа, которая знает, когда я нужен. Маленький антигиперфокусный прибор: можно отвести взгляд от терминала и не бояться, что агент тихо ждёт разрешения уже двадцать минут.
Кода я не написал ни строчки — уже полгода за меня это делает ИИ. Да и всю отладку разрулила машина, от драйвера до ложного зелёного.
Мне осталось перебрать три кабеля руками и держать одну чёткую цель, пока лампа не заработает так, как я задумал.
Кто кого заменил — каждый решит сам.
P.S. И да, этот пост он тоже написал сам. Я только вычёркивал строчки, где текст звучал слишком по-ИИшному)