Визуальное программирование для Sonoff Basic

  • Tutorial
image

Статья о том, как из дешёвого китайского устройства создать программируемый логический контроллер. Такое устройство найдёт своё применение как в домашней автоматизации, так и в качестве практических занятий по школьной информатике.

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

Раздел I. Подключение Sonoff к сервису MGT24


Шаг 1. Создание панели управления


Зарегистрируйтесь на сайте mgt24 (если ещё не зарегистрированы) и войдите в систему под своей учётной записью.

Вход в систему
image

Чтобы создать панель управления для нового устройства нажмите на кнопку "+".

Пример создания панели
image

После того, как панель будет создана, она появится в списке ваших панелей.

Во вкладке «Установка», созданной панели, найдите поля «ID устройства» и «Ключ авторизации», в дальнейшем, эта информация потребуется при настройки Sonoff устройства.

Пример вкладки
image

Шаг 2. Перепрошивка устройства


С помощью утилиты XTCOM_UTIL загрузите прошивку ПЛК Sonoff Basic в устройство, для этого вам понадобиться USB-TTL конвертер. Здесь инструкция и видеоинструкция.

Шаг 3. Настройка устройства


Подайте на устройство питание, после того как загорится светодиод, нажмите на кнопку и удерживайте её в нажатом состоянии до тех пор, пока светодиод не начнёт периодически равномерно мигать.

В этот момент появится новая wi-fi сеть с названием «PLC Sonoff Basic», подключите свой компьютер к этой сети.

Расшифровка светодиодной индикации
Светодиодная индикация Состояние устройства
периодическое двойное мигание нет связи с роутером
непрерывно светит установлена связь с роутером
периодическое равномерное мигание режим wi-fi точки доступа
потушен нет питания


Откройте интернет-браузер и введите в адресную строку текст «192.168.4.1», перейдите на страницу настроек параметров сети устройства.

Заполните поля следующим образом:

  • «Имя сети» и «Пароль» (для привязки устройства к домашнему wi-fi роутеру).
  • «ID устройства» и «Ключ авторизации» (для авторизации устройства на сервисе MGT24).

Пример настройки параметров сети устройства
image

Сохраните настройки и перезагрузите устройство.

Здесь видеоинструкция.

Шаг 4. Подключение датчиков (опционально)


Текущая прошивка поддерживает до четырёх датчиков температуры ds18b20. Здесь видеоинструкция по монтажу датчиков. По всей видимости, это шаг будет самым непростым, так как потребует от вас прямых рук и паяльника.

Раздел II. Визуальное программирование


Шаг 1. Создание сценариев


В качестве среды программирования используется Blockly, среда проста в освоении, поэтому для создания простых сценариев не нужно быть программистом.

Я добавил специализированные блоки для записи и чтения параметров устройства. Доступ к любому параметру осуществляется по имени. Для параметров удалённых устройств используются составные имена: «параметр@устройство».

Выпадающий список параметров
image

Пример сценария циклического включения и выключения нагрузки (1Гц):

image

Пример сценария синхронизирующего работу двух отдельных устройств. А именно, реле целевого устройства повторяет работу реле удалённого устройства.

image

Сценарий для термостата (без гистерезиса):

image

Чтобы создавать более сложные сценарии можно использовать переменные, циклы, функции (с аргументами) и прочие конструкции. Не буду здесь всё это расписывать подробно, в сети уже есть довольно много обучающего материала о Blockly.

Шаг 2. Порядок выполнения сценариев


Сценарий работает в непрерывном режиме, и как только он доходит до своего окончания он запускается вновь. При этом есть два блока, которые могут временно приостановить работу сценария, «delay» и «pause».

Блок «delay» используется для миллисекундных или микросекундных задержек. Этот блок строго выдерживает временной интервал, блокируя работу всего устройства.

Блок «pause» используется для секундных (можно и меньше) задержек, и он не блокирует выполнение других процессов в устройстве.

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

В случае исчерпания выделенного стека памяти, интерпретатор остановит выполнение такого прожорливого сценария (будьте осторожны с рекурсивными функциями).

Шаг 3. Отладка сценариев


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

Сценарий вычисления факториала в отладочном режиме:

image

Инструмент отладки очень прост и состоит из трёх основных кнопок: «пуск», «один шаг вперёд» и «останов» (также не забудем про «вход» и «выход» из режима отладки). Кроме пошаговой трассировки можно установить точку останова на любом блоке (щелчком мыши над блоком).
Чтобы вывести в монитор текущие значения параметров (датчики, реле) используйте блок «print».
Здесь обзорный видеоролик об использовании отладчика.

Раздел для любознательных. А что же под капотом?


Для того чтобы сценарии работали на целевом устройстве был разработан интерпретатор байт-кода и ассемблер на 38 инструкций. В исходный код blockly был встроен специализированный генератор кода, который конвертирует визуальные блоки в ассемблерные инструкции. В дальнейшем эта ассемблерная программа преобразуется в байт-код и передаётся в устройство на исполнение.

Архитектура этой виртуальной машины довольно проста и описывать её особого смысла нет, в сети вы найдёте много статей о проектировании простейших виртуальных машин.

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

Итоговый байт-код получается довольно компактным. Как пример, байт-код вычисления того же факториала составляет всего 49 байт. Это его визуальная форма представления:

image

А это его ассемблерная программа:

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

image

Считаю это неплохим результатом, по крайней мере, эта скорость почти в десять раз быстрее чем у Lua и Espruino.

Заключительная часть


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

Также отмечу, что выбранный способ хранения сценариев (непосредственно в самих устройствах, а не на сервере), упрощает переключение уже работающих устройств на другой сервер, например на домашний Raspberry, здесь инструкция.

На этом всё, буду рад услышать советы и конструктивную критику.
Поделиться публикацией

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

    +2
    Спасибо за статью, не попадался пока данный девайс на глаза. Да еще и за небольшие деньги. Еще бы такой же, только с возможностью подключения большего количества датчиков.
      +2
      Мне показалось, что четырёх датчиков хватит для всего, но видимо случаи бываю разные. Я могу переделать прошивку на большее количество.
        +1
        Я неправильно выразился. Большую номенклатуру. Датчик влажности, освещенности и т.д.
          +2
          В таком случае, лучше подобрать другую железяку. Sonoff Basic не имеет разъёмов для подключения различных периферийных устройств.
            0

            Говорят, что контакты RX-TX, при некоторых прошивках, можно использовать для подключения I2C-шины.
            И вот эта вот гребёнка между релюхой и разъёмом нагрузки это не GPIO?
            image

              +1
              Ваша правда. Для I2С контакты есть (ведь он программный). Но сейчас я их использую как UART для логирования, хотя это и необязательно.
                0
                При наличии достаточно «прямых» рук и мелкого паяльника магически получаем +2 GPIO (4, 5) без особых усилий, помимо стандартных RX, TX, GPIO 14, GPIO0 (кнопка), GPIO13 (светодиод). Паяются тонким проводом прямо к ноге микросхемы и выводятся на пустые контакты от RF приёмника.

                Во всяких готовых конструкторах (ESPEasy, Tasmota и т.п.) как раз эта дополнительная пара и используется :)
                  0
                  Так что бы из Sonoff basic сделать Sonoff RF не обязательно иметь прямые руки. Достаточно моих «кривых», одного транзистора, одного резистора и одного такого модуля
                  Правда, опять же нужна прошивка от сервиса MGT24
                +1

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


                • Sonoff Basic
                • прошивка WiFi-IoT
                • на RX/TX (GPIO 1/3) соответственно подключен I2C датчик температуры/влажности Si7021
                • на оставшийся на этой гребёнке GPIO15 по 1wire подключен DS18B20 за температурой бойлера следить (управление им следующий этап, добавится упомянутый ранее Electrodragon WiFi Relay у которого одна из релюшек будет заменена на Fotek SSD-40DA)
                0

                Обратите внимание на Electrodragon WiFi Relay (www.electrodragon.com).
                По цене сравнимой с Sonoff basic получаете 2 реле, 2 кнопки и кучку уже выведенных GPIO (на некоторых запаяна подтяжка но предусмотрена возможность удаления/восстановления её)

                  +1
                  Я исходил из того, что Sonoff является законченным устройством в корпусе. Купил, залил новую прошивку, да и пользуйся.
                    +1

                    https://www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266/ — упомянутая мной железка аналогично является законченным устройством в корпусе (несколько больше размером чем Sonoff basic)

                      0
                      Дело в том, что железа всякого уже понаделано уже полно, в том числе и хорошего. Эта конкретная железяка в наших краях крайне редко встречается, а Sonoff на каждом углу можно приобрести. Если вдруг умер, похоронил его и взял другой. У меня на Sonoff basic только комнатных термостатов штук восемь. И еще девять шт. Sonoff dual, управляют приводами роллет. Кстати, прошивка от MGT24, позволяет поселить в Sonoff dual радиомодуль.
                        0

                        Редкая, не спорю.
                        Но удобство работы с ней позволяет закупить сразу неск штук, с учётом того чтобы парочку в зип положить :-)

                          0
                          Но удобство работы с ней позволяет закупить сразу неск штук, с учётом того чтобы парочку в зип положить :-)

                          Я предпочитаю два простых и доступных, чем одно сложное и редкое :-)
                0
                А смысл в том какой? Мне для комнатного термостат хватает одного ds18b20.
                Для бойлера косвенного нагрева 4-х таких же. А потребности в датчике влажности или освещенности, никогда не возникало. Зачем они? Чем управлять в зависимости от их состояния?
                  0
                  Хотя, если научить Sonoff basic с прошивкой PLC от MGT24 научить понимать датчик влажности, ну к примеру такой , то он мог бы посредством сценария управлять контроллером системы автоматического полива а газона.
                    +1

                    Ну, вот, например DHT22
                    Эти и множество других вещей на 4PDA

                      0
                      Ну скажем, как использовать DHT22, мы сообща придумали, а еще другие датчики зачем? Я знаю еще одного потребителя на датчик кислотности, то который ph растворов, но у него пока еще даже устройства нет, для которого прошивку делать.
                    +1
                    Тут смотря что автоматизировать. По датчику освещенности можно организовывать управление световыми сценариями дома. По датчику влажности — вытяжкой в ванной. Это первое, что приходит в голову.
                      0
                      По датчику влажности — вытяжкой в ванной. Это первое, что приходит в голову.

                      Кстати, да. У меня такая проблема существует. Хотя ванная самое теплая комната в доме, но при этом и самая влажная, вечная борьба с грибком на рамах окон и в дальнем углу ее.
                +1
                Вот есть такой вариант youtu.be/nOgsU1K7hCo, до 16 ds18b20 +влажность и давление.
                  0
                  Вот есть такой вариант youtu.be/nOgsU1K7hCo, до 16 ds18b20 +влажность и давление.

                  Хороший обзор, подробный. Спасибо за ссылку.
                  Пока не могу придумать как использовать датчик давления. Чем управлять в зависимости от его показаний?
                    0
                    Управлять планетой Вы вряд ли сможете :), это больше информационный сигнал, для отслеживания изменений погоды, например, планирования выезда на рыбалку :)
                      0
                      Управлять планетой Вы вряд ли сможете :)

                      Это, конечно — да :-)
                      это больше информационный сигнал, для отслеживания изменений погоды, например, планирования выезда на рыбалку :)

                      Так я для этого Gismeteo использую. Дешево и сердито :-)
                0
                Рискую показаться занудой, но факториал все же произведение чисел, а не сумма. Смотреть в листинг на JS.
                  0
                  :) Вот это поворот!!!
                  Ну что-же, придётся править статью :D
                  Это моя неряшливость, в одном примере у меня стоит умножить, а в другом сложить.
                  0
                  У меня с помощь сценария организована взаимосвязь между комнатными термостатами и контроллером ТТ котла, таким образом, что зависимости от того работает котел или нет, в комнатах поддерживается разная температура.
                    0
                    Ну, вот, например DHT22
                    Спасибо за ссылку :-).
                    Кстати научите, пожалуйста, картинки в комментарии вставлять. Никак не соображу как это делается :-)
                      0
                      Сценарий «Бойлера косвенного нагрева» выглядит так image
                      Управление бойлером производится также Sonoff basic с прошивкой PLC, который отслеживает температуру на 4-х ds18b20.
                      Sonoff отслеживает энергоисточник, разрешенное время потребления от электросети и остаток горячей воды в нем. Все это реализовано сценарием.
                        0
                        Программирование через Blocky на сервисе MGT24 делается? Если нет, то зачем ключи доступа к этому сервису нужны?
                        После программирования — можно ключи доступа к MGT24 удалять?
                          0
                          Графическая среда Blockly встроена в MGT24.
                          Для работы самого скрипта сервер не нужен. Но сама заливка скрипта в устройство идёт через сервер. Также через сервер происходит связь устройства с панелями управлениями для удалённого мониторинга параметров. Сервер можно развернуть локально на raspberry.
                            0
                            После программирования — можно ключи доступа к MGT24 удалять?

                            Если речь идет об этих image
                            <img
                            То они нужны для доступа на панель управления
                            image
                            image

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

                          Самое читаемое