ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. alp69

    alp69 Форумчанин

    Попробую. Скорее всего память течет из-за того, что # заставляет m:оn("message"...) слушать все топики, а там очень интенсивный траффик. Вот оно и пытается все отследить и вязнет в обработке всего этого мусора. А при исключении # его "отпускает". Доберусь до дома - буду дальше разбираться.
    По результатам отпишусь.
     
    Последнее редактирование: 17 апр 2020
  2. alp69

    alp69 Форумчанин

    @DCat , а если так попробовать:
    functionLib.lua
    Код (C++):

    --функция публикации в MQTT брокер
    function funcTab.publicMQTT (conf, topic, data)
       m = mqtt.Client(conf.mqttClientId, 120, conf.mqttClientUser, conf.mqttClientPwd)
        m:connect(conf.mqttServerIP, conf.mqttServerPort, 0, function(client)
        --print("MQTT connected "..topic)
        --публикуем инфу в топик
        client:publish(topic, data, 0, 0, function(client) print("MQTT sent: " .. topic) end)
        end,
        --функция ошибки
        function(client, reason)
        print("failed reason: " .. reason)
        end)
        m:close();
    print("connect closed "..topic)
    end
     
    (добавлены print после m:сlose() и topic в print после connect)
     
  3. ИгорьК

    ИгорьК Гуру

    Если это вынуждает брокер слать все что у него есть на устройство, то это конечно лишне.
    Я делаю топик для подписки "имя_устройства/com/#'.
    Устройство публикует данные в топики:
    "имя_устройства/название_данного".
    Таким образом можно передавать команды устройству и не путаться с тем что приходит от него.

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

    alp69 Форумчанин

    Спасибо. В принципе так и делаю. Просто на этапе разработки когда набрасывал код, целевых топиков еще не было. Вот и воткнул "/#". А потом забыл.
    Как и предполагал:
    Обычно делаю так:
    Код (Lua):
    m:subscribe({["/myhome/Mur_SET_GVS"]=0,["/myhome/Mur_SET_HVS"]=0}
    ...
     
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Это вариант, но он сильно ограничивает перечень отправляемых команд.
    Возможно подписываться с "#",

    Код (Lua):
    function subscribe(con)
        print("Connected to "..brk..' as '..dat.clnt)
        dat.broker = true
        con:subscribe(dat.clnt.."/com/#", 0)
        con:publish(dat.clnt..'/state', "ON", 0, 1)
        print("Subscribed")
    end

    а парсить пришедший топик на команды так:
    Код (Lua):
    m:on("message", function(con, top, dt)
        top = string.match(top, "/(%w+)$")
        print('Got', top, dt)
    ...
     
    Последнее редактирование: 17 апр 2020
  6. alp69

    alp69 Форумчанин

    Красиво. Но у меня вылезла проблема из-за того, что несколько устройств с периодом 200 мс шлют свое состояние в свои топики. А подписка на # вынуждает обрабатывать их все. Независимо от того строка это или число. Вот память и течет. Делались устройства в самом начале изучения Lua и MQTT. И стоят они в 1600 км от меня. Если помните - управлялки светом на бистабильных реле. Новые скрипты, не забивающие канал, написаны, осталось дождаться отпуска и перезалить.
    P.S. Работают 4-й год. Уже карточка на той малине умерла,а они все пашут. Правда шлют уже не на местную малину, а мне - в Мурманск.
     
    ИгорьК нравится это.
  7. alp69

    alp69 Форумчанин

    Не совсем понял. Чем ограничивает?
     
  8. Listian

    Listian Нуб

    блин, понаплодили интерпретаторов MicroPython, Espruino, Lua. теперь непонятно какой выбрать.

    в вашей секте святого Lua какие плюшки для новых адептов по сравнению с другими?

    пока питон препарирую.
     
  9. ИгорьК

    ИгорьК Гуру

    Списком этих команд, которые надо перечислять при подписке. То что я предлагаю принимает любую команду в топике (то есть их не надо перечислять, но они привязаны к этому устройству его имененм):
    Код (Text):
    имя_устройства/com/любая_команда
    и выделяет эту команду лишь как top = "любая_команда"
    А ее потом следует лишь интерпретировать.

    Если имя устройства - переменная "client", а она всегда есть, если вы не толкаете имя непосредственно в код, то это все выглядит как:
    Код (Lua):
    m:subscribe(client.."/com/#", 0)
    и годится для любого устройства, то есть - шаблон годный к любой железке.
    Наверно плохо объяснил. Это надо пробовать.
     
    Последнее редактирование: 17 апр 2020
    alp69 нравится это.
  10. alp69

    alp69 Форумчанин

    Не совсем понял на словах. Попробую на практике.
     
  11. alp69

    alp69 Форумчанин

    У каждого свое понимание термина "плюшки". Все индивидуально. Пробуйте.
     
  12. ИгорьК

    ИгорьК Гуру

    Валялась BeagleBone. Загнал в ее память, не на карту, Debian и поставил на нем Mosquitto. Только . Лишь один брокер. Этот брокер делает мост с главным домашним. Те устройства, что на даче, завязаны на BeagleBone. Дальше все идет через мост.

    В чем смысл.

    Брокер - очень важная "фигура". Малина всем хороша, кроме как за 1600 км внезапно умирает карточка. Через брокер некоторые устройства связываются между собой, в частности гуляет информация об освещенности на улице.
    Если происходит "обрыв" с "центром"- все работает, просто теряется мост.

    Вы же всегда находитесь только в одном месте. Если что-то происходит в другом - все встает колом.
     
    Последнее редактирование: 18 апр 2020
  13. alp69

    alp69 Форумчанин

    Согласен. У меня сейчас все идет в Мурманск. Все устройства шлют всё на белый IP. Все стало намного стабильнее. Осталось изучить вопрос развертывания системы на внешнем диске, подключаемом к малине.
     
  14. alp69

    alp69 Форумчанин

    Вопрос. Можно ли таблицу Lua записывать в файл и читать ее оттуда? Или только строковыми значениями туда и оттуда через парсинг заталкивать опять в таблицу?
     
  15. ИгорьК

    ИгорьК Гуру

    Таблицу читать из файла нельзя, но все это просто - читаем строку, она всегда строка, у нее есть номер и все это пихаем в таблицу под номерами. Там даже парсинг не нужен.
    Естественно, цифровые данные придется перегонять через tonumber().
     
  16. ИгорьК

    ИгорьК Гуру

    Есть еще такая фишка:

    Код (Lua):
    a = loadstring('print("URA!")')
    a()
    Смысл улавливаете? :)

    Ну или ближе к теме:
    Код (Lua):
    do
    tbl = {}
    str = "tbl.data = 1"
    loadstring(str)()
    print(tbl.data)
    end
     
    alp69 нравится это.
  17. Listian

    Listian Нуб

    а для вас какие?

    смотрю у Lua не менее упоротый синтаксис чем в питоне.

    вроде Espruino самый вменяемый вариант (javascript все же), но с включенным WiFi 28Кб оставил на ESP32... ну не заю(((
     
  18. DCat

    DCat Нерд

    Код мой. Кое какие куски функций копипастил отсюда https://nodemcu.readthedocs.io, но логика моя )). Опыт программирования небольшой имеется, но давненько было. Говорите как есть, если что не пойму сразу, разберусь позже.
     
  19. DCat

    DCat Нерд

    Только VBA и 1С программирование. До других не доходили руки )
     
  20. DCat

    DCat Нерд

    Точно, наворотил как-то. Буду разбираться. Скорее всего не правильно написал функцию публикации на mqtt. Немного по другому наверно сделаю. Сначала соберу все показания датчиков в таблицу, а потом уже за один вызов функции все опубликую.
     
    Последнее редактирование: 18 апр 2020