Напоминаю, что у всех IT-шников есть свободное время. И хоть иногда хочется отдохнуть от моделей, потоков данных, презентаций и совещаний. Но что делать, если 5 дней в неделю ты занят, а на даче нужен полив? Надо совмещать интересное с полезным. Прошлая статья на мой взгляд получила в целом положительные отклики, поэтому с удовольствием расскажу, что же было дальше.
Как автономно поливать?
Чтоб свояка не доставать
И лишку не трясти соседа
Не ждать дождя после обеда.
А так, чтобы само включилось
Само пролилось, освежилось.
Где надо подогрев сработал,
А у меня свои заботы!
Жалоба
Известный факт, что Штирлиц в анекдотах обычно закреплял впечатление последней хорошей фразой, поэтому ругать нужно сначала. Для меня всё началось с попытки расширить rootfs на контроллере WirenBoard7 (ссылка). Тем, кто не в курсе поясню, что несмотря на достаточно богатый функционал с местом на корневой системе как-то не сложилось. Даже на почти пустом контроллере занято около 70%, что на ментальном уровне немного напрягает. И тут производитель предложил расширить раздел в два раза. Как я уже писал, никакой самодеятельности – только пользователь, а значит есть инструкция! Поехали.
Скрытый текст
Штирлиц выбил ногой дверь и на цыпочках подкрался к читавшему газету Мюллеру.
— Где ключ от сейфа?! — заорал Штирлиц и врезал Мюллеру в ухо. — Кстати, у вас не найдется канцелярских скрепок? Голос за кадром: «Штирлиц знал, что запоминается последняя фраза».
Первая попытка закончилась тем, что я полностью угробил систему. Крах! Вылечить можно было только откатом к заводскому состоянию. С одной стороны, работа не была на холоде или у плавильной печи, а во вполне уютной беседке, с кофе, под итальянское радио. В то время как остальные обитатели носились по участку с тяпками, поскольку они тут не могут ничего поделать, а ты можешь. Но с другой – делать двойную работу всё равно никому не хочется, завёл обращение в службу поддержки (ссылка) и перешёл в состояние «Ждём комментариев производителя». А в голове постоянно проигрывается мизансцена – встречаешь кого-то из знакомых, а он тебя спрашивает:
У тебя какой размер у rootfs?
Один
А у меня два!
И с чувством собственного достоинства отходит, а ты нервно куришь в сторонке, потому что у него два, а у тебя один. И ты ничего с этим сделать не можешь.

В итоге на помощь пришла служба поддержки производителя, которая проанализировав мои действия нашла ошибку и предложила два варианта продолжения попыток: простой – переход на тестовую прошивку и попытку «выехать» стандартными средствами и сложный – повторить тоже самое, обратив внимание на последовательность команд (оказалось, что я вместо «--» двух дефисов передал один. Причину сейчас объяснить не могу. Может невнимательность, может что-то посложнее). В итоге простой вариант не получился, но зато сложный позволил получить желаемое. Вместо 70% занятой памяти в рабочей конфигурации теперь имеем 44%. Это уже что-то, играемся дальше!
Кстати, а что же дальше …
А дальше продолжаем автоматизацию. Напомню, что в первой статье я боролся за климат у любимых огурцов, но обещал этим не ограничиваться (первая статья). Следующим шагом стало автоматическое управление фитоподпиткой. Сначала в ручном режиме – перед сном включаем лампы, потом судорожно пытаемся вспомнить, выключил или нет. А затем и в автоматическом:
раз в сутки (около полуночи) контроллер запрашивает общедоступный ресурс с целью узнать время восхода и заката в точке установки;
eсли инициирован переключатель о необходимости фитоподпитки, то за некую дельту до восхода солнца и на ту же дельту после заката солнца включаются фитолампы.
Здесь споткнулся о особенность framework от производителя. Допустим режим на панели управления включен, но если пересохраняется программа или контроллер перегружается, то сам по себе таймер включения фитоламп не запустится. Хотя бы раз нужно имитировать переключение клавиши управления запуска таймером. Дальше уже просто: выключил – таймер удаляется; включил – таймер запускается. Дальше больше – в момент объявления функции таймера ещё не объявлены другие объекты, которые дёргает функция. Решение было подсмотрено опять-таки в обучающих роликах от WB – файлы программ запускаются по алфавиту, стало быть те функции, которые должны запускаться после перезагрузки лучше положить в последний файл. И как говорили в КВН: «Надо поддерживать отечественного производителя!». Поддержали лишним просмотром обучающего видео - заработало.


Как уже писалось в первой части, раз в сутки контроллер отправляет небольшой статус о своём самочувствии в общую для всех пользователей группу Телеграмм. Добавил в эту группу прямую ссылку для перехода на панель управления и пользователей системой стало ощутимо больше. Раньше постоянно слышал – какая там температура в теплице; выключи воду; бочка пустая; а как свет включить… А теперь пользователи сами переходят по ссылке, сами включают. Красота!

Следующим шагом маленькой автоматизации стало управление освещением в беседке. Оно состоит из освещения внутри (плюс небольшие плафоны у входа) и трех прожекторов освещения участка, которые расположены рядом с камерами. Зачем так сделал пока объяснить не могу, скорее совпало. В темноте камеры автоматически включают инфракрасную подсветку, но если что-то нужно удалённо посмотреть – можно включить прожектора и сразу появляется цветной FullHD на экране. В общем, решение оказалось удачным – рекомендую (пример нарушителя периметра безопасности – в кадре).

Так вот, кто помнит развитие истории, я в начале накупил кучу разных блоков и больше половины было не то. Разумеется, чтобы считать себя рачительным хозяином нужно было не покупать WB как-то осваивать лежащие зря модули. Таким модулем оказался WBIO-DO-R10A. Конечно, же сейчас в портфолио компании есть куда более удобные модули с распознаванием коротких и длинных нажатий разных сочетаний. Мало того, у меня даже такой есть (WB-MCM8), но он стоит у бочки и выполняет другую функцию, да и принимать 220В он не может, а у меня, напомню, только один провод идёт от выключателя назад. Выходит, в него можно подать только фазу. Поэтому в беседке пришлось «костылить» простой WBIO и ему в пару WBIO-DI-HVD-16 (только не повторяйте за мной, просто исправляю свои же ошибки). Суть костыля в том, что тянуть лишние провода не хочется и к выключателю я протянул только один провод, разумно считая, мол, для включения света достаточно. А если нужны только прожектора или только освещение в беседке?
Выход был найден – кодируем первым нажатием включение света, вторым, если оно произошло на интервале в 5с., добавляем к уже включенному свету прожектора. Выключение света происходит с задержкой в те же 5с, чтобы распознать попытку включения прожекторов. В плюсе – возможность управления освещением удалённо, в двойном плюсе – наличие физического выключателя, к общению с которым привык весь социум без скидок на возраст.
Немного о расширяемости
Переходим в теплицу. В прошлой статье была ссылка на видео (вот она), где я ещё в зимней куртке демонстрировал подогрев и освещение, мелькнул временный распределительный ящик. С добавлением новых задач его ёмкости оказалось мало и установил герметичный, большой «Распределительный навесной щит МЭК ЭЛЕКТРИКА ЩРн-48». Из неожиданных достоинств – мгновенно снимаемая дверца, простым подъёмом вверх. Как же это здорово, убирать дверцу при монтажных работах внутри шкафа (но есть следствие, с перевёрнутого шкафа эта дверца так же легко и непринуждённо соскальзывает на ноги … это больно L). Ещё один момент, о котором нужно помнить начинающим монтажникам – сторона открывания двери. Я купил правильную, но признаюсь, не думал об этом. Как в известном анекдоте – предупреждаю …
Вот так он выглядит без дверцы и защитной крышки. Уж простят меня ценители прекрасного, перфекционизм в деле разводки распределительных шкафов мне недоступен. Но как уже не раз бывало в моём рассказе – обнаружилось две проблемы:
Насос поднятия давления в магистрали, которому была предназначена прекрасная жёлтая розетка Finder (ссылка, взял из-за цвета) нельзя было в неё включать, поскольку дверца тогда не закрывалась, а разрезать заделанный намертво шнур не хотелось.
Количество режимов, которые хотелось сделать с клапанами управления расширилось необходимостью управления ещё и видеокамерой, да и каждым вентилем в отдельности тоже желание управлять осталось.
И если со второй проблемой как-то можно было справиться, то с первой нужны были кардинальные меры. Неудача застала меня «в поле» (на объекте) и пришлось колхозить из того, что было. А было не мало: микроключ WB-MRM2-mini (ссылка), который можно было разместить в распределительной коробке; розетка, распределительная коробка и блок подключения питания по USB в единой цветовой гамме. Да это будет не только функционально, но и красиво! Смотрите этапы в небольшом фото-коллаже.
Получившаяся схема расширения обладает и достоинствами и недостатками. С одной стороны я вынес переключатель в другое место, чем освободил контакты с имеющегося реле. С другой, в распределительную коробку надо вести RS-485. В интерфейсе управления новый модуль выглядит вполне симпатично (см. фотоколлаж) и может быть включён в общий алгоритм автоматизации. И, собственно, пора поговорить по серьёзному, передача прав машине это прежде всего ответственность за действия выполняемой на ней программе и нужно учесть любые последствия, которые могут быть вызваны программными ошибками (вспомните Фобос-Грунт, ссылка).

Давайте попробуем разобраться, как лучше учесть всё и не потерять в деталях. Сосредоточимся только на автоматических сценариях, не рассматривая ручное управление – если схема управляется человеком, то ответственность на нём. Переключение между вариантами исполнения сценариев выносим на все элементы управления в виде переключателя режимов «Авт/ручной».
Функции автоматизации |
Общее |
Набор бочки |
Обогрев |
Полив |
Освещение (фито/лампы) |
Инициирование |
Всегда |
Мало воды |
Холодно |
Таймер |
Восход-закат/ «кто-то есть + темно» |
Выключение |
«Авт/ручной» |
Воды достаточно |
Достигнут порог |
Таймер |
Таймер/ «все ушли или светло» |
Индикация |
Статусные сообщения |
Зелёный свет |
Красный свет |
Зелёный свет |
Сами лампы |
Защита |
По питанию* |
Таймер Давление |
Контроль показаний температуры |
Таймер Мало воды |
Таймер |
Помощь при аварии |
Статусные сообщения |
Сообщение по неудаче |
Скрытый текст
Примечание: У развёрнутой мной схемы пока нет резервного источника электропитания, да и бывает, что кто-то принудительно передёргивает контроллер. В этом случае программа включения должна проверить состояние переключателей, которые использует каждый сценарий и либо запустить сценарий, если он был прерван, либо привести переключатели в нейтральное (нулевое) состояние.
Здесь нужны небольшие пояснения. Подобная таблица помогает не потерять нюансы при разборе сценариев на самом высоком уровне абстракции. В этом случае, добавляя столбцы (сценарии) мы загоняем их в общий шаблон логики, и ничего не упускаем. С другой стороны, если выявиться какая-то функция, которую необходимо реализовать (строка) – её можно транслировать на все сценарии, поразмышляв о том, как вы будете переходить из того или иного состояния. Пустых ячеек быть не должно – они свидетельствуют о том, что функция в сценарии не контролируется.
Пример: общее – это те функции, которые контроллер выполняет для всех сценариев. Включает этот режим хозяин, переводя переключатель в режим «автоматический». Если происходит зависание, то хозяин не получит статусное сообщение (например, каждый день в 10) и поймёт, что что-то случилось. Можно задействовать watchdog (аппаратный таймер перезагрузки), но моя система не настолько критична, чтобы на этом останавливаться. Также и при отключении питания, разработчик сценария должен реализовать программные примитивы, которые будут сохранять статус сценария в энергонезависимой памяти, чтобы при внезапном отключении/включении питания восстановить состояние контроллера и управляемых частей системы (правда с учётом стоимости труда разработчиков обычно дешевле купить источник бесперебойного питания :) ).
Отдельно остановлюсь на индикации – в прошлом году было несколько ситуаций, когда при поливе заканчивалась вода, но это не замечали, пока не добавил звуковую индикацию. Всё-таки автоматическая система должна интегрироваться в социум бесшовно и дружить даже с теми, кто не понимает в деталях как она функционирует. Согласитесь, не очень приятно получить из разбрызгивателя холодный душ на спину, потому что «по таймеру уже пора!» (правда от этого я защиту ещё не придумал и думаю несколько занятных историй ещё впереди).
И снова вода
Опять-таки вспоминая прошлую статью – сетовал на забивающийся фильтр и невозможность понять удалённо, что происходит какая-то проблема. В комментариях мне посоветовали врезать в линию датчики давления до фильтра и после, что и было сделано. Для чтения их сигналов используем модуль аналогового ввода WB-MAI6. Конечно, его конфигурация оказалась той ещё задачей. Не подозревал, что возможно изучить такое количество режимов. Но как говорили раньше «советское – значит лучшее» (это так благодарю своих преподавателей), разобрались. В принципе ничего сложного-то нет, просто одни пишут инструкцию под свой датчик давления, описывают конкретную схему, другие делают многофункциональный модуль ввода и предусматривают варианты на все случаи жизни. А тебе, как говорится, нужно только выбрать. Всё позади, датчик давления показывает около нулевое значение, при подаче давления из реки давление растёт – то, что нужно (см. рис).
Синяя линия это датчик давления до фильтра, оранжевая соответственно после. Пока фильтр установлен новый и вода относительно чистая, поэтому графики показаний с датчиков совпадают. В следующих выпусках расскажу подробнее, что мне это дало и как показания датчиков давления удалось учесть в графе переходов между состояниями внутри сценариев.

Заодно врезал счётчик для воды, который будет отслеживать объём проходящей в бочку жидкости. Счётчик оказался устройством простым, отсчитывает некоторый объём и замыкает контакты, а уже упомянутый в статье модуль дискретных и счётных входов WB-MCM8 занимается тем, что подсчитывает количество импульсов. Осталось только выяснить – чему эквивалентен импульс. Логично было предположить, что младшему значению (литру), а не так – он считает декалитры. Вот оказывается, где они нужны.
Выглядит красиво (ссылка на видео), и как всегда есть «но»! Счётчик считает 8 каналов независимо друг от друга, а вот сбросить можно только все разом. Ну как так … Как было бы здорово – сбрасываешь счётчик бочки, включаешь наполнение, по достижении 100 отсчётов (1 кубометр) выключаешь насос. Вот что теперь делать? Либо совсем забыть об функции сбрасывания, чтобы при старте каждого сценария, с задействованием счётчиков корректно запоминать стартовое значение. Либо … да нет, без либо. Разве что после перезагрузки обнулять. Ладно, об этом я подумаю позже.

Заключение
Вот мы и дошли до завершения очередного промежуточного этапа. Могу посетовать, что постепенно количество функций и условностей растёт и в голове не укладывается. Нужно создавать базу знаний, репозиторий кода, оформлять комментарии. Хобби мало-помало начало напоминать работу.
А с другой стороны, это интересно, осваивать новые знания, интерфейсы, налаживать функции, которые редко где можно встретить в быту. У меня остались ещё ворота, как я упоминал ранее, хочется научить их работать также дистанционно. В запасе есть ещё малыш WB-MRM2-mini, но к воротам ещё не протянут RS-485. Так что здесь вынужденная пауза.
Коллеги, предлагайте, что вы бы попробовали автоматизировать или какой интересный сценарий видите для реализации. Попробуем поэкспериментировать вместе.