Во время пандемии COVID-19 и переводе на удалённую работу многие столкнулись с тем, насколько сложно иногда разделить личное и рабочее пространство, особенно при постоянных звонках и видеоконференциях. Лично для меня одной из часто встречающихся мелких, но раздражающих проблем было прерывание: родители звонили позвать на обед или ужин, не узнавая, что я занят на встрече. Так родилась простая, но действенная идея — использовать сигнал, который визуально подсказывал бы окружающим о моём статусе занятости. По примеру красных ламп в больничных коридорах над дверями врачей, я приобрёл умную лампу и взрослым языком программирования Go создал систему, которая автоматически включала и выключала эту лампу в зависимости от событий моего Google Календаря. Идея не нова, но то, как эта задумка воплотилась в жизнь, оказалось настоящим путешествием в мир технологий.
Всё началось с учёбы и экспериментов: изучение Google API на базе домашнего задания по API Gmail дало первые навыки работы с облачными сервисами Google. Затем я наткнулся на open source библиотеку openhue-go, которая позволяла управлять умными лампами Philips Hue через программный код. Соединение этих компонентов — календаря, кода и лампы — стало естественным следующим шагом. Основная логика приложения оказалась несложной, хотя и требовала тщательной проработки. Необходимо было регулярно получать из Google Календаря список текущих событий на день, объединять перекрывающиеся временные промежутки, чтобы лампа по времени отражала статус занятости, и отправлять команды на включение и выключение лампы.
Таким образом, лампа горела красным цветом всё время выросшего рабочего дня или важных встреч. Для уменьшения частоты запросов к устройству применялся механизм троттлинга, который позволял не перегружать сеть и девайс лишними сигналами. Код периодически проверял таймером каждые несколько секунд зону времени текущего и следующего событий для принятия решений об обновлении состояния лампы. С технической точки зрения одним из ключевых вызовов было обеспечение постоянного обновления данных. Так как события могли изменяться — появляться новые, отменяться старые — использовался Google Watch API, который поддерживает получение push-уведомлений об изменениях календаря.
Система периодически синхронизировалась через специальный webhook, что позволяло своевременно реагировать на обновления без необходимости постоянной интенсивной выгрузки данных. Этот подход хорошо показывает, как сервисные архитектуры сочетают проброс событий и актуальное состояние. Техническая часть авторизации и доступа к Google Календарю не обошлась без сложностей. Для постоянного автозапуска на сервере без участника человека единственным возможным вариантом была авторизация через сервисный аккаунт Google. Чтобы этот аккаунт мог просматривать события моего основного календаря, приходилось вручную делегировать ему доступ, а также тщательно учитывать нюансы работы с понятиями «primary» календаря, так как для сервисного аккаунта «primary» — это его собственный календарь, отличающийся от моего.
В результате для обращения к моему календарю в API использовался email-адрес владельца, что предотвращало неоднозначности. Завершением пусконаладочных работ стала покупка самого оборудования: белая лампа Philips Hue для экономии и подходящего функционала, а также мост (Hue Bridge), который обеспечивает сетевую коммуникацию между приложением и лампой по протоколу Zigbee. Покупка обошлась примерно в 6300 INR, и только с оборудованием закончились расходы. Настоящим испытанием стала проблема сетевого взаимодействия. Приложение запускалось на арендованном VPS, находящемся в облаке, а мост и лампа — в домашней локальной сети.
Простое прямое обращение по IP-адресу было невозможно без опасного открытия домашнего роутера в интернет. В сети появилась идея использования VPN, но «ручное» создание и настройка VPN-сервера показались излишне сложными для хобби. Решением стала технология Tailscale — современный easy-to-use mesh VPN, позволяющий объединять устройства в виртуальную локальную сеть независимо от их физического расположения. Установка клиента Tailscale на VPS и Raspberry Pi в домашней сети позволила мосту и серверу обмениваться командами через безопасное и приватное соединение. Это устранило необходимость сложной настройки роутера и обеспечения безопасности.
Для обеспечения работы устройства на домашнем сегменте сети потребовалась покупка Raspberry Pi 4 Model B, на который установили собственный агент — небольшой веб-сервер, принимающий команды от приложения и управляющий лампой через openhue-go. Дополнительные расходы на Pi, аксессуары и блок питания составили около 8000 INR. Несмотря на мелкие технические неудобства с корпусом и SD картой, Raspberry Pi стал незаменимым звеном в достижении цели. Управляющий агент принимает запросы в формате JSON с информацией о состоянии лампы — включена ли она, яркость и цветовая температура (Mirek, меред). Такой уровень детализации позволяет задавать комфортное освещение в зависимости от ситуации, что открывает множество вариантов будущих улучшений и применения — от тихих сигналов до будильников, способных разбудить без звука, используя световую индикацию.
Весь проект стал для меня не только увлекательной игрушкой, но и настоящей школой практических знаний. За время работы я освоил не только программирование на Go, но и погрузился в работу с облачными API, технологиями аутентификации Google, REST, вебхуками, Raspberry Pi и VPN. Настройка и поддержка собственного проекта на VPS открыли мир DevOps, контейнеризации и безопасности. Особенно ценно, что этот навык удалось осваивать на базе реальной, полезной задачи, а не просто учебного примера. Это дало мотивацию доводить всё до рабочего продукта и не бросать на этапе прототипа, как бывало ранее.
Особенно радостен был первый раз, когда я увидел, как лампа сама загорается, реагируя на событие календаря — этот момент ознаменовал своеобразный «мини эврика» в моём техническом пути. Кроме того, проект вдохновил на новые идеи: интеграция с другими умными устройствами, расширение функционала оповещений, создание универсального локального сервера управления умным домом и многое другое. В итоге из простой идеи сигнализации для семьи вырос целый mini-смарт-домашний проект. По опыту могу сказать, что даже небольшой технический проект, основанный на личной потребности с необычным сочетанием современных технологий, может стать отличной стартовой площадкой для изучения и практики. При этом стоит готовиться к тому, что часть времени уйдёт именно на разбор тонкостей и ошибок, возникающих при интеграции сложных систем, сетевых взаимодействиях и безопасности.