Arduino, ESP8266 Lua, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. alp69

    alp69 Форумчанин

    Этот еще не тестил, но в предыдущих версиях периодически при вызовах функции getConnect() модуль рестартился с криком "соединение уже установлено". Кстати, заметил это еще летом. Но у предыдущих устройств эти рестарты были не критичны, а в случае с роутер ребуттером - критично. У себя функцию коннекта/реконнекта с брокером перепилил. Работает без несанкционированных рестартов. Как возможность появится - поделюсь своим кодом. Он конечно не в пример авторскому (ИгорьК(C)) более примитивен и не так элегантен. Зато более понятен чайникам вроде меня. :D
     
    ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Задолбало меня это устройство. Пытался задействовать автоконнект - при отвале wifi - падает. Не задействовать - при перезагрузке брокера - отваливается.
    И Вы пишите когда что не правильно работает - надо же исправлять.
    Хотя у NodeMCU замечательное свойство: что не так - перегрузился и снова работает. Не виснет как ардуино :)
     
    alp69 нравится это.
  3. alp69

    alp69 Форумчанин

    Я впихнул перед вызовом getConnect() такую штучку, как m:close(). Перестало падать.
     
    ИгорьК нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Хорошая мысль!
     
  5. dimm71

    dimm71 Нерд

    Делал по этому шаблону http://forum.amperka.ru/threads/ard...ый-дом-азы-управления.5043/page-67#post-99471 поднятие WiFi при отваливании сети, но после восстановления тоже падает. В какое место прописать m:close() ? :)
     
    alp69 нравится это.
  6. alp69

    alp69 Форумчанин

    Не видя структуры Вашего кода сложно что-то посоветовать. Но если не особо вникать и тупо "в лоб", то перед строкой
    Код (Lua):
     m:connect(Broker, port, 0, 0, function(conn)
    Должно сработать.
    m:close() закрывает соединение с брокером. И это устраняет ошибку и рестарт при попытке повторного коннекта с брокером при уже установленном соединении.
     
  7. dimm71

    dimm71 Нерд

    Сработало, но частично. Ругаться на то, что связь установлена перестало. Просто молча перезагружается. Решение оказалось другим. Нужно было остановить таймер 1 " tmr.stop(1) " после возобновления связи и отключения АР. Думаю, стоит так же в шаблоне поправить.
     
    alp69 нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Тут вот в чем дело. С каждым обновлением прошивки модуль MQTT работает слегка по-разному. Это касается удержания коннекта с брокером. Автоконнект в разной версии срабатывает по-разному. Это вызывает определенные проблемы, к сожалению. То что раньше работало правильно, начинает заикаться.
     
  9. dimm71

    dimm71 Нерд

    Соглашусь с Вами. Но в данном случае не будет лишним отключить этот таймер, чтобы за зря (когда в принципе это и не нужно) не проверять наличие IP-адреса. Возможно некоторые прошивки допущенные ошибки "проглатывают", а некоторые относятся к ним критически.
     
    Последнее редактирование: 4 фев 2017
  10. ИгорьК

    ИгорьК Гуру

    alp69 решил задачу очень красиво.
    Я месяц боролся с перезагрузкой по повторному коннекту, и за этой задачей не видел простейшего решения.
    Таймер должен быть. Но если произошел разрыв связи, то соединение должно быть сброшено и повторно восстановлено. На следующей неделе будет время - все вместе потестируем шаблон переподключения и утвердим окончательный вариант, думаю.
     
    alp69 нравится это.
  11. alp69

    alp69 Форумчанин

    Спасибо. Приятно слышать Вашу оценку.:)
     
  12. dimm71

    dimm71 Нерд

    В общем попробовал я сегодня сделать будильник по этим шаблонам - не получилось. В браузере значения часов и минут не отображаются и в логах сыпятся ошибки при их изменении
    Код (C++):
    2017-02-05 21:40:19.704 [WARN ] [.w.internal.servlet.CmdServlet] - Received unknown command 'Uninitialized' for item 'weckerZeitStunde'
     
     
  13. alp69

    alp69 Форумчанин

    Давно хотел вникнуть в процесс установки связи с брокером. Проникся...:cool:
    Представляю вниманию уважаемой публики мой шаблон. В коде нет таймеров. Функционал модуля mqtt в прошивке NodeMCU позволяет это сделать.
    Код (Lua):
    ClientID = "test_module" -- имя модуля
    keep_alive = 10 -- периодичность контроля модуля в сети. Можете сами установить (сек.)
    BrokerIP = "192.168.0.110"
    BrokerPort = 1883
    m = mqtt.Client(ClientID, keep_alive)
    m:lwt("/myhome/test_mod_net_state", "offline", 0, 0) -- завещание брокеру

    function connecting()
        m:connect(BrokerIP, BrokerPort, 0, 1, -- вот эта "единичка" позволила избавиться от таймера
            function() -- если успех соединения с брокером
                m:publish("/myhome/test_mod_net_state","online",0,0) -- крикнем в топик, что мы живы)))
                -- сюда можно добавить еще что-нибудь,
                -- что должно выполниться при успешном соединении
                -- к брокеру
                print("CONNECTED") end,
            function() -- если не подключились
                m:close() -- закрываем открытое соединение
                connecting() -- повторяем попытку соединения
                print("LOST CONNECTION")
        end)
    end

    connecting()
    Прошу потестить и высказаться по существу.
     
    Последнее редактирование: 6 фев 2017
    ИгорьК нравится это.
  14. alp69

    alp69 Форумчанин

    Значения "online" и "offline" можно использовать в sitemap для регулировки видимости соответствующих итемов или цвета их подписей. Оффлайн - скрыли (или сделали светло-серым). Онлайн - показали (или вернули исходный цвет). И в Telegram просемафорили при необходимости, если что-то отвалилось от брокера. ;)
     
    Последнее редактирование: 6 фев 2017
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    ОН говорит что при старте значения нужно инициализировать обязательно. С неинициализированными значениями операции не производятся.
    Для инициализации надо писать правило.
     
    Последнее редактирование: 6 фев 2017
  16. ИгорьК

    ИгорьК Гуру

    Мучился я с этой единичкой и не справился, отказался от нее. Уже вижу одну проблему, завтра будет комп - проверю, отпишусь.
     
  17. alp69

    alp69 Форумчанин

    Работает. На обнаружение обрыва и реконнект уходит около 5 секунд. Единственное, что не проверял на утечку памяти.
     
  18. ИгорьК

    ИгорьК Гуру

    Сравниваем автоконнект с таймером:





    Автоконнект работает, но понять это можно при определенном терпении. Поскольку исторически я начинал работать с таймером, то подтверждения разрыва cоединения с автоконнектом я не дожидался.

    Автоконнект слишком долго в колбеке не запрещает публикацию.
    Это достаточно стремно, поскольку может вызвать падение и перезагрузку скрипта.

    Но... Это же Луа: ну упадет, ну перезагрузится и все нормально :)

    Скрипты:
    Код (Lua):
    do
    ClientID = "test_module"
    keep_alive = 10
    BrokerIP = "BROKER"
    BrokerPort = 1883
    m = mqtt.Client(ClientID, keep_alive)
    m:lwt("/myhome/test_mod_net_state", "offline", 0, 0)
    pub = false
    count = 0
    function connecting()
        m:connect(BrokerIP, BrokerPort, 0, 1,
        function()
            pub = true
            m:publish("/myhome/test_mod_net_state","online",0,0)
            print("CONNECTED")
        end,
        function()
            m:close()
            pub = false
            connecting()
            print("LOST CONNECTION")
        end)
    end
    connecting()
    tmr.alarm(3, 5000, 1,function() count = count + 5; print("pub = ", pub, count) end)
    end

    Код (Javascript):
    do
    Broker = "BROKER"
    port = 1883
    myClient = "connect"
    pass = "pass"
    publish = false
    m = mqtt.Client(myClient, 30, myClient, pass)
    m:lwt(myClient, 0, 0, 0)
    count = 0

    function connecting()
        local getConnect
        getConnect = function()
           if wifi.sta.status() == 5 then
                 m:connect(Broker, port, 0, 0,
                    function(conn)
                        tmr.stop(1)
                        publish = true
                        print("Connected")
                end)
            end
        end
        tmr.alarm(1, 10000, 1, function()
            getConnect()
        end)
        getConnect()

    end
    --
    m:on("offline", function(con)
          publish = false
          print("Offline Now!")
          connecting()
    end)
    connecting()
    tmr.alarm(3, 5000, 1,function() count = count + 5; print("pub = ", publish, count) end)
    end
     
    Последнее редактирование: 6 фев 2017
    alp69 нравится это.
  19. dimm71

    dimm71 Нерд

    В том то и дело, что правило есть
    Код (C++):
    rule "Initialization"
    when
       System started
    then
         postUpdate(weckerZeitStunde,  8)
         postUpdate(weckerZeitMinute, 15)
         postUpdate(weckerMontag,     ON)
         postUpdate(weckerDienstag,   ON)
         postUpdate(weckerMittwoch,   ON)
         postUpdate(weckerDonnerstag, ON)
         postUpdate(weckerFreitag,    ON)
         postUpdate(weckerSamstag,    OFF)
         postUpdate(weckerSonntag,    OFF)
    end
     
    Но оно не работает. Значения не выставляются
     
  20. alp69

    alp69 Форумчанин

    Даже после перезагрузки ОН?