TL;DR
Програмно-аппаратный комплекс мониторинга, для владельцев домашних солнечных станций, или как писать проект в сфере IoT на трех разных языках программирования и не сойти с ума.
Расскажите о себе и сути проекта?
О себе я уже достаточно много рассказал в одном из постов о нормальной службе в армии.
Вкратце - я Дима, 21 год, военный разработчик.
В свободное время пилю свой проект в сфере альтернативной энергетики, и еще один фин. стартап.
Как появилась идея? Что вдохновило?
Идея сделать свою систему пришла в голову моему отцу, который после некоторых жизненных обстоятельств, решил установить дома солнечную электростанцию (дальше СЭС).
В Украине достаточно распространненая практика установки таких станций, из-за "Зеленого тарифа", который позволяет продавать государству электричество по ценам, которые привязаны к курсу евро, да и в целом это дело выгодное.
Достаточно распространенная практика получения хорошего пассивного дохода в долгосрочной перспективе.
В итоге после установки возникает ряд проблем, которые нужно решить.
Основные из них:
- Что делать, если станция далеко и нет кому за ней следить, а статистику посмотреть хочется?
- Что делать, если на станции произошла авария, а ты не узнаешь, потому что нет нормального мониторинга?
- Что делать, если производители ориентируется на пром. потребителя и их системы достаточно сложны и избыточны?
Эти вопросы, и часть остальных проблем описана в моей статье "Как выбрать мониторинг для солнечной станции?"
В качестве ликбеза вкратце покажу как работает солнечная станция
Внутри каждого инвертора есть ПЛК (программируемый логический контроллер), и есть интерфейс RS-485/232.
В 80% ПЛК поддерживают открытый промышленный протокол обмена информацией между устройствами - Modbus.
Так как все, что было на рынке нас не устраивало, мы решили сделать свой мониторинг с блек-джеком и шлюхами
плюшками.
Что вошло в прототип и сколько времени на него было потрачено?
Прошло уже полгода с момента начала активной разработки.
Самый первый прототип был сделан за один день на NodeJS, Raspberry Pi, WebSocket и Java с Thymeleaf + jQuery + Socket.io.
Это был благочестиво сворованный через интернет шаблон дашборда, в который через WebSocket летели данные с Raspberry который по протоколу Modbus RTU вытягивал информацию с ПЛК инвертора.
Скриншотов у меня не осталось да прожило это решение не больше 2-ух минут - мое незнание азов работы с Node JS и асинхронностью выедало оперативную память "малины" и уводило её в аут.
Работало все это добро нестабильно и информации было ужасно мало.
Заканчивался мой летний отпуск 2019 года, и мы с отцом отложили все это в долгий ящик.
Долгий ящик продлился не долго, и уже в сентябре меня осенило - я хочу сделать все через Telegram.
Какой технологический стек вы использовали? Почему?
Когда я проектировал систему мониторинга, основными вещами, которые от неё требовались были:
- доступность с любой точки планеты с возможностью опроса инвертора для получения необходимой информации
- масштабируемость и гибкость
- возможность поддержки инверторов различных производителей одновременно (долой монополии промышленных компаний)
- стабильность и удобство использования (никаких сложных взаимодействий для пользователей, доступность в два клика и т.д.)
Как было сказано выше - я решил использовать Telegram, с его прекраснейшим Bot API, не очень прекрасным TDLib и достаточно развитым опенсорс-комьюнити.
Самыми сильными сторонами этой платформы я считаю:
- безлимитное хранилище данных (да-да, я использую телеграм как БД)
- скорость работы - даже с самым плохим 2г интернетом моя система стабильна
- возможность просматривать всю информацию при помощи простейшего поиска
Весь софт был помещен на Raspberry, который был у меня под рукой - из-за его компактности подключение к ПЛК не требовало особых усилий, а необходимым было только наличие переходника RS485 to USB.
Сама платформа для этой задачи изначательно была действительно очень мощной, но потом все стало на свои места.
Следующим этапом стал выбор архитектуры, основаной на Telegram.
Так, как я не хотел, чтобы моим ботом пользовался только мой отец - была придумана система маршрутизации между устройствами мониторинга и конечными клиентами.
- был написан первый прототип бота и Telegram клиента, который работал бы на Raspberry PI. Первая версия клиента и бот были написаны на Node JS из-за скорости разработки.
Для удобства создания маршрутов я использовал opensource API-first CMS - Strapi - она не раз меня выручала, когда не было достаточно времени, чтобы писать boilerplate CRUD.
Как выглядит клиент на Raspberry PI?
В качестве клиента выступал Telegram CLI с оберткой на NodeJS.
Для корректной работы был придуман свой вариант опроса регистров - существовало несколько библиотек которые требовали подключение к ПЛК, набор адресов регистров, тип операции (читать/писать/т.д.) и количество байт которые будут считаны.
В тот же день был придуман формат унификации протокола и "стандарт поверх стандарта" в виде списка регистров для опроса.
Это дает гибкость, возможность быстро менять спецификацию под другую модель/производителя инвертора и в целом - не требует вмешательсвта в код.
Когда я писал первый прототип клиента - у меня все еще были проблемы с асинхронностью и сам концепт обертки над Telegram CLI - был достаточно медленным и тормозящим.
Тогда же у меня возникли первые проблемы, которые приводили меня к мыслям - пора писать свой клиент поверх TDLib.
Только спустя 72 часа компиляции/кросс-компиляции и безрезультатных попыток сделать билд библиотеки я нашел Telethon.
Он же и лег в основу клиента версии 2.0, который теперь полностью работает на Python.
Как вы запускались и искали первых пользователей?
Первым моим тестировщиком и главным помощником был отец. Он настойчиво опрашивал девайс, искал баги и помогал в поисках клиентов. Сайта тогда еще не было и отец предложил "закинуть удочку" в группы по интересам, собравшиеся вокруг тематики домашних СЭС и барахолки с оборудованием для СЭС. Я написал коротенький пост в группы и в первый же день мы получили 50 коментариев и стали темой недели.
Мы получили первых клиентов именно из публикации в одной из таких групп. С тех пор запустился механизм сарафанного радио и получалось много звонков. Продав первые пять устройств мы начали понимать, что того функционала, что у нас был - стало мало.
Было решено обновить систему, создать сайт и начать первые шаги в соц. сетях.
В свободное от работы время я запилил первый прототип мобильного приложения и вместе с братом склепал лого для нашего продукта.
Дизайн был формой структуризации и создания следующего видения того, как будет развиваться наш продукт.
Этот дизайн не пережил тестирование функциональностью.
Мы подготовились с отцом на одну из крупнейших выставок в сфере зеленой энергетики SEF 2019, договорились сделать прототип устройства для продаж чтобы показать его частным фирмам.
Я заказал 3D печать корпуса и за день до презентации пытался всунуть в него экран, но небрежно подобранная мною модель совершенно не подходила под те задачи, которые я для неё запланировал.
За день я склепал простое приложение на React, сумел запустить Electron на Raspberry PI и запустить свое приложение. Оно жутко тормозило, но работало - я получал сообщения из Telegram и отображал состояние на экране.
Коробка все так же не сдавалась - пришлось при помощи ножа и строительного фена растопить холодное сердце пластик, чтобы вместить туда малинку с проводами и павербанком.
Бизнесу не понравился вид голых проводов и на логичный вопрос "Что вы продаете?" у нас не было ответа. Пристыженный этим "успехом", разозленный на себя я дал отцу слово, что нашу систему захотят покупать другие.
Что случилось после выставки?
Основные события после выставки:
- создание сайта нашего микростартапа
- мы наконец-то назвали его Solar Control, до этого ни имени, ни идеи не было
- я начал проектировать веб-кабинет для того, чтобы развернуть его на Raspberry, а позже и в большом вебе, чтобы каждый мог посмотреть состояние своих устройств через интернет, посмотреть графики по выработке, току, напряжению и т.д.
- 10 февраля защищал диплом с температурой 38.1
- 15 февраля улетел на хакатон в Мюнхене
- 24 февраля показывал проект, который мы делали по службе зам. министру.
Я начал разработку сайта нашей компании, который потом успешно захостил на Github Pages.
Первая версия была довольно корявой, не совсем адаптивной и не обьясняла ровным счетом ничего. Я не особо мог выражать свои мысли ясно в попытках совмещать учебу/работу/диплом.
Спустя некоторое время я пришел к неоходимости создания новой идеологии - данные у клиента, используя телеграмм мы и так ровным счетом не хранили у себя ничего, а с подходом - база + клиент на Raspberry все оставалось бы у него.
Так началась новая итерация - создание кабинета для доступа через браузер.
Параллельно я продолжал улучшение нашего сайта и спустя 3 месяца он уже выглядел так:
Текущая версия получилась гораздо понятнее и красивее и в текущий момент не требует множества доработок.
Посмотреть сайт можно тут
Как шла разработка веб-кабинета и какой у него технический стек?
После всех событий зимы/весны 2020 я взялся за разработку веб кабинета. Для его разработки я взял Java + Thymeleaf +MariaDB потому что мой основной язык разработки все же Java. За неделю был разработан первый прототип с концепцией генерации API-ключей и защиты для избежания искажения данных при отправке на сервер.
В качестве UI опять же был выбран бесплатный шаблон дашборда из интернетов.
Я имитировал Router при помощи jQuery, AJAX и Fragments в Thymeleaf. После того, как я понял что могут возникнуть проблемы при наращивании нового функционала / переписывании проекта было принято решение переписать сам клиент на Vue.js.
По своей специфике я back-end разработчик, но хорошо составленная документация и навыки ниндзи гугла помогли мне за неделю переписать клиент полностью, и выкатить демо-версию нового кабинета.
Я добавил туда 3 языка, ночную тему и сделал нормальную адаптивность. Так же я убрал шрифт Comfortaa который был достаточно спорным и делал мой продукт немного "детским".
Посмотреть новый кабинет можно тут.
С какими самыми неожиданными трудностями пришлось столкнуться?
Из самых болезненных:
- попытки сбилдить TDLib 72 часа, в том числе через кросс компиляцию и QEMU на виртуалке (я боялся за свою машину)
- отсутствие опыта работы с Raspberry Pi
- отсутствие свободного времени - диплом, хакатон, работа, учеба, наряд и все остальное отбирали время, которого всегда мало.
- отсутствие свободы и возможности отдохнуть - постоянное напряжение вызывало у меня выгорание от приступов работы на выходных, что выводило меня из строя на 2-3 дня
Сколько потратили и заработали? Есть идеи как это можно монетизировать?
Список основных трат:
- покупка шаблона на сайт с лицензией на поддержку и т.д. 9$
- покупка подписки на Voxgun для создания видеороликов 9$
- оплата 3D печати корпуса для выставки 30$
- месячная аренда сервера и платформы для бота 10$
Судя по CRM (я веду его в Notion 🙈 прости Господи) за все время:
Какие планы на будущее?
В разработке сейчас приложение под iOS, Android - его пишет мой друг на Flutter.
В планах:
- добавить ML модуль, для отслеживания аномалий на станции (коих очень много)
- закончить модуль удаленной конфигурации через личный кабинет
- перевести кабинет в SPA
- создать нормальную рекламную кампанию
- открыть клиентскую часть системы в опенсорс
- не сойти с ума 😂
Нужны ли какие-то советы или помощь Клуба?
Если у кого-то есть прекрасный опыт разработки аналогичных решений - добро пожаловать в комментарии всегда рад услышать взгляд со стороны!
Так же был бы рад услышать советы по поводу оформления сайта, либо кабинета.
Если увидите какие-либо баги - пишите мне в телегу или линкед - буду признателен за помощь!
Какой совет вы бы сами могли дать идущим по вашим стопам?
Не пытайтесь скомпилить TDLib на Raspberry PI либо развернуть его в Docker - сразу используйте Telethon!
Впечатляет. 21 год. Почувствовал себя тормозом в свои 36.
Хотя в 21 конечно все схватывал быстрее и энергии было побольше :)))
Дима, вы молодец!
Вау. Люблю проекты, которые выросли из решения личной проблемы. И пост отлично написан, было интересно.
Не очень понял три момента:
Отличный проект, хоть и очень нишевый.
Тоже все хочу взять себе малинку или андруино и чтото поделать физическое. Но времени все нет :(
Офигенно