Как стать автором
Обновить

ShIoTiny: узлы, связи и события или особенности рисования программ

Время на прочтение7 мин
Количество просмотров4.4K
Всего голосов 13: ↑13 и ↓0+13
Комментарии27

Комментарии 27

Принцип работы узлов и событий напоминает Node-RED.

Не отрицаю. Если приближенно, то узел=программная функция, событие — вызов этой функции с параметрами.
Чем Ваше решение выигрывает по сравнению, например, с FlProg и HiAsm?
Тем, что оно работает прямо на ESP-07 и не требует никакого ПО на ноутбуке, кроме браузера.
То есть всё что нужно для настройки устройства — это ноутбук с WiFi и само устройство ShIoTiny.

Тут я об этом писал habr.com/ru/post/463107

Так то у кого есть ноутбук с wifi — тот может использовать не только браузер, но и любую IDE. Может сценарии в git хранить, например.

Может. Но мне нравится так:)
Знакомый, например, плату к меня попросил как конструктор для сына.
Спаять, наглядно нарисовать схему без освоения иде и компиляторов. Для пацана 12 лет вообще кайф.
Причем можно и с сотика управлять по mqtt, например.

У меня двойственное отношение к поднятой теме визуального программирования:
1) при проектировании схем для ПЛМ я предпочитаю именно схемотехнические решения и люблю посетовать, что VHDL не дает визуального образа и в нем трудно разбираться, а не схеме все сразу видно,
2) при проектировании программ я категорически не приемлю визуальный стиль, поскольку он, в отличие от хорошо структурированного текста не дает предствления о логике программы.
Интересно, это уже шизофрения, или так и должно быть?

Имхо. Читаемость и нечитаемость программ и чертежей это от автора на 90% зависит.
Ну и от привычки.
Дусюмаю, что вы сами видели кучу непонятных кривых схем и нечитаемых программ.

1) ПЛМ сама по себе представляет собой схему из сигналов и железной логики. Линии и сигналы там — это физические линии и сигналы. Поэтому логично, что графическое представление будет лучше отображать суть процессов, происходящих в ней.
2) А с программами для процессоров не все так просто — процессор выполняет последовательно операции, записанные в памяти. Поэтому отобразить это графически не всегда легко. Но в некоторых случаях все-таки возможно. Классика — автомат состояний. На языке программирования это тоже такое себе описание, когда в графике можно нарисовать вот так:
image
И все понятно, не правда ли?


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

Начните программировать на Forth (Форт) (и Дракон языке) :)
image

P.S. ИС Дракон как форт IDE
@ «В каждой шутке есть доля шутки»
Сам я не за и не против программ или визуального представления.

Всё зависит от задачи. Я ж не проектировал абстрактный контроллер. Я проектировал вполне конкретный контроллер для задач управления «небыстрыми» процессами.

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

Ну и обязательно нужна та или иная связь с сетью. Я остановился на MQTT для общения через интернет и на UDP-multicast для общения модулей между собой по локальной сети.

Вот и всё.

И опять же — далал всё «just for fun»:) Это уж потом заинтересовались знакомые и начали просить платы. Они же и надоумили меня вытащить всё это в виде статей на хабре.

В предыдущей статье описано, как это всё рождалось. Сокращенно, разумеется.

Что касается «ноутбука с SDK». Да, ноутбук с SDK — это сила. Но ещё в предыдущей статье я писал, что проглядев десятки проектов на ESP8266 я увидел, что по сути все эти SDK применяются для того, что у меня реализуется 5-10 узлами.

Ну, например: включение вентилятора при заданной температуре и включение нагревателя при другой заданной температуре.

Или: управление освещением по MQTT и датчику освещенности. Три уровня света: аварийное, норма, повышенной яркости. Ну и полное отключение.

И так далее и такое прочее.

Я, пожалуй, посвящу следующую статью микро-проектам на ShIoTiny. Именно такого уровня. Заодно и по узлам пройдусь — что кто делает и как.

Кстати управление освещением по датчику освещенности и движения есть и у меня.


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

То, что вы описали — это отказ, а не «реал-тайм». При исправном устройстве — такое невозможно.
Только если датчик или пускатель из строя выйдет. Ну или программа повиснет. Но на то есть вачдог.

ИМХО, хороший тон — задавать максимальное время включения.

Скажем не «включить полив, если датчик замкнут», а «если датчик замкнут включить полив на 20 минут или до размыкания датчика».

Та же история с нагревателем. Или с насосом.

Ну и второе правило: не управлять по ненадёжной сети. То есть контроеллер не обращается за решением «наверх», а только получает «сверху» парамеры включения устройства, а включает и выключает — сам.

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

И можно спать спокойно:) Ну если нервы крепкие:)

Некоторые вон АЭС строят — и ничего, спят сладко:)
То, что вы описали — это отказ, а не «реал-тайм». При исправном устройстве — такое невозможно.
Только если датчик или пускатель из строя выйдет. Ну или программа повиснет. Но на то есть вачдог.

Я не договорил. А если нагреватель или полив все-таки выключится, но через день — это считается отказом? Проблема в том, что считать исправной системой, а что неисправной и как определить этот порог нагрузки системы, после которого могут происходить отказы. В системах жесткого реального времени это сделать очень просто — все сигналы опрашиваются каждый цикл времени, время работы алгоритма известно и поэтому определить и, главное, протестировать в каком случае система гарантированно будет работать, а в каком откажет, очень легко. В случае же событийной системы неисправная система может получиться просто за счет того, что все события вдруг наступят одновременно и очередь стека MQTT просто переполнится. Вы это тестировали? При каком количестве сигналов/событий это может произойти?


ИМХО, хороший тон — задавать максимальное время включения.
Скажем не «включить полив, если датчик замкнут», а «если датчик замкнут включить полив на 20 минут или до размыкания датчика».
Та же история с нагревателем. Или с насосом.

Это называется "добавить детерминизм в систему" — то есть вы создаете гарантированные дедлайны времени отклика. А это уже характеристика систем реального времени.


Ну и второе правило: не управлять по ненадёжной сети. То есть контроеллер не обращается за решением «наверх», а только получает «сверху» парамеры включения устройства, а включает и выключает — сам.

Ну часто другой сети нет и не будет. Поэтому надо как-то работать и с этим.


Некоторые вон АЭС строят — и ничего, спят сладко:)

Я к таким отношусь и сплю спокойно — как раз примерно для таких применений разрабатываю системы жесткого реального времени, но применить такое же решение в системе Умного Дома я не могу, так как стоят они немало. Поэтому приходится идти на риск и пытаться как-то выкручиваться. :-)

Ну часто другой сети нет и не будет. Поэтому надо как-то работать и с этим.


Да фиг с ней с сетью. Я имею ввиду, что сам алгоритм — реализован на контроллере, непосредственно связанным с датчиками и исполнительными устройствами.

Сеть — лишь задаёт параметры работы алгоритма. Если она даже упадёт — ничего страшного, алгоритм отработает со старыми параметрами. Скажем проработает тот же полив немного больше или меньше — ну и что? Свет позже выключится? Ну и что?

На самом деле — «умный дом» всё же не атомная станция. Время отклика в секунды — спокойно обеспечивается даже в моём варианте контроллера.

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

Наверное у вас просто некоторое предубеждение в связи с тем, что вы «как раз примерно для таких применений разрабатываете системы жесткого реального времени». Может не надо переносить в быт атомные технологии?:)

Никто же не боится ездить на автомобиле? А ведь у него комп без тройного резервирования:)
Да фиг с ней с сетью. Я имею ввиду, что сам алгоритм — реализован на контроллере, непосредственно связанным с датчиками и исполнительными устройствами.
Сеть — лишь задаёт параметры работы алгоритма.

Но так вы начинаете серьезно себя ограничивать в архитектуре системы. Уже нельзя сделать распределенную систему, где один датчик мог бы давать информацию сразу нескольким системам, или возможность подключать датчики и исполнительные устройства в любых физических точках системы и настраивать их на виртуальные входы/выходы. Также теряется огромное преимущество в том, что имея центральный мощный контроллер, вы можете делать сложные вещи, а не писать все для пукалок типа ESP-8266.


На самом деле — «умный дом» всё же не атомная станция. Время отклика в секунды — спокойно обеспечивается даже в моём варианте контроллера.

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

Так на работе я и пишу все для линукса на мощных контроллерах. Но для управления светом или поливом ничего сложнее пукалок и не надо:)


Требования просто разные. Дома мне надо, чтобы было просто и дешево. Из чего я и исходил.


Кстати, у меня есть возможность задавать с одного датчика данные всем модулям, если их несколько в сети.


Только надо еще время актуальности задавать и смотреть что делать, если параметр устарел.


В общем старая задача — как при ненадежной сети пострить вменяемую систему:)

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


Вы, я вижу, опытный спец:) Но если пойти дальше — то вообще всё устройство работает на базе вероятностных величин.

Если так пойти, то:

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

Если сигнал попадёт на базу транзистора, то с ненулевой вероятностью транзистор оборвётся или пробьётся.

Если с транзистором всё в порядке — отказать может реле.

Если реле не отказало — может оборваться провод или отгореть клемма:))

И так далее. Но это всё теории. Реально, конечно, защиты нужны, но в разумных пределах. ИМХО.
Если ваша программа выдала сигнал, то с ненулевой вероятностью выход контроллера откажет и сигнал не попадёт на базу транзистора.
Если сигнал попадёт на базу транзистора, то с ненулевой вероятностью транзистор оборвётся или пробьётся.
Если с транзистором всё в порядке — отказать может реле.
Если реле не отказало — может оборваться провод или отгореть клемма:))

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


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

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


Ну так это уже не про мой примитивный контроллер с несколькими событиями в секунду максимум.

Я не спец по высоконагруженным системам с временем отклика в миллисекунды. Совсем не спец.

А можно ли рассмотреть вариант модификации, при котором в прошивке можно было бы настраивать Relays & Inputs на произвольные GPIO?
Чтобы иметь возможность использовать Вашу замечательную программу не только на Вашем же контроллере а и на обычных Sonoff (dual), Electrodragon WiFi Relay, etc?

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

А WiFi-реле… В ESP-01 c 512К моя прошивка не влезет. Увы. ESP-07 был взят именно потому что там 1Мегабайт памяти.

Может стоит сделать урезанную плату с одним реле и возможностью подключить несколько датчиков? То же самое WiFi-реле, но умнее.

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

Скажем, если в комнате темно и кто-то там есть — включить свет. Или не включать, если поздно (можно на сервере MQTT публиковать и время). В общем — количество степеней свободы растёт многократно.

Кстати, я как раз для тестов своей прошивки микро-проект сделал для освещения — потом выложу.

Входные данные — уровень освещённости (АЦП), время (MQTT), команда (MQTT) и выключатель (INPUT1), датчик движения (INPUT2).

Управляют освещением все три реле.

Первое — «ночник» (включается если в комнате кто-то есть и время обозначено как позднее) текущее время и какое время считать «поздним» — публикуется в MQTT.

Вторая — нормальное (включается если в комнате кто-то есть и время обозначено «вечернее», но в комнате темно).

Третья — полное освещение — (включается если в комнате кто-то есть и время обозначено как «раннее», но в комнате темно).

Выключатель-кнопка меняет по кругу все режимы (отключено-ночник-норма-полное-автомат).

Так же по MQTT можно управлять режимом напрямую.

Будем посмотреть как работает:)
Сам я не за и не против программ или визуального представления.

Всё зависит от задачи. Я ж не проектировал абстрактный контроллер. Я проектировал вполне конкретный контроллер для задач управления «небыстрыми» процессами.

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

Ну и обязательно нужна та или иная связь с сетью. Я остановился на MQTT для общения через интернет и на UDP-multicast для общения модулей между собой по локальной сети.

Вот и всё.

И опять же — далал всё «just for fun»:) Это уж потом заинтересовались знакомые и начали просить платы. Они же и надоумили меня вытащить всё это в виде статей на хабре.

В предыдущей статье описано, как это всё рождалось. Сокращенно, разумеется.

Что касается «ноутбука с SDK». Да, ноутбук с SDK — это сила. Но ещё в предыдущей статье я писал, что проглядев десятки проектов на ESP8266 я увидел, что по сути все эти SDK применяются для того, что у меня реализуется 5-10 узлами.

Ну, например: включение вентилятора при заданной температуре и включение нагревателя при другой заданной температуре.

Или: управление освещением по MQTT и датчику освещенности. Три уровня света: аварийное, норма, повышенной яркости. Ну и полное отключение.

И так далее и такое прочее.

Я, пожалуй, посвящу следующую статью микро-проектам на ShIoTiny. Именно такого уровня. Заодно и по узлам пройдусь — что кто делает и как.

Так что те, кто хочет — пусть SDK пользуют, кому нравится — JavaScript и Lua. Ну а самые суровые могут и на ассемблере писать:)

Никого не призываю отказаться от убеждений и привязанностей.
По мне, так самое неприятное в таком визуальном программировании это видимость параллельного исполнения программы, в то время как реально оно последовательное. Причем как оно последовательно исполняется скрыто под капотом движка. В Labview забавно смотреть в режиме отладки как бегут данные по проводкам, но там есть приличное количество средств для задания порядка выполнения, если нужно. Но большие диаграммы меня в нем всегда угнетали и старался их упростить вызовами CallLibraryFunction или CIN-ами… а так сама по себе задача решена прикольная. Однако в своих модулях для автоматизации я упор делаю на автономность и независимость каждого узла и возможность его автономно настроить(или по-управлять) через веб морду. Чтобы при разваливании сети все отработало свои задачи само. С визуальным программированием это сложновато будет нарисовать…
Еще бы İ2C добавить для расширения функциональности…
На ESP-07 i2C аппаратный вроде не выведен.
Но после вылова критичных багов (а такие наверняка найдутся) — расширение номенклатуры периферии неизбежно:) Да и надо сделать версию для модулей с 2Мб и более. Но пока надо до ума то, что есть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории