Клиент-серверное решение для телеметрии на пивоварне своими руками

Ниже пойдёт речь про внедрение на пивоварне телеметрии, для чего я сделал хардварное устройство и управляющий хост в облаке с нуля.

Спойлер: первоначальная цель была достигнута в полном объеме, но планы по захвату рынка не удались.

В моей первой статье на vc.ru хочу поделиться историей об очередном стартапе, который ничем, кроме пилота, не стал (да, это отсылка к фильму Тарантино «Криминальное чтиво»).

Так как это мое первое художественное произведение, прошу судить строго, пинать сильно в комментариях, критиковать не стесняясь и по делу, и просто так! Иначе зачем вообще вам все это читать, а мне писать… Тем более ниже текст минут на 15.

Прелюдия

Итак, все началось с того, что, придя однажды в гости на пивоварню своего хорошего товарища, я обратил внимание на разбросанные по столу Arduino, реле и прочие дары AliExpress. Было это в самом начале 2018 года.

Так как я периодически сам баловался подобными игрушками, это меня заинтересовало. На вопрос, что он хочет этим делать, товарищ поделился болью: хочет из дома видеть температуру в своих холодильниках и ЦКТ. Потому что отказ какого-нибудь кондиционера среди лета мог запросто угробить пару тонн вкусностей, превратив их в невкусности.

Знающие люди не станут спорить, что в пивоварении сразу после воды и совести пивовара по значимости идет температурный режим. На мой вопрос, почему он не купит готовое промышленное решение, товарищ ответил, что те решения, которые он знает, не решают его задач полностью.

Делать на заказ получится дорого, и в принципе он уже придумал: присоединит датчик температуры к Arduino, Arduino проводом к стационарному компьютеру, а на стационарный компьютер будет заходить через TeamViewer и смотреть в монитор порта, куда Arduino будет выводить температуру.

Я представил себе этот процесс и поморщился. Это же коряво и неудобно. Но, как говорят умные люди: критикуешь — предлагай.

После подробного интервьюирования задача зазвучала так: находясь где угодно, в нужный момент пивовар может иметь возможность видеть температуру с каждого из нескольких датчиков на пивоварне.

Если температура вдруг повышается выше пороговой, должна быть возможность автоматически включить кондиционер или открыть кран в охлаждающий контур (охладить). При этом решение не должно быть дорогим. От себя я добавил, что решение должно быть по-возможности универсальным, потому что такая штука, со слов товарища, интересует многих его коллег.

Запахло стартапом!

Универсальность

Сразу скажу, что пивоварни в принципе все одинаковые. Везде есть варочный порядок, есть бродильное отделение, есть холодильники для вызревания и хранения. Но при этом абсолютно все пивоварни разные.

У всех разный набор танков, состав и объем варочного порядка, схемы и способы охлаждения, расположение всего этого в пространстве. И каждый пивовар (со слов моего товарища) решал проблему телеметрии и автоматизации своей пивоварни индивидуально.

Найти умельца или компанию, которая развесит по пивоварне датчики с ЖК-дисплеями и парой кнопок, не вопрос. Но если нужно, чтобы была какая-то общая логика, цена сильно возрастает, потому что решение нужно делать индивидуально под конкретный состав пивоварни. А если еще и с интернет-доступом…

Такое решение обычно состоит из датчиков, запорной аппаратуры и пульта управления. Пульт обычно состоит из монитора, набора кнопок для управления и, конечно, компьютера с мозгом. Цена подобных решений, понятное дело, складывается из стоимости проектирования, программирования, инсталляции и железа. Сделали, получили деньги за разработку и установку, и до свидания, до очередных доработок.

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

Со всей этой информацией я ушел думать.

Что придумал

Решение, которое описано выше (как у всех), было сразу отметено. Хотя с точки зрения заработка, конечно, идеально: понятно, за что брать сразу много денег, можно дорабатывать за денежку (при каждом изменении количества датчиков, например). Но это неинтересно, нужно же приносить счастье и при том недорого. А недорого можно, если тиражировать решение, в которое вложился один раз.

Вспомнил я про имеющийся у меня подобный Arduino микрокомпьютер с десятком портов и, главное, с Wi-Fi на борту. Сама железка небольшая, таких в спичечный коробок пара поместится, стоит копейки на AliExpress, продается без проблем во многих магазинах и проверена временем.

Как получать с нее данные, допустим, понятно. Самое правильное — клиент-серверная архитектура. Где сервер — это сервер, а устройство — это клиент. Как управлять разными реле в зависимости от температуры на разных датчиках, тоже понятно. Но раз я хочу универсальность, то нужно решить, как не перепрограммировать контроллер для разных конфигураций пивоварни.

Решение было найдено. Решено было делать железку всегда только с одним датчиком температуры и одним реле. Реле на железке управляется в зависимости от показаний датчика этой же железки. Вот и универсальность.

На каждом холодильнике будет по отдельной автономной железке, и на каждом ЦКТ тоже. Каждая железка будет самостоятельно подключаться к общему Wi-Fi и самостоятельно приходить на сервер. Сервер будет принимать данные и возвращать команды на железку. И показывать оператору в браузере картинку со всеми имеющимися устройствами.

Таким образом можно оснастить пивоварню любой конфигурации необходимым количеством устройств, каждое из которых не нужно будет программировать отдельно, только настроить. Настройку тоже можно сделать с сервера. Для управления температурным режимом ЦКТ, холодильника, комнаты, автомобиля, погреба такого решения вполне достаточно.

Организовать Wi-Fi в помещении или даже в нескольких, понятное дело, не проблема. Затраты на избыточное (как может показаться) железо при таком раскладе с лихвой окупаются возможностью легкого масштабирования и отказоустойчивостью, а так же отказом от более дорогого железа в проекте. Не нужны отдельные ПК, мониторы, провода. Смартфон есть у каждого в кармане, ПК есть в каждом офисе.

Каждая железка будет жить отдельной жизнью, а главное, если понадобится добавить пару ЦКТ, не нужно будет вообще ничего переделывать. На сервере не будет изменяющейся логики, так как независимо от количества датчиков и реле каждая их пара (отдельный модуль) будет обрабатываться индивидуально.

Оператору не нужно будет обходить каждый объект, чтобы увидеть его температуру, достаточно достать из кармана смартфон.

Саму железку собрал в модульном исполнении, где каждый модуль можно заменить или отключить. Состоит из, собственно, микрокомпьютера, адаптера питания с АС 220 В на DC 5 В, реле и цифрового термодатчика. При желании запросто можно убрать реле или подключить устройство напрямую к питанию 5 В. При этом на самом устройстве нет ни монитора, ни других органов управления. Все только с сервера.

Конечно, в будущем пришлось бы добавить еще модуль с картой памяти и какую-либо сигнализацию, но пока и так нормально. Я же пока делал решение для одного пользователя, хоть и с расчетом на захват всего рынка. Ха-ха.

Мне такое решение показалось изящным.

Как делал прототип

Дальше были три месяца погружения в новые для меня области знаний, которых ранее приходилось касаться очень поверхностно. В свободное от работы время (вечерами и в выходные) я увлеченно кодил, изучал, гуглил:

  • Изучение и выбор веб-сервера.
  • Установку его на виндовый ноутбук, отжатый у дочери.
  • Изучение PHP с книжкой.
  • Разработку протокола обмена данными между железкой и сервером.
  • Программирование железки на поддержку передачи данных на сервер.
  • Программирование железки на понимание ответов от сервера.
  • Программирование обработчика на PHP, который принимает запросы от железки, выполняет некую логику, передает ответ.
  • Проверку всех сценариев работы сервера и клиентов.
  • Изучение MySQL по книжке.
  • Разработку базы данных.
  • Прикрутку БД к сайту на PHP.

За три месяца был готов прототип (назовем его MVPr, это как MVP, только прототип), написанный собственноручно, который работал. Был кривенький, косенький, но работал. То есть железка была собрана на макетной плате, а сервер был просто двумя страницами на РНР и БД. Но так и задумывалось.

Устройство еще на макетной плате​
Устройство еще на макетной плате​

Время было потрачено еще и на проверку возможности управления варочным порядком с помощью этой же архитектуры (только конфигурация железки изменялась).

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

Опыт показал, что так тоже можно, оно работает. Сам UX/UI такой варки тоже оказался сильно отличающимся от всего того, что было известно мне. Как правило, лучшее, что можно было найти, — возможность загрузить файлом определенного формата закодированный рецепт в Arduino и смотреть на него через крохотный ЖК-дисплей. Я же сумел построить нечто иное. Но для этой конфигурации я не стал делать MVPr, не все сразу.

Перспективные перспективы

Пока я все это делал, меня посетили несколько простых мыслей.

Выбранная архитектура позволяет без доработок подключить к серверу сколько угодно пивоварен. А это отсутствие затрат на разработку индивидуального решения и возможность предоставить сервис по подписке.

Порог вхождения новых пользователей при этом снижался практически до стоимости устройства, даже одного, что, конечно, никакими капитальными затратами не могло быть, так как стоимость устройства оценивалась не дороже аналогов без всякой телеметрии. Оплата за сервис при этом была бы ежемесячная, как за интернет.

В каждой пивоварне может быть сколько угодно железок, даже одна. В каждой пивоварне может быть несколько пользователей (операторов). Разные логины, разные идентификаторы железок, и вуаля. Тиражирование — проще простого. Включаешь железку в сеть и все, она уже видна на сайте тому оператору, к чьей пивоварне она привязана.

По нагрузкам тоже все довольно понятно – хочешь, используй на одном сервере, или запусти пять серверов. Да и в случае особой надобности развернуть такой сервер можно и локально. А еще можно прикрутить мобильное приложение и уведомления в браузер. Разработка и развитие такого решения тоже не проблема, так как используемый стек технологий, пожалуй, самый распространенный. Короче, очень гибкая штука получалась.

Плюс, вокруг можно запросто собрать сообщество пивоваров со всеми вытекающими плюшками. Потому что на сервер заходили бы все и постоянно.

Можно было и не ограничиваться пивоварнями. В магазинах, складах тоже есть такие потребности, и их можно удовлетворить тоже без доработок.

Стартапом уже не пахло, он был виден невооруженным взглядом!

Аутсорсинг

На то чтобы сделать админку, авторизацию пользователей, а самое главное — адаптивный резиновый интерфейс, у меня уже знаний не хватало. Чтобы хоть как-то сделать это решение работоспособным в адекватные сроки с моими знаниями, нужно было использовать какой-либо фреймворк.

Но я и так потратил три месяца на простейший прототип, а изучение фреймворка отбросило бы запуск еще на неизвестное время. В таком виде, как сервер написал я, выкатывать его в интернет было нереально. Он не мог назваться даже прототипом.

Я решил ускориться и взялся за то, что мог сделать сам, бесплатно и быстро: сел писать подробнейшее ТЗ на разработку сервера для фрилансера.

Так как писать требования к разработке программных продуктов — это моя работа, а то, что нужно сделать, я только что сделал сам, проблем с написанием не возникло.

Я поверхностно провентилировал тему фреймворков, прикинул их возможности и ограничения, поэтому точно знал, чего хочу. Через пару дней был готов документ на 18 страниц и подробным описанием желаемого. Причем это был не поток сознания, часто выдаваемый за ТЗ (знаю по собственному опыту фриланса, хоть и далекому уже), а именно техническое задание.

Описано было все техническим языком, структурировано, формат преимущественно UC/US, была описана структура БД, с подробным описанием каждой таблицы, макеты всех экранных форм. Не было нерешаемых задач, потому что все так или иначе было мною сделано.

Были описаны все сущности админки с привязкой к таблицам БД, были прорисованы алгоритмы обработчиков, были описаны требования к развертыванию и критерии приемки работ. Даже требования к логированию и защищенности от кибератак были описаны.

Алгоритмы обработчиков при этом были описаны, наоборот, очень поверхностно, так как я сам собирался доработать эту часть в уже готовом решении. Мне нужно было это уметь делать самому, так как эта часть была самой изменяемой частью кода сервера.

Далее я пошел на Fl.ru, где и была найдена пачка исполнителей, готовых взяться за эту работу. Почти неделя ушла на переговоры с фрилансерами, чтение пространных рассуждений о том, что, раз это стартап, то надо платить программисту 100 тысяч рублей и что там работы на два месяца на самом деле. Но я был непреклонен и отсеивал кандидатов.

Я знал, что нужно сделать и в каком объеме, и знал, что если за работу возьмется тот, кто знает фреймворк на уровне «сделал три сайта на нем», то там делов на 16 часов с перекурами.

Потому что все до последней таблицы было описано, все тесткейсы были прописаны прямо в требованиях, никакого дизайна, никакой необходимости вникать, что же там должен делать обработчик.

По сути, работа сводилась к тому, чтобы развернуть и настроить фреймворк на сервере, добавить БД с нужными таблицами, описать три-четыре простейших алгоритма записи в БД и чтения из нее. При этом денег, конечно же, я хотел сильно сэкономить.

Деньги были мои собственные. Мой единственный заказчик — хороший пивовар, но денег у него никогда нет, он инвестировал в проект глубокие знания предметной области. Деньги (кроме своих знаний) я решил инвестировать с расчетом на то, что вложения отобьются, если сервис взлетит хотя бы у трёх пользователей.

В результате выбор остановился на студенте без отзывов, но из моего города и того же вуза, в котором учился я. Благодаря тому, что ТЗ было написано так подробно, а я пообещал ему отзыв на сайте, он согласился.

Деньги были небольшие, очень небольшие, да еще и без предоплаты и без безопасной сделки. Это были мои условия. Справился парень хорошо. По ходу работ уточнял непонятное, работал небыстро, но не терялся. Я относился к нему с заботой, то есть не гнал его, не ковырял мозг и подробно отвечал на все вопросы (по жизни это тоже часть моей работы). Он поэтому до конца не верил, что эта работа лично для меня:).

Работа заняла примерно неделю, если я правильно помню. Когда тестовый сервер стал доступен в интернете для меня, я «включил тестировщика» и за вечер по своим же требованиям сам протестировал сайт. После чего студент исправил замечания и получил деньги.

В ответ я получил архив с сайтом и инструкции по развертыванию, а также согласие развернуть это в прямом эфире на арендованной VDS под моей учеткой, что и было сделано за полчаса. Сервер заработал. Теперь я мог по-честному подключать железки к интернету.

Над интерфейсом не морочился вообще. Оформили в виде табличек для каждого имеющегося устройства. В будущем планировал вместо табличек использовать изображения ЦКТ и холодильника, подкраску цветом в зависимости от температуры и прочие свистелки.

Незамысловатый дизайн
Незамысловатый дизайн

Стартап, это же настоящий стартап!

Первый блин как положено

После этого я за пару дней дописал и проверил обработчик, настроил пару организаций и зарегистрировал по паре железок. Ну и собрал (спаял за кухонным столом) пять железок, чтобы уже иметь возможность включить их по-взрослому.

Железки упаковал в электрические распаечные коробки. Не, ну а что: влагозащищенная, пожаробезопасная, недорогая, хоть и выглядит не очень презентабельно.

Первое устройство​
Первое устройство​

Примерно в это же время случился запуск на настоящей пивоварне в тестовых целях, весьма показательный. Причем не на пивоварне заказчика, как предполагалось в начале (так вышло чисто логистически).

Знакомый пивовар моего товарища согласился на установку одной железки у себя на пивоварне. Я приехал, прицепил железку на танк с ледяной водой, и уехал. Замысел был в том, что косячное управление охлаждением не должно было принести существенный материальный вред, в отличие от танка с двумя тоннами пива. Как в воду глядели.

Через день раздался звонок с подопытной пивоварни с плохими новостями. Оказывается, что-то пошло не так, и реле, включающее охлаждение этого танка, почему-то не выключалось и пыталось его охладить изо всех сил. Охлаждался он рубашкой с циркулирующей жидкостью из другой емкости, чиллера, где эта жидкость остужалась.

Так как танк с водой имел внутри чуть больше двух тонн достаточно теплой воды, на его охлаждение уходила вся мощность небольшого чиллера, а все остальные танки (четыре или пять) с пивом, которые были включены в этот же контур охлаждения, чуть было не перегрелись.

Осознание такого фейла было поначалу жестким. Еще бы, вместо порчи двух тонн пива чуть не испортили десять. Но, благо, ничего реально критичного не успело произойти. Люди на месте увидели проблему и отключили охлаждение, а затем я приехал и отключил реле.

Разбор полетов показал ошибку в коде сервера. В том коде, который писал я сам. Тестирование его не выявило, потому что, как оказалось, я не учел все возможные варианты по переключению целевой температуры. Код я, конечно, поправил, но вот охота повторять эксперимент у этого пивовара больше не наблюдалась, конечно, жаль. Хотя я на берегу с ним оговаривал этот момент, предупреждал, но понимаю его, конечно.

Первая железка с отключенным реле до сих пор, уже почти два года, висит на том танке и исправно шлет температуру на сервер.

​Это она :)
​Это она :)

Что же дальше

После этого был запуск решения у моего товарища, для которого все и придумывалось, весьма успешный. Работает до сих пор весьма стабильно. На пивоварне трудятся три устройства, я получаю свое вознаграждение в натуральной форме…

Далее все развивалось очень и очень неспешно, если вообще это можно назвать развитием. Других желающих заиметь себе такой же крутой сервис почему-то не появлялось.

Все, кому показывали решение, кивали, говорили, что отличная штука, что удобно, но дальше дело не шло. Сам я продвижением не занимаюсь никак, оставил все на плечах товарища, который вращается в кругах целевой аудитории.

Предполагаю, что дело в том, что мало кто захочет устанавливать на своем производстве самодельную поделку, без сертификатов, гарантий, согласованного SLA, гарантий непрерывности деятельности в конце концов. Плюс дизайн совсем никакой, даже домена нет, в адрес нужно вбивать IP. И я их в этом понимаю.

Пару месяцев назад получилось по случаю напечатать более-менее презентабельную коробочку для железок. Коллега по работе осваивал купленный 3D-принтер и для меня нарисовал и напечатал простенькую коробочку совершенно бесплатно. Напечатав коробочку, я подумал, что теперь это уже можно сфоткать и показать людям, и сделал под это дело лендинг на Tilda. Заодно попробовал Тильду, сделал все за полдня.

Эпилог

Что сказать в заключение. На весь проект от идеи до запуска у заказчика понадобилось около пяти месяцев. Я потратил около 20 тысяч рублей на разработку и железо из Китая, в ответ получил и желаемый результат, и много опыта.

С одной стороны, основная цель достигнута — боль заказчика была удовлетворена, все работает. С другой стороны, не удалось раскрыть заложенный в решение потенциал, конечно.

Чтобы раскрыть, то есть сделать этот сервис настоящим сервисом, доступным многим (как задумано) и за деньги, надо оформлять его, завернуть поделку в подобающую обертку и снабдить нужными документами. То есть поделка, которая работает, еще не есть продукт.

Оформлять я не пробовал, но, судя по предполагаемым действиям, это такая хренова куча разных интересных проблем, что непонятно, с чего начать. А главное, непонятно, нужно ли. Я имею в виду задачи от патентных вопросов, от производства придуманных железок в надлежащем виде и качестве, их сертификации и до понятных квестов по оформлению юрлица, безопасных образцов договоров, процедуры внедрения, переписывания сервера.

Конечно, если есть цель, то все проблемы — это лишь задачи, которые можно запланировать и решить, найти деньги, знающих людей. Но так как за полтора года никто всерьез не заинтересовался темой, в целесообразности сего мероприятия есть сомнения.

Возможно, мне не хватает заказчика, который был бы заинтересован в использовании сервиса и показал, что эта самоделка может иметь коммерческий смысл. Но с учетом того, что я писал выше, скорее всего, тут замкнулся круг. Нет пользователей — нет продукта, нет продукта — нет пользователей.

Есть мысли разделить и властвовать. Открыть протокол, например, чтобы желающие могли собирать такие же железки самостоятельно и подключаться к серверу. Или собрать заинтересованную команду с нужными умениями и навыками и добить полностью все самостоятельно.

То есть варианты есть всегда, было бы желание.

Не исключаю, что кто-то, прочитав этот текст, сделает это быстрее меня и завоюет рынок. Время покажет. Если история примет интересное продолжение, напишу еще.

Надеюсь, не утомил. Спасибо за внимание!

3131
17 комментариев

Подобные задачи обычно решаются связкой ПЛК + Scada. Но велосипеды это наше все. Держите плюсик!

4

Есть большая потребность в аналогичных решениях на холодильных установках. Мы делали подобные вещи на базе навигационного оборудования с датчиками температуры. С оповещением по sms и telegram. Ваше решение гораздо экономичнее. Рынок открыт) Удачи)

3

Мониторинг и реакцию на события конечно лучше делать на базе Zabbix или Prometheus. И с дашбордами там все намного лучше

3

У меня как раз следующий проект - автоматическая пивоварня, писал об этом тут в статье про робота-бармена.

Правда я уже немного дальше вас зашел. Если доведете все до конца, то интересно будет потом сравнить продукты.

Удачи в разработке!

1

Поправьте иконку телеги на сайте, она ведет вникуда. Советую рассказать о вашем проекте на форуме домашних пивоваров на сайте беер.рф. Там достаточно активное сообщество и много НЕдомашних пивоваров в том числе.


Начните с создания темы в разделе оборудование и расскажите про устройство. Могу с этим помочь напишите в телегу @illustrarium

1

Спасибо за замечание! Поправил

Ну защитить все это можно очень быстро на https://udiar.net

1