У нас было 2 роутера MikroTik, 40 датчиков температуры DS1820B, 5 контроллеров на базе ESP32, полсолонки канифоли и гора проводов, термоусадки и всего такого, всех цветов, а ещё советский паяльник, трехфазный электромотор, пакет резисторов разных номиналов, упаковка китайских умных розеток и две дюжины твердотельных реле на 5 Ампер. Не то, чтобы это всё было нужно в поездке, но раз начал заниматься интернетом вещей, то иди в своём увлечении до конца. Единственное, что меня беспокоило – это Arduino. В мире нет никого более беспомощного, безответственного и безнравственного, чем программист, стартующий продакшен на подобном решении. И я знал, что довольно скоро мы в это окунёмся.
Введение в курс дела
Компания Evergreen запустила новый сервис доставки флористической продукции чтобы охватить растущий сегмент букетных мастерских, цветочных магазинов и центров флористики. За 2 года компания заняла 60% регионального рынка оптовых поставок цветов.
Проблемой оказалось то, что ключевые бизнес-процессы требовали большого количества ручного труда. Разборка и сортировка одной поставки цветов занимали 12 часов работы пяти человек каждую неделю. Параллельно шла стройка культивационных сооружений – теплиц и гидропонных “яслей” для рассады.
Меня зовут Кристофер Робин, я IT-специалист широкого спектра с пятнадцатилетним опытом. Возможно, это звучит немного странно или даже громко, однако это самое честное описание, которое я смог подобрать. За 15 лет в IT-сфере мне приходилось решать задачи от переустановки “винды” до руководства разработкой геоинформационной системы федерального проекта.
Приходилось настраивать сеть в офисах, распределенных по разным городам, бодаться с иностранными контрагентами о пунктах договора, верстать IT-часть бюджета на год, готовить корпоративный праздник и даже организовывать публичное мероприятие на 500 человек в парке ВДНХ.
Мне импонировала как команда проекта Evergreen, так и сама индустрия. C чем я только не имел дело, но сельского хозяйства еще не попадалось. Мне предстояло поработать с дюжиной молодых ребят, которые продают импортные цветы оптом, да еще и выращивают свои собственные в теплицах.
После нескольких skype-сессий у меня уже был образ задачи и я примерно представлял с чем придется иметь дело и какими инструментами можно решить тот или иной вопрос. И, самое главное, возник профессиональный азарт. То чувство, когда ты понимаешь, что можешь решить поставленную задачу на отлично, сделать все правильно настолько, насколько позволяют технологии и стандарты отрасли. Более того, я увидел возможность использовать технологии переднего края и создать качественно новый продукт в сегменте. К этому располагала как сама задача, так и настрой собственника.
С такими оптимистичными мыслями я чекинился на рейс в аэропорте "Внуково". В полете обдумывал всякие “киллер-фичи” с использованием компьютерного зрения и сверточных нейронных сетей для обнаружения паразитов на растениях, прогнозирование начала цветения, и, в целом, автоматическое управление узлами теплицы через машинное обучение по данным от сенсоров. Как часто это бывает, реальность оказалась жестче и прозаичнее моих технических фантазий.
Расстановка приоритетов
Пока я вдыхал, непривычный после Москвы, предгорный ветер и улыбался яркому южному Солнцу, собственник ввел меня в текущее состояние дел:
Через два месяца приезжает 20000 единиц рассады, ее нужно дорастить до размера высадки и перевезти в теплицы. Доращивать нужно в гидропонных стеллажах. Стеллажи есть, но гидропоники нет и светильников тоже нет.В теплицах нужно организовать контроль параметров среды, помочь ребятам в поле с водоснабжением и, вообще, пообщаться с биотехнологом и сделать все хорошо.
К 8 марта приезжает крупнейшая за 3 года поставка импортных цветов, без электронного учета мы физически не сможем ее обработать, нужно что-то придумать.
Три абсолютно разных направления с кучей подзадач, разными сроками, соподчинением и пересечением. И все относительно срочно. Пару дней ушло на сбор информации и общение с командой, наметилась структура плана. Важно было понять, что делать в первую очередь, в какое время можно переключаться на другие задачи и что можно запараллелить.
По теплице и рассаде вообще ничего не понятно, а рассаду ожидают уже через 2 месяца, поэтому я решил в первую очередь начать активную проработку этого направления. Вместе с архитектором накидали на бумаге схему гидропонной системы, определились с ключевыми узлами и архитектор построил 3D-модель и чертеж в Autocad. Рассчитали сечение труб, мощность насоса и систему слива.
С освещением ситуация оказалась гораздо сложнее. Вдвоем с биотехнологом в течении двух недель изучали формулы расчета спектра, рынок кристаллов и подбирали подходящих поставщиков. Привлекли эксперта-светотехника с опытом работы в сельском хозяйстве. Обзвонили все крупные производственные компании и нашли подходящие по спектральным параметрам светодиодные модули на базе кристаллов Samsung. Рассчитали потребление тока и подобрали подходящие драйверы.
Отдельная история – это доставка груза в регион (долго и дорого). Через неделю мытарств получили свой груз, собрали тестовый стенд и… испытали глубокое чувство разочарования и растерянности. Светодиодный цвет мерцал как стробоскоп на дискотеке. Для растений это не принципиально, но для инженеров это удар по самолюбию, да и просто невозможно находиться живому человеку в помещении с таким мерцанием.
С новыми драйверами стенд засиял ровным ярким светом, именно таким, какой ожидал биотехнолог.
Следующим большим этапом была сборка светильников. Светильник состоит из алюминиевого Г-образного профиля, светодиодных модулей, драйвера и электропроводки. На одном профиле размещается девять светодиодных модулей, шесть светильников на полку, две полки в стеллаже, семь стеллажей в помещении.
Нарисовали схему, вырезали лекала. Обучил команду правильной пайке и изоляции контактов. Организовал конвейер: один человек резал профили и сверлил отверстия, второй монтировал модули, спаивал контакты и делал проводку, а третий монтировал светильники на стеллажах.
Когда приехала рассада мы все еще собирали светильники. Работу распределили так, чтобы максимальное количество рассады можно было поставить на досветку. Так что, некоторое время, зеленью был покрыт весь пол помещения, чтобы она получала хотя бы отраженный свет.
Наша задержка оказалась не критичной, в помещении были большие окна и рассада хорошо перенесла неделю на совмещенном свете, чего не скажешь о нас. Чрезвычайно трудно таскать четырехметровые профили переступая через джунгли на полу. Но никто не говорил что будет легко. Главное – рассада под светом, можно идти дальше. Первый дедлайн преодолели.
Автоматизация учета продаж
Появилось время разобраться с учетом продаж и подготовкой к 8 марта. Из всей возможной автоматизации на объекте был только wi-fi и офисные компьютеры. Первым делом я начал разбираться с инфраструктурой. Нужно было поднять связь между офисом, розничным магазином и машиной для выездной торговли. Для этого я заменил домашние роутеры Tp-link на более функциональные MikroTik. Сменил тарифы провайдера и подключил белые ip-адреса. Такое решение позволило мне настроить шифрованный канал GRE+IPSEC между магазином и офисом. После объединения магазина и офиса я создал гостевой wif-fi для клиентов и отделил его от корпоративной сети. Для последующей настройки рабочего места выездной машины настроил VPN-сервер L2TP+IPSEC.
Сервер собрал из доступного железа – пересобрал некоторые машины. Core i7 и 20гб ОЗУ вполне хватает для 1С 8.3 с конфигурацией “Управление Торговлей”. В течении пары дней настроил и запустил 1С на MSSQL, реализовал правильное резервное копирование средствами SQL тремя разными способами с разным интервалом.
С клиентов собирают предзаказ, потом менеджеры проводят закупку на голландском аукционе, цветок приезжает в больших оптовых коробках. В каждой коробке лежат упакованные партии – банчи. Каждый клиент заказывает всего по немногу. Задача приемщиков состоит в сортировке оптовой партии на коробки-заказы для конечного клиента. Открывают коробку одного сорта и раскладывают из нее банчи по коробкам-заказам, потом следующая и так пока не распакуют всю поставку.
Прикрутил к этой красоте сканер штрих-кодов и запустил в продакшен. С этого момента в компании начался период ясности. Все покупки в магазине отражались в общей базе и офис мог видеть актуальные остатки, перемещение коробок отражалось в заказе, распечатать ценник и раскладку коробок по заказам можно было одним кликом. До этого только одна печать и расклейка ценников занимала несколько часов, а теперь девочки просто шлепали наклейки штрих-кодов на коробки. Карта компоновки цветка по коробкам также упростилась, не нужно было вручную составлять таблицу на каждый заказ. Распечатал сразу все заказы и раздал сборщикам.
Второй дедлайн закрыли раньше срока и даже успели обкатать решение до 8 марта.
Автоматизация в полях
Самое интересное началось в тепличном комплексе. Это поле – до цивилизации 50км, любой мелкий дождь размывает дорогу на пару дней. Каждый выезд – экспедиция в полной выкладке с рюкзаком. Комплекс состоит из двух стометровых теплиц и одной пятидесятиметровой.
Это очень веселая задача: десятиметровая мачта, ветер 15 м/с, коллега крутит антенну, а я с ноутбуком анализирую данные, обоих качает на лестнице как на лодке, глаза боятся – руки делают. Вычислили правильную позицию антенны, приварили металлическую стойку к мачте и смонтировали антенну. Сварка на высоте – зрелищное событие, искры расплавленного металла летят во все стороны и превращаются в длинные светящиеся линии. Как будто на концерте у Rammstein.
В свободное время я проводил коммерческую разведку. Оказалось, что в регионе, да и в сегменте в целом, ситуация выглядит в прямом смысле колхозно. Повсеместно ручной труд, из автоматизации максимум – это полив по таймеру и то не везде. Люди просто выращивают цветы по-старинке. Так было и в моем случае.
После нескольких планерок с полевой командой я выявил два главных направления в работе: сбор данных о параметрах среды для биотехнолога и автоматизация полива.
- Биотехнологу необходимо постоянно мониторить температуру и влажность воздуха в трех точках каждой теплицы и снаружи. По этим данным он рассчитывает количество препаратов, необходимых для внесения, а также корректирует график.
- Рабочие в теплице чаще и дольше всего занимаются поливом. Постоянно бегают переключать шланги и включать насос. Очевидно, что на датчиках температуры биотехнолог останавливаться не намерен, а количество теплиц будет расти. Система водоснабжения до конца не утверждена, а помочь рабочим нужно уже сейчас.
Проанализировав ситуацию я пришел к выводу, что нужно сделать масштабируемую систему, в которую по запросу можно добавить или убрать любой датчик и подключить или отключить любой активный агрегат.
Подбор конфигурации для IoT-решения
Наступило время подбора электронных компонентов. Провел комплексное исследование рынка, заказал и пощупал с десяток доступных девайсов. В финал вышли микрокомпьютер Raspberry Pi и микроконтроллеры ESP8266/ESP32.
- ESP мне понравилась с первого взгляда. Красивая и компактная железяка. Количество выходных пинов как в Raspberry Pi, есть встроенный wi-fi. Нашел для нее прошивку с языком Lua. Спаял первое устройство и написал код на lua. Оказалось, что реализация Lua сыровата и слишком громоздкая, ей не хватало памяти и система постоянно падала и вела себя непредсказуемо. Путь оказался тупиковым – Lua был уволен.
- Далее я попробовал написать код в Arduino IDE на его родном языке wiring. Много писанины, жесткий синтаксис, невозможно реализовать многопоточность, неприятный язык. Wiring тоже был уволен.
- Наконец-то я нашел реализацию python для контроллеров ESP, причем сразу двух видов. Проприетарный Zerynth и опенсорсный micropython. В качестве пробы платформы Zerynth я написал код для сбора данных о параметрах ветра: силы и скорости. Большим плюсом этой платформы является отличный IDE, однако в Zerynth не обнаружилось нормального способа реализовать планировщик заданий, а эта функциональность является критичной для моей архитектуры. К тому же платформа была платной и каждый прошитый контроллер стоил денег. В итоге Zerynth был тоже уволен.
- Наступила очередь micropython. В нем оказалось все прекрасно, за исключением нормального IDE, но для архитектуры и работоспособности системы это не критично, поэтому весь основной код для микроконтроллеров esp8266 и esp32 я написал на нем.
Погружаясь всё глубже в дебри iot-индустрии я разложил по полочкам все технологии и развернул на Raspberry Pi следующий стек: grafana, telegraf, mqtt, influxdb.
Общение контроллеров с нодой идет по протоколу MQTT и обрабатывается MQTT-сервером. Сбор данных идет через модуль telegraf и складируется в СУБД InfluxDB. Всей красотой заведует Grafana: обеспечивает визуализацию графиков в реальном времени. Также я написал несколько командных скриптов для ручного управления контроллерами, так как админ-панели пока еще не существовало.
Дело в том, что к RPI подключен внешний жесткий диск, на котором физически хранятся файлы базы данных. Такое решение необходимо для оптимального использования ресурса sd-карты, иначе поток данных с контроллеров просто убьет ее постоянными операциями записи. На этом жестком диске полно свободного места и туда удобно еженедельно складывать образы sd-карты.
Если вдруг произойдет авария и карточка умрет, то рабочий на месте достанет запасную чистую карточку, запишет туда последний рабочий образ, вставит в RPI и она будет работать.
Пока я конструировал правильную систему на своих микроконтроллерах, в теплицах развернул решение от китайской компании Sonoff. Это четырехпортовые контроллеры с мобильным приложением. Они довольно туповаты в возможностях, но благодаря мобильному приложению и облачной платформе зарекомендовали себя как удобный инструмент для прототипирования. Все рабочие установили приложение и я раздал доступы на насосы и выключатели. По мере готовности просто заменял sonoff на esp.
В качестве переходного решения написал скрипты интеграции сенсорной ноды и sonoff через API. Таким образом стало возможным создать систему автонаполнения емкости с водой. Включением насоса занимался Sonoff, а команду на включение давала сенсорная нода, опираясь на датчик уровня воды, данные с которого на ноду отправлял мой контроллер ESP.
Задача с уровнем жидкости в емкости подарила мне много ярких эмоций. Пришлось собрать промежуточный переносной прототип, чтобы залезть с ним на трехметровую пятикубовую емкость и сделать контрольные замеры уровня воды при полном баке, при пустом баке и зафиксировать уровень, при котором должна была включаться автоподкачка. Ощутил себя охотником за приведениями с такой гравицапой в руках.
Тем временем рассада подросла и началась подготовка к высадке в теплицу. Все насосы и электромагнитные клапаны подключил к системе и раздал доступы рабочим на смартфоны. Они были счастливы, так как перестали бегать через весь участок к выключателю и могли управлять всеми насосами и переключать направление воды из любой точки тепличного комплекса.
Мне удалось реализовать архитектуру системы, в которой можно быстро добавлять новые устройства, перенастраивать агрегаты на лету и комбинировать девайсы разных производителей.
Благодаря автоматизированной обработке заказов, у менеджеров в офисе высвободилось время для обучения студентов сортировке цветка. Привлечение наемных сотрудников для разбора поставок – важный этап развития компании, его постоянно откладывали, потому что на обучение физически не хватало времени.
Мое мнение об отрасли
Цветочный бизнес, как частное явление сельскохозяйственного сектора, остается одним из самых технически отсталых в России. Я считаю, что такое положение дел связано как с управленческой волей собственников, так и с недостатком кадров и недостаточной популяризацией отрасли среди молодых специалистов.
Хочется верить, что мой труд положил начало автоматизации цветочной отрасли в южных регионах.
Еще немного атмосферных фоток.
Выводы
- Если есть толковый инженер – не важно какую задачу решать.
- Если есть толковый управленец – он всегда найдет толкового инженера.
- Каким бы ни был толковым инженер и управленец, вдвоем они много не сделают – нужна команда.
- Если долго смотреть на проблему – она сама себя раскроет.
- Не бывает плохих или хороших решений – бывают решения которые работают и которые не работают.
Комментарии