![image](https://habrastorage.org/getpro/habr/post_images/df6/125/27b/df612527bc8ae8a2c188d370940dbf78.jpg)
Статья о том, как из дешёвого китайского устройства создать программируемый логический контроллер. Такое устройство найдёт своё применение как в домашней автоматизации, так и в качестве практических занятий по школьной информатике.
Для справки, по умолчанию программа Sonoff Basic работает с мобильным приложением через китайский облачный сервис, после предлагаемой переделки, всё дальнейшее взаимодействие с этим устройством станет возможным в браузере.
Раздел I. Подключение Sonoff к сервису MGT24
Шаг 1. Создание панели управления
Зарегистрируйтесь на сайте mgt24 (если ещё не зарегистрированы) и войдите в систему под своей учётной записью.
![image](https://habrastorage.org/getpro/habr/post_images/9c4/caa/9d0/9c4caa9d0e70ad4b30a23555a816c780.png)
Чтобы создать панель управления для нового устройства нажмите на кнопку "+".
![image](https://habrastorage.org/getpro/habr/post_images/afa/ccd/ed8/afaccded8dda9b70d5145da032a878fc.png)
После того, как панель будет создана, она появится в списке ваших панелей.
Во вкладке «Установка», созданной панели, найдите поля «ID устройства» и «Ключ авторизации», в дальнейшем, эта информация потребуется при настройки Sonoff устройства.
![image](https://habrastorage.org/getpro/habr/post_images/523/a96/d0a/523a96d0ae4d3682ad106a7adbc3e289.png)
Шаг 2. Перепрошивка устройства
С помощью утилиты XTCOM_UTIL загрузите прошивку ПЛК Sonoff Basic в устройство, для этого вам понадобиться USB-TTL конвертер. Здесь инструкция и видеоинструкция.
Шаг 3. Настройка устройства
Подайте на устройство питание, после того как загорится светодиод, нажмите на кнопку и удерживайте её в нажатом состоянии до тех пор, пока светодиод не начнёт периодически равномерно мигать.
В этот момент появится новая wi-fi сеть с названием «PLC Sonoff Basic», подключите свой компьютер к этой сети.
Светодиодная индикация | Состояние устройства |
---|---|
периодическое двойное мигание | нет связи с роутером |
непрерывно светит | установлена связь с роутером |
периодическое равномерное мигание | режим wi-fi точки доступа |
потушен | нет питания |
Откройте интернет-браузер и введите в адресную строку текст «192.168.4.1», перейдите на страницу настроек параметров сети устройства.
Заполните поля следующим образом:
- «Имя сети» и «Пароль» (для привязки устройства к домашнему wi-fi роутеру).
- «ID устройства» и «Ключ авторизации» (для авторизации устройства на сервисе MGT24).
![image](https://habrastorage.org/getpro/habr/post_images/c22/0b0/8d4/c220b08d4abca1789b20e3f08ea5577e.png)
Сохраните настройки и перезагрузите устройство.
Здесь видеоинструкция.
Шаг 4. Подключение датчиков (опционально)
Текущая прошивка поддерживает до четырёх датчиков температуры ds18b20. Здесь видеоинструкция по монтажу датчиков. По всей видимости, это шаг будет самым непростым, так как потребует от вас прямых рук и паяльника.
Раздел II. Визуальное программирование
Шаг 1. Создание сценариев
В качестве среды программирования используется Blockly, среда проста в освоении, поэтому для создания простых сценариев не нужно быть программистом.
Я добавил специализированные блоки для записи и чтения параметров устройства. Доступ к любому параметру осуществляется по имени. Для параметров удалённых устройств используются составные имена: «параметр@устройство».
![image](https://habrastorage.org/getpro/habr/post_images/3a8/b7c/db2/3a8b7cdb22abbe0c400c60830da7b996.png)
Пример сценария циклического включения и выключения нагрузки (1Гц):
![image](https://habrastorage.org/getpro/habr/post_images/701/6d4/965/7016d496538dd3cf3abae9b2587b6401.png)
Пример сценария синхронизирующего работу двух отдельных устройств. А именно, реле целевого устройства повторяет работу реле удалённого устройства.
![image](https://habrastorage.org/getpro/habr/post_images/9d7/45c/40c/9d745c40c3ddac6d21cd473f025b68d8.png)
Сценарий для термостата (без гистерезиса):
![image](https://habrastorage.org/getpro/habr/post_images/2a3/b2d/027/2a3b2d027fe0c8971b4b17aab2433ab7.png)
Чтобы создавать более сложные сценарии можно использовать переменные, циклы, функции (с аргументами) и прочие конструкции. Не буду здесь всё это расписывать подробно, в сети уже есть довольно много обучающего материала о Blockly.
Шаг 2. Порядок выполнения сценариев
Сценарий работает в непрерывном режиме, и как только он доходит до своего окончания он запускается вновь. При этом есть два блока, которые могут временно приостановить работу сценария, «delay» и «pause».
Блок «delay» используется для миллисекундных или микросекундных задержек. Этот блок строго выдерживает временной интервал, блокируя работу всего устройства.
Блок «pause» используется для секундных (можно и меньше) задержек, и он не блокирует выполнение других процессов в устройстве.
Если сценарий внутри себя содержит бесконечный цикл, в теле которого не стоит «pause», интерпретатор самостоятельно инициирует маленькую паузу.
В случае исчерпания выделенного стека памяти, интерпретатор остановит выполнение такого прожорливого сценария (будьте осторожны с рекурсивными функциями).
Шаг 3. Отладка сценариев
Для отладки уже загруженного в устройство сценария, можно запустить трассировку программы по шагам. Это бывает крайне полезно, когда поведение сценария оказалось не таким, как задумывал автор. В этом случае, трассировка позволяет автору быстро найти источник проблемы и исправить ошибку в сценарии.
Сценарий вычисления факториала в отладочном режиме:
![image](https://habrastorage.org/getpro/habr/post_images/98e/845/718/98e8457184a5c48ee027e2ac8af3ed77.png)
Инструмент отладки очень прост и состоит из трёх основных кнопок: «пуск», «один шаг вперёд» и «останов» (также не забудем про «вход» и «выход» из режима отладки). Кроме пошаговой трассировки можно установить точку останова на любом блоке (щелчком мыши над блоком).
Чтобы вывести в монитор текущие значения параметров (датчики, реле) используйте блок «print».
Здесь обзорный видеоролик об использовании отладчика.
Раздел для любознательных. А что же под капотом?
Для того чтобы сценарии работали на целевом устройстве был разработан интерпретатор байт-кода и ассемблер на 38 инструкций. В исходный код blockly был встроен специализированный генератор кода, который конвертирует визуальные блоки в ассемблерные инструкции. В дальнейшем эта ассемблерная программа преобразуется в байт-код и передаётся в устройство на исполнение.
Архитектура этой виртуальной машины довольно проста и описывать её особого смысла нет, в сети вы найдёте много статей о проектировании простейших виртуальных машин.
Под стек своей виртуальной машины я обычно выделяю 1000 байт, этого хватает с запасом. Конечно, глубокие рекурсии могут исчерпать любой стек, но вряд ли им найдётся практическое применение.
Итоговый байт-код получается довольно компактным. Как пример, байт-код вычисления того же факториала составляет всего 49 байт. Это его визуальная форма представления:
![image](https://habrastorage.org/getpro/habr/post_images/a94/d9f/511/a94d9f51102478e3b5d0db578f95132e.png)
А это его ассемблерная программа:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
Если ассемблерная форма представления не имеет какой-либо практической ценности, то вкладка «javascrit», напротив, даёт более привычный вид нежели визуальные блоки:
function factorial(num) {
if (num > 1) {
return num * factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Что касается производительности. При запуске простейшего сценария мигалки, на экране осциллографа я получил меандр 47кГц (при тактовой частоте процессора 80МГц).
![image](https://habrastorage.org/getpro/habr/post_images/5be/199/e2c/5be199e2c8efd52bc0fb5d0b179c3f24.png)
![image](https://habrastorage.org/getpro/habr/post_images/f66/2e9/7cf/f662e97cfda73f74647d23a03a5d4696.jpg)
Считаю это неплохим результатом, по крайней мере, эта скорость почти в десять раз быстрее чем у Lua и Espruino.
Заключительная часть
Подводя итог, скажу, что применение сценариев позволяет нам не только запрограммировать логику работы отдельного устройства, но и даёт возможность связать несколько устройств в единый механизм, где одни устройства влияют на поведение других.
Также отмечу, что выбранный способ хранения сценариев (непосредственно в самих устройствах, а не на сервере), упрощает переключение уже работающих устройств на другой сервер, например на домашний Raspberry, здесь инструкция.
На этом всё, буду рад услышать советы и конструктивную критику.
Комментарии (33)
glory2
06.05.2019 19:35У меня с помощь сценария организована взаимосвязь между комнатными термостатами и контроллером ТТ котла, таким образом, что зависимости от того работает котел или нет, в комнатах поддерживается разная температура.
glory2
06.05.2019 19:44Ну, вот, например DHT22
Спасибо за ссылку :-).
Кстати научите, пожалуйста, картинки в комментарии вставлять. Никак не соображу как это делается :-)
glory2
06.05.2019 20:02Сценарий «Бойлера косвенного нагрева» выглядит так
Управление бойлером производится также Sonoff basic с прошивкой PLC, который отслеживает температуру на 4-х ds18b20.
Sonoff отслеживает энергоисточник, разрешенное время потребления от электросети и остаток горячей воды в нем. Все это реализовано сценарием.
and7ey
07.05.2019 09:54Программирование через Blocky на сервисе MGT24 делается? Если нет, то зачем ключи доступа к этому сервису нужны?
После программирования — можно ключи доступа к MGT24 удалять?valeraba Автор
07.05.2019 10:09Графическая среда Blockly встроена в MGT24.
Для работы самого скрипта сервер не нужен. Но сама заливка скрипта в устройство идёт через сервер. Также через сервер происходит связь устройства с панелями управлениями для удалённого мониторинга параметров. Сервер можно развернуть локально на raspberry.
glory2
07.05.2019 11:17После программирования — можно ключи доступа к MGT24 удалять?
Если речь идет об этих
<img
То они нужны для доступа на панель управления
kt819a
Спасибо за статью, не попадался пока данный девайс на глаза. Да еще и за небольшие деньги. Еще бы такой же, только с возможностью подключения большего количества датчиков.
valeraba Автор
Мне показалось, что четырёх датчиков хватит для всего, но видимо случаи бываю разные. Я могу переделать прошивку на большее количество.
kt819a
Я неправильно выразился. Большую номенклатуру. Датчик влажности, освещенности и т.д.
valeraba Автор
В таком случае, лучше подобрать другую железяку. Sonoff Basic не имеет разъёмов для подключения различных периферийных устройств.
Shtucer
Говорят, что контакты RX-TX, при некоторых прошивках, можно использовать для подключения I2C-шины.
![image](https://habrastorage.org/webt/xq/co/ub/xqcoubeo9sjrxbyytqh1mmnpufq.jpeg)
И вот эта вот гребёнка между релюхой и разъёмом нагрузки это не GPIO?
valeraba Автор
Ваша правда. Для I2С контакты есть (ведь он программный). Но сейчас я их использую как UART для логирования, хотя это и необязательно.
av0000
При наличии достаточно «прямых» рук и мелкого паяльника магически получаем +2 GPIO (4, 5) без особых усилий, помимо стандартных RX, TX, GPIO 14, GPIO0 (кнопка), GPIO13 (светодиод). Паяются тонким проводом прямо к ноге микросхемы и выводятся на пустые контакты от RF приёмника.
Во всяких готовых конструкторах (ESPEasy, Tasmota и т.п.) как раз эта дополнительная пара и используется :)
glory2
Так что бы из Sonoff basic сделать Sonoff RF не обязательно иметь прямые руки. Достаточно моих «кривых», одного транзистора, одного резистора и одного такого модуля
Правда, опять же нужна прошивка от сервиса MGT24
SolarW
Ни малейших проблем, всё зависит от прошивки.
Позавчера собрал комплект вытяжкой рулить в ванную комнату:
SolarW
Обратите внимание на Electrodragon WiFi Relay (www.electrodragon.com).
По цене сравнимой с Sonoff basic получаете 2 реле, 2 кнопки и кучку уже выведенных GPIO (на некоторых запаяна подтяжка но предусмотрена возможность удаления/восстановления её)
valeraba Автор
Я исходил из того, что Sonoff является законченным устройством в корпусе. Купил, залил новую прошивку, да и пользуйся.
SolarW
https://www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266/ — упомянутая мной железка аналогично является законченным устройством в корпусе (несколько больше размером чем Sonoff basic)
glory2
Дело в том, что железа всякого уже понаделано уже полно, в том числе и хорошего. Эта конкретная железяка в наших краях крайне редко встречается, а Sonoff на каждом углу можно приобрести. Если вдруг умер, похоронил его и взял другой. У меня на Sonoff basic только комнатных термостатов штук восемь. И еще девять шт. Sonoff dual, управляют приводами роллет. Кстати, прошивка от MGT24, позволяет поселить в Sonoff dual радиомодуль.
SolarW
Редкая, не спорю.
Но удобство работы с ней позволяет закупить сразу неск штук, с учётом того чтобы парочку в зип положить :-)
glory2
Я предпочитаю два простых и доступных, чем одно сложное и редкое :-)
glory2
А смысл в том какой? Мне для комнатного термостат хватает одного ds18b20.
Для бойлера косвенного нагрева 4-х таких же. А потребности в датчике влажности или освещенности, никогда не возникало. Зачем они? Чем управлять в зависимости от их состояния?
glory2
Хотя, если научить Sonoff basic с прошивкой PLC от MGT24 научить понимать датчик влажности, ну к примеру такой , то он мог бы посредством сценария управлять контроллером системы автоматического полива а газона.
Shtucer
Ну, вот, например DHT22
Эти и множество других вещей на 4PDA
glory2
Ну скажем, как использовать DHT22, мы сообща придумали, а еще другие датчики зачем? Я знаю еще одного потребителя на датчик кислотности, то который ph растворов, но у него пока еще даже устройства нет, для которого прошивку делать.
kt819a
Тут смотря что автоматизировать. По датчику освещенности можно организовывать управление световыми сценариями дома. По датчику влажности — вытяжкой в ванной. Это первое, что приходит в голову.
glory2
Кстати, да. У меня такая проблема существует. Хотя ванная самое теплая комната в доме, но при этом и самая влажная, вечная борьба с грибком на рамах окон и в дальнем углу ее.
PR200SD
Вот есть такой вариант youtu.be/nOgsU1K7hCo, до 16 ds18b20 +влажность и давление.
glory2
Хороший обзор, подробный. Спасибо за ссылку.
Пока не могу придумать как использовать датчик давления. Чем управлять в зависимости от его показаний?
PR200SD
Управлять планетой Вы вряд ли сможете :), это больше информационный сигнал, для отслеживания изменений погоды, например, планирования выезда на рыбалку :)
glory2
Это, конечно — да :-)
Так я для этого Gismeteo использую. Дешево и сердито :-)