[Из песочницы] ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска»
Основные тезисы или о чем эта статья
Так как интересы людей разные, а времени у людей мало, то кратко о содержании статьи.
Статья эта представляет собой обзор проекта контроллера с минимальной ценой и возможностью визуального программирования посредством WEB-браузера.
Поскольку это статья-обзор, направленная на то, чтобы показать «что можно выжать из копеечного контроллера», глубоких истин и подробных алгоритмов в ней искать не стоит.
Рассмотрена мотивация, идеи и результаты построения контроллера на базе WiFI-чипа ESP8266.
Предупреждение
Я не хотел писать эту статью. Я вообще не любитель писать статьи. Это надо думать и причем — много. Думать, как написать так, чтобы количество неправильно тебя понявших свелось к минимуму. Думать, как не скатиться в крайности. И много еще о чем думать.
Но друзья сказали, что раз мои потуги на поприще IoT и прочей малой автоматизации интересны им, то они и другим могут быть интересны и широкой публике. Ну, а где собирается публика, которой интересно такое? Конечно, на хабре. И вот я тут. Старый читатель и новый писатель.
За ошибки, неточности, опечатки, несовременный стиль изложения и прочее, что может не понравиться читателю, я никакой ответственности не несу. Читайте на свой страх и риск.
Ещё я сразу предупреждаю, что не буду пояснять что такое MQTT, WiFi и UDP multicast и другие вещи, прямо не относящиеся к теме. Кое-какие ссылки есть в конце статьи.
Рождение идеи или немного лирики
Жизнь — штука непростая и его величество Случай играет в ней далеко не последнюю роль. Вот и я хочу поделиться тем, как случайные события, помноженные на закономерную лень, вылились в довольно интересную разработку контроллера на базе ESP8266.
Начиналось все довольно буднично: хотелось построить систему управления водопроводом и поливом грядок-кустов на даче.
Но, поскольку полноценно заниматься трубами-баками-кранами мне можно лишь в отпуске, до которого было еще больше полугода — все ограничивалось обсуждением на работе с коллегами и с друзьями-товарищами в неформальной обстановке.
Тема «малой автоматизации» или, как это принято говорить у «этих ваших школоло-хакеров-хипстеров» — тема IoT — Интернета вещей — интересовала меня давно. Задолго до появления интернета как такового в широком пользовании.
Еще в детстве мне хотелось чтобы вещи делали что-то «сами». И желательно, чтобы я мог управлять ими как-то на расстоянии. Но в то время (80е, начало 90х годов прошлого тысячелетия) с этим было сложновато. Интернета не было в широком доступе нигде в мире, как не было нигде и сотовых телефонов, планшетов и даже LCD-дисплеев и USB-флешек. Так что приходилось ограничиваться «выключателями света по хлопку» и простейшими пультами дистанционного управления по радио. Но для тех времен и того возраста и это было неплохо и интересно.
Но это дела прошлые. Нонче на дворе век XXI. И у каждого в кармане смартфон, интернет есть практически везде, где надо и не надо, да и база доступных электронных компонентов сейчас такая, что еще лет 15 назад и не снилась рядовому жителю планеты Земля.
Поэтому, решив слепить контроллер для водяных дел на даче, я обратил взоры на чип ESP8266.
Во-первых, этот чип дешев. И если не хватит одного контроллера — можно поставить два, три или пять. Во-вторых, он имеет WiFi на борту. То есть можно смотреть что происходит через интернет и даже управлять процессом с любого смартфона. Разумеется, нужна точка доступа с выходом в интернет, но это не проблема. Все равно она почти везде есть или вот-вот будет, в том числе — и у меня на даче.
Погрузившись в удивительный мир проектов для ESP8266, я с удивлением обнаружил, что несмотря на обалденные возможности этого чипа — проекты на нём, за редким исключением, делятся на два типа: это или крайне примитивные программки типа «щелкаем релюхами со смартфона и глазеем на состояние датчика температуры через интернет»; или хорошие и добротные интерпретаторы JavaScript или Lua, но к сожалению, сжирающие почти всю память и не позволяющие сделать чего-то серьезного.
Первая моя идея была простой как блин — написать простую программу управления насосами по состоянию датчиков и все. Но, как тертый калач в плане скакания по граблям внедрения разных систем, я понимал, что предусмотреть заранее все изгибы алгоритма, которые захочется или будет необходимо выпрямить во время строительства водопровода-полива — я точно не смогу.
Дорабатывать программу на даче, в темном сарае — не очень удобно. А придется.
Какой же выход? Конечно, первое, что пришло в мою голову — это сделать алгоритм настраиваемым. Один мой коллега дал массу советов — что настроить и как. Этим он зарубил мою первую идею на корню. Спасибо ему. Если бы он не развернул перед моим взором количество параметров, которое мне надо будет настроить — я бы наверное так и не отказался от этого варианта: сделать страницу настроек алгоритма.
Но ужасающая картина количества настоечных параметров, да еще и влияющих один на другой — отрезвила меня. Я в очередной раз понял, что всего не предусмотреть…
Сразу оговорюсь: я ленив. Очень ленив! Мне откровенно каждый раз переписывать программу. Поэтому встала задача — как быстро и просто задавать алгоритм, желательно без программирования? Причем этот алгоритм будет довольно сложен; будет иметь массу параметров; будет индивидуален для моего случая и непригоден для других. А устройство так хочется сделать более или менее универсальным…
Поскольку до отпуска и всяких трубонасосных дел, было еще около полугода — я решил не торопясь обдумать: как сделать удобно и красиво? Как программировать не программируя? Как обойтись без триллиона изменяемых при настройке параметров?
Как обычно, все уже было придумано до нас: я понял, что хочу рисовать алгоритм в виде квадратиков-действий и соединять их линиями связи, которые показывают откуда и куда летят данные. Ну и ткнув в квадратик, хочу иметь возможность настроить какие-то его индивидуальные параметры.
Идея задавать алгоритм, рисуя его квадратиками не нова. Такие системы были еще в 80е; нонче есть супер-популярная система NodeRed, которая хорошо известна тем, кто уже приобщился к миру малой автоматизации/IoT.
Но вот незадача: такие системы рассчитаны на «большие ПК». На худой конец — на Raspberry PI. Но никак не на ESP8266, у которого всего несколько десятков килобайт ОЗУ и операционки то нет!
Как быть? А выхода всего два: писать-рисовать программу на «большом ПК» или ноуте, а затем в каком-то виде её передавать на ESP8266 или попытаться «впихнуть невпихуемое» в сам контроллер ESP8266.
Поэтому программа-максимум у меня была такой: для программирования своего контроллера не должно быть нужды ни в чем, кроме ноутбука с WEB-браузером! То есть ноутбук с WEB-браузером и мой контроллер — этого должно быть достаточно для полной настройки и написания-рисования программ управления.
И, как оказалось, реализовать такое оказалось вполне возможно!
Не буду утомлять вас всеми подробностями разработки проекта. Скажу только, что на основании слов, которые приходили мне на ум и на язык в процессе разработки, можно было бы составить отдельный »Словарь нецензурной лексики работников электронной промышленности». Но все позади. Точнее не все, а первый, самый сложный этап, когда не понятно — будет твоя идея жить или это просто бред сивого мерина в лунную ночь.
Поделюсь результатом того, что вышло и получило название «Контроллер ShIoTiny».
И что же вышло?
Аппаратная часть контроллера ShIoTiny стандартна и проста: три входа, рассчитанные на датчики типа «сухой контакт» (кнопки, герконы, они же — датчики уровня воды в баке), один вход АЦП, один вход для подключения датчика температуры и влажности типа DHT22 или аналогичного. И, наконец, три выхода в виде переключающих реле на 220Вольт, 1Ампер. На реле написано 10А, но я реалист и пускать через плату 10Ампер не буду. А для управления пускателями насосов и 1Ампер хватит. Питается все это от источника питания напряжением от 5 до 9 вольт.
Честно говоря, датчик температуры я добавил просто так «шоб было», а вот на АЦП — были надежды измерять напряжение питающей сети. Мало ли что?
Разумеется, все входы, кроме входа для подключения DHT22, имеют защиту из резисторов и диодов: жечь ESP8266 у меня не было никакого желания, а диоды и резисторы стоят всего по несколько копеек.
Фото готового изделия можно увидеть в начале статьи. Таких плат я заказал несколько — вдруг что сожгу или придется резать дорожки-ножки?
Но, к счастью — не пришлось.
Фото изделия — это, конечно, красота и величие. Но для удобства ниже приведен чертеж-схема подключения к плате имитаторов датчиков и исполнительных устройств.
Вместо датчиков уровня — кнопки Input1…3, вместо пускателей — светодиоды, подключенные к реле Relay1…3. Ну и переменный резистор на АЦП, чтобы имитировать входное напряжение.
Когда реле выключено — горит красный светодиод. А когда включено — зеленый. Так вот и отлаживался я на столе.
Кроме всего этого — слева на плате разъем питания, а справа — две сервисные кнопки: Reset и AP. Ну и DIP-переключатель, переводящий устройство в режим программирования. Разъем программирования ESP8266 через USB-UART адаптер тоже имеется.
Некоторые пояснения по кнопкам. Что такое Reset — и так понятно. А вот кнопка AP нужна для того, чтобы перевести ShIoTiny в режим открытой точки доступа (конфигурационный режим или Config Mode). Зачем это нужно? Ну, например, вы напортачили с настройками сети и хотите их изменить. Жмёте кнопку AP несколько секунд (пока не загорится красивый синенький светодиод). Затем, берете свой смартфон или ноутбук, включаете WiFi и видите там открытую точку доступа с именем esp_8266_xxxx и подключаетесь к ней. После чего заходите в браузер смартфона или ноутбука и набираете в адресной строке: 192.168.4.1. Если всё в порядке — то вы попадаете на страницу контроллера ShIoTiny и можете его настраивать по новой.
Как видим, аппаратно ничего сложного. Поэтому о программной части.
Все заскоки реализации я опишу, но потом. Когда-нибудь. А сегодня я буду рассматривать программное обеспечение только «снаружи», то есть с точки зрения пользователя — себя или другого, рискнувшего использовать мою поделку (есть и такие каскадёры).
С точки зрения пользователя, устройство представляет собой HTTP-сервер, который доступен по WiFi. Все настройки, программирование и так далее — производится с помощью WEB-браузера.
Итак, мы зашли на страницу контроллера. Что мы видим? А видим мы вкладку «Control and status», которая показывает текущее состояние используемых устройств: входов, выходов, АЦП, DHT22. Кроме этого показаны параметры подключения к точке доступа (если работаем в режиме WiFi-станции); параметры точки доступа (если работаем в режиме WiFi-точки доступа) или и того и другого. Ну и вдобавок, показаны параметры соединения с MQTT-брокером, если используется протокол MQTT.
Как видим, ничего особенного и интересного. Даже нажимать не на что! Хотя… Есть ведь еще две вкладки! Настройка сетевых параметров Networking и редактор схем-программ ElDraw.
Как вы догадались, Networking — это настройка сети, но не только. В ней есть ещё пара интересных параметров. «Тыкнем» же на вкладку Networking и увидим там примерно то, что показано на рисунке.
Настройка имени точки доступа и пароля для каждого из режимов — WiFi станции и WiFi точки доступа. Вроде бы все понятно. Равно как и назначение кнопочки «Scan WiFi» вполне прозрачно.
А вот выпадающий список «ShIoTiny mode» требует пояснения. Дело в том, что я никак не мог определиться — в каком режиме мне удобнее будет работать. И поэтому предусмотрел 5 режимов работы устройства.
Перечислим кратко эти режимы работы.
Config mode — режим конфигурации. Это режим открытой точки доступа с неизменным адресом 192.168.4.1 и именем esp_8266_xxxx.
Station mode — режим WiFi-станции, подключенной к вашей точке доступа.
AP mode — режим закрытой точки доступа. Имя и пароль вы задаёте сами.
AP+Station mode — это одновременное включение режимов AP mode + Station mode.
Single mode — работа без подключения к сети вообще. Одинокий контроллер, несущий свою тяжкую долю…
В любом из режимов, кроме «Config mode», можно заблокировать WEB-страницу, установив галочку «Lock Web in Station mode». Это типа из соображений безопасности.
Настройки MQTT-очевидны: сервер, порт, пароль, открытое соединение или по SSL. Не буду тут останавливаться подробно.
Кроме всего прочего, контроллер ShIoTiny умеет посылать и принимать пакеты специального формата по multicast. Настройки его тоже очевидны: адрес группы и порт.
Разумеется, что если описывать все нюансы настроек — получится отдельная статья, а это в мои планы не входит.
Итак, с вкладкой Networking всё более или менее ясно. Перейдем к главной фишке контроллера — редактору схем-программ ElDraw.
Ткнувшись на вкладку ElDraw, мы увидим примерно следующее. Разумеется, что если в устройстве нет загруженной схемы, то в поле схемы будет пусто.
Слева — палитра элементов или узлов (нод).
Справа — поле схемы или просто «схема».
Сверху — кнопки загрузки-выгрузки на диск и на устройство, а также кнопки редактирования.
Для тех, кто работал с редакторами — управление в общем-то очевидно. Надо добавить элемент на схему — берем его мышкой и тащим из палитры в схему. Надо удалить элемент или связь из схемы — тыкаем на него или на нее мышкой и нажимаем клавишу DEL. Надо соединить элементы — берем вход одного элемента и соединяем его с выходом другого.
Есть еще масштабирование (SHIFT+колесо мыши). К сожалению, нет возможности копирования элементов и групп элементов. Но это не сильно мешает.
Кроме того, из соображений логики вход узла может быть связан только с одним выходом другого узла. Но выход узла — с несколькими входами других узлов. Входы — всегда слева узлов. Выходы — всегда справа.
Какие возможности у нас имеются для реализации алгоритмов?
Возможности — довольно обширные. В палитре имеются узлы, представляющие всю аппаратуру контроллера ShIoTiny: входы, реле, АЦП, DHT11/22.
Для обработки данных имеются логические и арифметические узлы.
Чтобы мы могли работать с устройством через интернет, имеются узлы для подписки и публикации параметров на MQTT-брокере.
Если мы хотим, чтобы несколько контроллеров ShIoTiny обменивались информацией между собой — можно использовать узлы передачи и приёма параметров по UDP multicast протоколу.
Кроме этого, имеются узлы-таймеры; узлы управления обработкой событий.
Приведу несколько примеров. Например, вы хотите, чтобы каждые 30 минут данные о температуре и влажности публиковались на MQTT-сервере? Нет ничего проще. Рисуем так.
Жмем кнопочку «Upload». Всё!
Если у вас правильно настроена связь с MQTT брокером на вкладке Networking, то это всё!
Каждые полчаса, температура будет публиковаться на брокере под топиком /T, а влажность — под топиком /H. Или, если вы зададите свои названия топиков — то под ними.
Законный вопрос: почему 18000 это 30 минут? Потому что все времена измеряются в десятых долях секунды.
Теперь хотите добавить к этой схеме возможность включения реле Relay1 через интернет, да ещё и на определенное время? Не проблема. Дорисовываем так.
Опять жмем кнопочку «Upload». Всё! Теперь, кроме того, что каждые полчаса, температура и влажность будут публиковаться на MQTT-брокере, появится возможность включать реле Relay1. Да не просто включать, а ровно на 10 минут. Включать реле можно публикацией топика /r1cmd, установленного в 1. А реальное состояние реле будет публиковаться в топике /r1status.
Вам хочется не только включать, но и отключать реле досрочно? Да как скажите. Рисунок ниже показывает как это сделать!
Принцип понятен? Вы просто рисуете алгоритм мышкой! И немного пишете настроек: время, имя топика и все. Это гораздо нагляднее, чем писать кучу кода.
Кстати, подсветка связей разными цветами — это не «фотошоп» — это одна из функций редактора. Вы можете раскрасить связи по своему усмотрению, чтобы не путаться в них.
Но и это еще не все! Для того, чтобы отлаживать алгоритм, есть кнопочка «Monitor start». Она, как это ни странно, включает режим «монитор». В этом режиме состояние всех выходов всех узлов периодически считывается из контроллера ShIoTiny и выводится на схему. Примерно, как на рисунке ниже.
То есть мы в «почти реальном времени» можем видеть что у нас на входе и выходе каждого узла. Очень помогает, когда что-то не понятно.
Есть еще много «фишек и фич», которые я и хотел бы описать, да совесть не позволит тратить ваше время на них в одной статье. Основная реализованная идея и так понятна: минимум настраиваемых параметров — максимум наглядности.
Ложка дегтя
Конечно, хочется, чтобы не было никакой ложки дегтя, но мир не идеален. Не идеален и мой редактор и мой контроллер. Я обнаружил две главные особенности, которые пока не смог устранить.
Во-первых, иногда проявляются глюки при групповом перемещении элементов. Но это не сильно мешает работе. Скорее «фича», чем «баг».
И, во-вторых, при некоторых условиях после загрузки схемы в устройство кнопочкой «Upload», оно перезагружается. Жить это не мешает, но страницу редактора надо обновить.
Заключение
Надеюсь, что вам понравилась идея рисовать алгоритмы, вместо того, чтобы писать программы. Вот так случайные мысли, идеи и споры иногда порождают вполне себе жизнеспособные разработки.
Но, по-моему, объем статьи перерос все разумные пределы. Поэтому я на сегодня закончу.
Позволю лишь сказать, что до отпуска остались считанные недели и я вполне готов перейти от отладки контроллера за столом к отладке его «в поле».
Если кого заинтересовали мои идеи или подробности разработки — пишите на мыло: shiotiny@yandex.ru
Всегда рад буду замечаниям и критике, если она, конечно, по делу.
Жду ваших отзывов, замечаний и предложений.
Ссылки, отсылки и посылки
ESP8266
WiFi
MQTT
UDP Multicast