nooLite 2019. ESP32+MTRF64: mqtt Hub.

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

В предыдущем сообщении рассказано, как залить Lua прошивку в ESP32, и без повторения нам не обойтись, после чего продолжим изготовление этого устройства:

Опыт эксплуатации показал устойчивость и безглючность этого устройства, чего не скажешь о ESP32 в целом, ибо при разработке в двух случаях ловились Guru Meditation Error и их пришлось программно обходить. Кто слегка понимает Lua кодинге, наверняка заметит некоторые странности, вдобавок к сгенерированному мной индусскому коду 🙂

Это устройство вобрало весь предыдущий опыт, включая такой, как оказалось, популярный вопрос «световой будильник». Таким образом, все что написано мной ранее на тему nooLite находится в этой железке.

Итак, устройство работает в двух режимах.

В ручном режиме вы запускаете на исполнение всего один файл ‘__testMTRF.lua‘, который предназначен для неспешной ручной привязки и отвязки всех устройств nooLite. После запуска скрипта вы увидите картинку, которая поясняет ваши возможности.

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

  1. В левом окне ESPlorer набираем команду (здесь привязка блока старого типа к ячейке 2);
  2. кнопкой Line отправляем ее на исполнение;
  3. в правом окне видим отчет о том, что операция прошла успешно.

Теперь все что есть у вас в хозяйстве железного будет связано с MTRF64 и готово для дальнейшей работы. Посоветую скрупулезно записывать и сохранять свои действия на будущее, ибо не существует способа узнать у MTRF64 где и что к нему привязано. Я такие записи делал плохо, и, в конце концов, потерял информацию о том, к чему привязан один из релейных выходов SR-2-1000, который длительное время не был задействован.

Для поиска таких «потерянных» силовых блоков я сделал скрипт __testMTRFCellsOnOff.lua, однако работа с ним грустна и тягуча, ибо он последовательно, от 0 до 63 перебирает ячейки, выводя в ESPlorer номер текущей, включая и выключая привязки к ним на 3 секунды, а вам надо сидеть и пялиться на «потерянную» железку, в ожидании момента, когда она включится. (Именно так я делал, сидя на чердаке с ноутбуком, в ожидании срабатывания силового блока 🙂 )

Переходим к работе с хабом. По ссылке лежат все файлы проекта, которые надо закатать в ESP32. Или они же на GitHub.

Перед загрузкой следует уточнить, в соответствии с вашими условиями, два файла.

wifi32.lua:

_setuser.lua:

Загрузив файлы в ESP32, исполняем wifi32.lua и видим:


Далее ПЕРЕГРУЖАЕМ модуль, исполняем файл _init.lua и наблюдаем установление связи с вашим брокером:

Все готово для работы.

С брокером устройство обменивается информацией двумя «потоками». Каждая итерация вызывает отправку модулем на брокер отчет в, условно, raw — формате, когда модуль шлет копию общения по UART без первого и двух последних байт, как незначащих, а также отчет о состоянии управляемого железа nooLite в json формате:

Для разных типов модулей nooLite json слегка различается, но, надеюсь, там все логично, и понимание не вызовет затруднений. Датчики температуры, температуры и влажности:

Управление силовыми блоками через брокер осуществляется типовой парой топик/сообщение, где топик будет иметь вид:

Имя_Вашего_Устройства/com/номер_ячейки,

а данные — json, который выглядит:

{«switchf»:»Off»}

Выключение блока нового типа, привязанного к ячейке 0:

Типы команд, которые поддерживает устройство:

После проверки работоспособности, понимания того, как все работает, остается лишь запустить железку в самостоятельную работу. Нажимаете на кнопку, с названием (1.) «_renameinit.lua» и наблюдаете следующее:

(2.) Вам дается 15 секунд на «передумать», (3.) устройство перезагружается, (4.) входит в сеть, подключается к брокеру.

Кнопка «_renameinit.lua» — волшебная кнопка. Если нажать ее еще раз, она запретит устройству автоматическую загрузку, перезагрузит его и дальше вы сможете работать с ним в ручном режиме.

Видимо, на этом стоит завершить. В этот раз я не стал детально объяснять код скриптов — мало кому это требуется.

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

Вместе с тем, на том железе, что применяю я, устройство показало отличные результаты. Желаю и вам приятной работы с ним, в особенности приятного кодинга вашей системы умного дома, в целях парсинга и выдачи именно того формата сообщений, который реализован здесь. У меня, в частности, устройство работает в связке NodeRed/Domoticz. Всем удачи!

UPD15.03.2022

Соединение с брокером wqtt.ru:

Что следует уточнить для соединения с брокером.

Файле «_setuser.lua» сделать в соответствии со своими данными:

timezone = 'EST-3'
--- mqtt ---
dat.clnt = 'mtrf64'
print('\nMQTT Client Name: '..dat.clnt)
dat.brk = 'm4.wqtt.ru'
dat.port = 4841
dat.user = 'u_9T9H2H'
dat.passwd = 'M2j47QlD'
Файл "mqttset.lua" будет:
do
    if not killtop then killtop = {} end
    if not dat then
        dat = {
            brk = 'iot.eclipse.org',
            port = 1883,
            clnt = 'nooliteMTRF',
            user = 'userr',
            passwd = 'passwdd'
        }
    end
    local brk = dat.brk
    dat.brk = nil
    local port = dat.port
    dat.port = nil
    local user = dat.user
    dat.user = nil
    local passwd = dat.passwd
    dat.passwd = nil
    local subscribe, merror, newm, mconnect
    
    function subscribe(con)
        print("connected")
        dat.broker = true
        con:subscribe(dat.clnt.."/com/#", 0)
        con:publish(dat.clnt..'/state', "ON", 0, 1)
        print("Subscribed")
    end
    
    function merror(con)
        con = nil
        m = nil
        tmr.create():alarm(5000, tmr.ALARM_SINGLE, function() mconnect(newm()) end)
    end
    
    function newm()
        m = mqtt.Client(dat.clnt, 25, user, passwd)
        m:lwt(dat.clnt..'/state', "OFF", 0, 1)
        m:on("offline", function(con)
            con:close()
            dat.broker = false
            print("offline")
            merror(con)
        end)

        m:on("message", function(con, top, dt)
            killtop[1] = tonumber(string.match(top, "/(%w+)$")) or 65
            if killtop[1] ~= 65 then 
                killtop[2], killtop[3] =  string.match(dt, '{"(%w+)":"?(%w+)"?}') 
                print('MQTT Got:', killtop[1], killtop[2], killtop[3])
                if file.exists('run.lua') then dofile('run.lua') end
            end
        end)
        return m
    end
    function mconnect(con)
        con:connect(brk, port, 0, 0, subscribe, merror)
    end
    mconnect(newm())
end

nooLite 2019. ESP32+MTRF64: mqtt Hub.: 13 комментариев

  1. Не нашёл, другого способа, как с вами можно связаться для консультации. Спасибо вам за отличный проект и за то, что Вы им поделились! Всё поднял по вашим инструкциям на ESP32. Казалось бы — вот оно счастье… Но по какой-то причине каждый 1-1.5 дня ESP32 перестаёт отзываться по MQTT и присылать данные ( вижу по статистике получения данных от датчика температуры NooLite в Domoticz и переставшие поступать данные от датчика открытия дверей). На отправку сообщений в сторону MQTT брокера, которые адресованы nooliteMTRF тоже перестаёт хоть как-то отзываться. К сети он точно подключен (в интерфейсе роутера соединение видно). Выключение/включение питания и всё снова работает на очередные 1-1,5 дня. Идеи, что ещё можно проверить, заканчиваются. 😦 Буду очень благодарен, если подскажете в какую сторону копать.

    Нравится

    1. Копать в сторону брокера и сети. Взаимодействие может останавливаться, если брокер не подтверждает получение очередного сообщения или оно не доходит до устройства. При этом обмен служебными сообщениями худо-бедно происходит.

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

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

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

      Нравится

  2. может вопрос глупый но как подключится к mqtt брокеру с авторизацией
    timezone = ‘EST-3’
    — mqtt —
    dat.clnt = ‘nooliteMTRF’
    dat.brk = ‘iot.eclipse.org’
    dat.port = 1883

    где тут задать логин и пароль ?

    Нравится

    1. Чет мне кажется сейчас адрес Брокера «mqtt.eclipse.org»
      Пробуйте. Пароль/логин не нужны И имя клиента поменяйте на что-то более уникальное.

      Нравится

  3. mqtt explorer на Брокера «mqtt.eclipse.org» сейчас отказывается подключаться (((
    есть интересный брокер https://www.wqtt.ru/ через корявый можно работать с Алисой
    но он требует логин и пароль
    может подскажите как и где модифицировать чтобы был доступ по логину и паролю

    Нравится

    1. https://github.com/igorkkk/nooLite_ESP32_mqtt_hub
      Внес изменения, но, к сожалению, не могу проверить работоспособность. Обычно я так не делаю, но доступ к железу будет нескоро.
      Изменения касаются файлов _setuser.lua и mqttset.lua.

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

      Пожалуйста, напишите о работоспособности изменений.

      Нравится

  4. к сожаление нет конекта (( пробовал и по имени и по ip
    к серверу подключаюсь без шифрования и сертификатов
    dat.clnt = ‘nooliteMTRF’
    dat.brk = ‘m9.wqtt.ru’
    dat.port = 10352
    очень благодарен за помощь может подскажите где смотреть логи
    возможно удобней будет связаться Telegram @kurs75

    Нравится

  5. я тоже пока плавно разбираюсь и прописываю модули
    если получится с этим брокером то Алиса должна работать без дополнительного оборудования
    а голосовое управление это основная задача

    Нравится

    1. полностью перепрошил модуль и все прекрасно заработало
      теперь чтобы управлять светом через Алис использую Ваше решение и http://www.wqtt.ru и за 300 руб в год это прекрасно ) Большая вам благодарность за помощь

      Нравится

      1. Спасибо!
        У меня все работает на внутреннем брокере, а поддержка Алисы крутится на NodeRed, что стоит на том же железе, что и брокер. Так мне кажется безопаснее: все не выходит за пределы домашней сетки и канала VPN, по которому постоянно связаны дача и дом. В этом канале — мост между домашним и дачным брокером.

        Нравится

Добавить комментарий для Ruslan Отменить ответ

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s