Проект: Solar Control  Публичный пост
21 июня 2020  2399
Solar Control
https://solar-control.tech

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 аккаунт, который отвечает на сообщения бота. Бот выступает в качестве маршрутизатора от пользователя к девайсу и наоборот
Система маршрутизации. Каждое устройство - 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 🙈 прости Господи) за все время:

Скриншот из CRM. Часть устройств продана по подписке
Скриншот из CRM. Часть устройств продана по подписке

Какие планы на будущее?

В разработке сейчас приложение под iOS, Android - его пишет мой друг на Flutter.

Скриншотики из Фигмы
Скриншотики из Фигмы

В планах:

  • добавить ML модуль, для отслеживания аномалий на станции (коих очень много)
  • закончить модуль удаленной конфигурации через личный кабинет
  • перевести кабинет в SPA
  • создать нормальную рекламную кампанию
  • открыть клиентскую часть системы в опенсорс
  • не сойти с ума 😂

Нужны ли какие-то советы или помощь Клуба?

Если у кого-то есть прекрасный опыт разработки аналогичных решений - добро пожаловать в комментарии всегда рад услышать взгляд со стороны!
Так же был бы рад услышать советы по поводу оформления сайта, либо кабинета.
Если увидите какие-либо баги - пишите мне в телегу или линкед - буду признателен за помощь!

Какой совет вы бы сами могли дать идущим по вашим стопам?

Не пытайтесь скомпилить TDLib на Raspberry PI либо развернуть его в Docker - сразу используйте Telethon!

Аватар 💀 Юзер-зомби
💀 Юзер-зомби @deleted
None[object Object]
📍None, Россия

Аккаунт-заглушка для удалившихся или куда-то пропавших юзеров.

Связанные посты
10 комментариев 👇

Вау. Люблю проекты, которые выросли из решения личной проблемы. И пост отлично написан, было интересно.

Не очень понял три момента:

  1. Судя по CRM в Notion, есть два варианта — подписка и разовая оплата. Сколько стоит? Почему цены такие разные?
  2. Как программно-аппаратный комплекс добирается до клиента? Кто устанавливает/подключает?
  3. Как обслуживать клиентские малинки? На них прилетают апдейты? А если беда какая-то (нидайбоже), как решать?
  Развернуть 1 комментарий

Йоу, спасибо за маленький баг-репортик 😉
Спасибо, мне приятно 😌

  1. Есть три разных тарифа - базовый, профи и vip, и два вида покупки - с подпиской: тогда мы платим только 100$ за оборудование в любом тарифе и в зависимости от тарифа 5,7,10$/месяц. Если же без подписки - вы покупаете оборудования + примерная стоимость окупаемости софта - 250,350,500$ соответственно. Основные различия - софт и гибкость интеграций. Базовый ты купил, и просто используешь как есть. При проф. комплекте я провожу индивидуальную настройку под необходимое оборудование - камеры охраны и т.д. При покупке ВИП - получаете в комплекте 7" сенсорный экран и круглосуточную поддержку. Все клиенты получают апдейты бесплатно и без вмешательства.
  2. Мой отец собирает аппаратную часть - собирает коннекторы и переходники, упаковывает устройство, цепляет на него QR кодик с ключом для доступа к боту и отправляет по почте с прошитой системой. Установка этого добра максимально простая - кабель вставляется в инвертор, устройство, и подключается интернет. После этого пользователь сканирует QR код, и я подтверждаю его заявку.
  3. Я не все уместил в статью - она и так достаточно объемная. У меня есть два резервных канала связи - REST-polling на мои сервера, с генерацией сессий, Anydesk с полным управлением через CLI. Так же есть аналог Remote Scripting массово на все устройства. Через парочку команд я могу перезагрузить их все, изменить им Anydesk алиас, и установить новый пароль для remote-acess. Весь процесс -удаленный, и нетрудоемкий :)
  Развернуть 1 комментарий

@AhlkHymIlAlN8p1H, а что насчет обновлений софта, установки патчей? Закрываете ли на Малинках все порты от доступа из интернета? Так как устройства расходятся по стране и стоят у разных клиентов, то в отсутствие актуальных патчей в какой-то момент система может превратиться в ботнет под чужим контролем, без возможности вернуть доступ :(

  Развернуть 1 комментарий

@Aldekein, Конечно! В основной прошивке закрыты все порты, кроме 80 на вход, и открыты порты для Anydesk.
Сами апдейты прилетают через систему релизов, которую я настроил через Github Releases - я помещаю туда обфусцифицированый код и все добро, собранное в архиве. pm2 - отслеживает изменение состояния файлов локально, wget не качает файл, если версия файла старее, чем та, что есть. Брутально и просто :D

  Развернуть 1 комментарий

Впечатляет. 21 год. Почувствовал себя тормозом в свои 36.
Хотя в 21 конечно все схватывал быстрее и энергии было побольше :)))

Дима, вы молодец!

  Развернуть 1 комментарий

Спасибо! Если честно моторчик все равно имеет определенный запас прочности, поэтому я все чаще подумываю о походе к психотерапевту - появилась тревога, которая иногда выводит меня из строя :(

  Развернуть 1 комментарий

Отличный проект, хоть и очень нишевый.
Тоже все хочу взять себе малинку или андруино и чтото поделать физическое. Но времени все нет :(

  Развернуть 1 комментарий

Спасибо! Да, он действительно очень нишевый и в этом его прелесть - что-то из совершенно другого, незнакомого доселе мне мира)
Я уверен у тебя все получится! Тут в этом деле главная хитрость убедить себя, что это дело на пару минуточек 😉

  Развернуть 1 комментарий

Офигенно

  Развернуть 1 комментарий

Спасибо!

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб