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)


  1. kt819a
    06.05.2019 08:27

    Спасибо за статью, не попадался пока данный девайс на глаза. Да еще и за небольшие деньги. Еще бы такой же, только с возможностью подключения большего количества датчиков.


    1. valeraba Автор
      06.05.2019 08:35

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


      1. kt819a
        06.05.2019 08:41

        Я неправильно выразился. Большую номенклатуру. Датчик влажности, освещенности и т.д.


        1. valeraba Автор
          06.05.2019 08:49

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


          1. Shtucer
            06.05.2019 09:10

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


            1. valeraba Автор
              06.05.2019 09:34

              Ваша правда. Для I2С контакты есть (ведь он программный). Но сейчас я их использую как UART для логирования, хотя это и необязательно.


              1. av0000
                06.05.2019 16:33

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

                Во всяких готовых конструкторах (ESPEasy, Tasmota и т.п.) как раз эта дополнительная пара и используется :)


                1. glory2
                  06.05.2019 16:49

                  Так что бы из Sonoff basic сделать Sonoff RF не обязательно иметь прямые руки. Достаточно моих «кривых», одного транзистора, одного резистора и одного такого модуля
                  Правда, опять же нужна прошивка от сервиса MGT24


            1. SolarW
              07.05.2019 14:39

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


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


          1. SolarW
            06.05.2019 12:30

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


            1. valeraba Автор
              06.05.2019 12:47

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


              1. SolarW
                06.05.2019 12:51

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


                1. glory2
                  06.05.2019 17:25

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


                  1. SolarW
                    07.05.2019 14:41

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


                    1. glory2
                      07.05.2019 16:21

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

                      Я предпочитаю два простых и доступных, чем одно сложное и редкое :-)


        1. glory2
          06.05.2019 16:35

          А смысл в том какой? Мне для комнатного термостат хватает одного ds18b20.
          Для бойлера косвенного нагрева 4-х таких же. А потребности в датчике влажности или освещенности, никогда не возникало. Зачем они? Чем управлять в зависимости от их состояния?


          1. glory2
            06.05.2019 17:40

            Хотя, если научить Sonoff basic с прошивкой PLC от MGT24 научить понимать датчик влажности, ну к примеру такой , то он мог бы посредством сценария управлять контроллером системы автоматического полива а газона.


            1. Shtucer
              06.05.2019 18:00
              +1

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


              1. glory2
                06.05.2019 18:28

                Ну скажем, как использовать DHT22, мы сообща придумали, а еще другие датчики зачем? Я знаю еще одного потребителя на датчик кислотности, то который ph растворов, но у него пока еще даже устройства нет, для которого прошивку делать.


          1. kt819a
            07.05.2019 08:59

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


            1. glory2
              07.05.2019 10:55

              По датчику влажности — вытяжкой в ванной. Это первое, что приходит в голову.

              Кстати, да. У меня такая проблема существует. Хотя ванная самое теплая комната в доме, но при этом и самая влажная, вечная борьба с грибком на рамах окон и в дальнем углу ее.


    1. PR200SD
      06.05.2019 23:52

      Вот есть такой вариант youtu.be/nOgsU1K7hCo, до 16 ds18b20 +влажность и давление.


      1. glory2
        07.05.2019 11:05

        Вот есть такой вариант youtu.be/nOgsU1K7hCo, до 16 ds18b20 +влажность и давление.

        Хороший обзор, подробный. Спасибо за ссылку.
        Пока не могу придумать как использовать датчик давления. Чем управлять в зависимости от его показаний?


        1. PR200SD
          07.05.2019 11:36

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


          1. glory2
            07.05.2019 16:25

            Управлять планетой Вы вряд ли сможете :)

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

            Так я для этого Gismeteo использую. Дешево и сердито :-)


  1. Abo73
    06.05.2019 14:51

    Рискую показаться занудой, но факториал все же произведение чисел, а не сумма. Смотреть в листинг на JS.


    1. valeraba Автор
      06.05.2019 14:52

      :) Вот это поворот!!!
      Ну что-же, придётся править статью :D
      Это моя неряшливость, в одном примере у меня стоит умножить, а в другом сложить.


  1. glory2
    06.05.2019 19:35

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


  1. glory2
    06.05.2019 19:44

    Ну, вот, например DHT22
    Спасибо за ссылку :-).
    Кстати научите, пожалуйста, картинки в комментарии вставлять. Никак не соображу как это делается :-)


  1. glory2
    06.05.2019 20:02

    Сценарий «Бойлера косвенного нагрева» выглядит так image
    Управление бойлером производится также Sonoff basic с прошивкой PLC, который отслеживает температуру на 4-х ds18b20.
    Sonoff отслеживает энергоисточник, разрешенное время потребления от электросети и остаток горячей воды в нем. Все это реализовано сценарием.


  1. and7ey
    07.05.2019 09:54

    Программирование через Blocky на сервисе MGT24 делается? Если нет, то зачем ключи доступа к этому сервису нужны?
    После программирования — можно ключи доступа к MGT24 удалять?


    1. valeraba Автор
      07.05.2019 10:09

      Графическая среда Blockly встроена в MGT24.
      Для работы самого скрипта сервер не нужен. Но сама заливка скрипта в устройство идёт через сервер. Также через сервер происходит связь устройства с панелями управлениями для удалённого мониторинга параметров. Сервер можно развернуть локально на raspberry.


    1. glory2
      07.05.2019 11:17

      После программирования — можно ключи доступа к MGT24 удалять?

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