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

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

  1. alp69

    alp69 Форумчанин

    Но swich() внутри функции on, обрабатывающей только прием сообщения. Или в ней тайно скрыт еще и отклик?

    Зы. Про параллельность и многозадачность я разобрался еще в ходе кодирования.

    Зы.зы. Аааа! Семен-Семеныч! Delay тормозит всю систему! Так?
     
  2. ИгорьК

    ИгорьК Гуру

    ON - callback функция. Свитч там нормально, потому что он вызывается по событию и есть просто выбор. (Насколько мне с телефона понятно)
     
  3. ИгорьК

    ИгорьК Гуру

    Таймеры можно переопределять. Почитайте API - таймеры можно определять заранее, запускать, останавливать. Их и двух хватит... просто не всегда это нужно. Но интересно.
     
  4. alp69

    alp69 Форумчанин

    Тогда в свете многозадачности...
    Если publish в два разных топика стартанет практически одновременно? Чего ожидать? Или пока один не отработает - другого к передаче не допустят?
     
  5. ИгорьК

    ИгорьК Гуру

    У паблиш есть callback функция. То есть она вызывается только после успешной публикации. Туда и можно заталкивать следующую.
    Но в примерах у них часто есть просто две функции публикации подряд.
    Я не проверял. Считаю что это правильнее - использовать callback. Причём для надёжности часто запускаю таймер на пол секунды. Может это лишнее но хуже не бывает.
    Кстати, посмотрите внимательнее последний шаблон пересоединения с брокером. Там остановка таймера идёт ДО его линейного запуска. С точки зрения Си это нонсенс.
     
    Последнее редактирование: 25 май 2016
    alp69 нравится это.
  6. alp69

    alp69 Форумчанин

    Уже обратИл внимание.
     
  7. ИгорьК

    ИгорьК Гуру

    OpenHab до 1.8.3 обновился.
     
  8. alp69

    alp69 Форумчанин

    Страницы нормально обновляются?
     
  9. ИгорьК

    ИгорьК Гуру

    Да.
     
  10. ИгорьК

    ИгорьК Гуру

    На оценку слегка измененный вариант запуска датчика температуры от батареек.
    Изменения касаются принудительного назначения IP-адреса и несколько иного порядка наличия соединения с сетью. Соединение (возможно) должно проходить быстрее и надежнее.
    Код (Javascript):
    pin = 4
    cfg = {
      ip = "192.168.1.11", -- принудительно назначаем ip-адрес, зависит от вашей сети
      netmask = "255.255.255.0",
      gateway = "192.168.1.1"
    }

    ap = "ВАША_АР"
    appass = "ВАШ_ПАРОЛЬ"

    Broker="ВАШ_САЙТ"
    port=РАШ_ПОРТ
    myClient="tempMuvGarden"
    iogin=myClient
    pass="ВАШ_MQTT_ПАРОЛЬ"
    m = mqtt.Client( myClient, 120, login, pass)

    sleepdelay = 600
    killdelay = 25
    batcontrol = 2.7
    countsleep = 12

    function sendData(tmpr)
        m:connect(Broker, port, 0, function(conn)
            m:publish("/myhome/"..myClient.."/state",tmpr,0,0, function(conn)
                print("Publised ".. tmpr)
                local bat = adc.readvdd33()
                print("bat = "..bat)
                if bat < (batcontrol*1000) then
                    tmr.alarm(1, 500, 0, function()
                        bat = bat / 1000
                        m:publish("/myhome/"..myClient.."/bat",bat,0,0, function(conn)
                            print("Publised ".. bat.." V")
                            disconnect()
                        end)
                    end)
                else
                    disconnect()
                end
            end)
        end)
    end

    function pubdata(tmpr)
        print("PubData!")
        wifi.setmode(wifi.STATION)
        wifi.sta.setip(cfg)
        wifi.sta.config(ap, appass)
        wifi.sta.autoconnect(0)
        wifi.sta.eventMonReg(wifi.STA_GOTIP,
        function()
            sendData(tmpr)
        end)
        wifi.sta.eventMonStart()
    end

    function publish_data()
        print("work now!")
        local t = 85
        t = getTemp()
        print("Got "..t)
        if t ~= 85 then
            local oldt = rtcmem.read32(0)
            local count = rtcmem.read32(1)
            if (count + 1) < 1 then
                rtcmem.write32(1, 0)
            else
                rtcmem.write32(1, (count+1))
            end
            rtcmem.write32(1, (count+1))
            print("oldt "..oldt)
            local delta = t - oldt
            if delta < 0 then
                delta = delta * -1
            end
            print("Delta "..delta)
            print("count = "..count)
            if (delta > 8) or (count > countsleep) then
                rtcmem.write32(0, t)
                print("countsleep = "..count)
                rtcmem.write32(1, 0)
                if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end
                t = t * 625 / 10000
                print("t = "..t)
                print("Pubish Data!")
                pubdata(t)
            else
                print("Not changes. Go...")
                disconnect()
            end
        end
    end

    function getTemp()
        print("get t")
        local t = 85
        local ds18b20 = require('ds18b20')
        ds18b20.setup(pin)
        local addres={}
        addres=ds18b20.addrs()
        if addres[1] ~= nil then
            t = ds18b20.read(addres[1])
        end
        print("Got "..t)
        return t
    end

    function disconnect()
        tmr.alarm(3, 500, 0, function()
            print("Sleep Now!")
            node.dsleep(1000000*sleepdelay, 4)
        end)
    end
    tmr.alarm(5, 1000*killdelay, 0, function()
        print("Get Sleep By Timer")
        disconnect()
    end)

    publish_data()
     
    Датчик в теплице:
    2352.jpg
     
    Последнее редактирование: 20 июн 2016
  11. ИгорьК

    ИгорьК Гуру

    Подавление дребезга кнопки ESP8266.
    Узелок на память.
    UPD 05/12/2016. Скрипт подправлен с учетом вот этого.

    Код (Lua):
    local pin = 3    --> GPIO 0
    local button = 1
    local count = 1
    function debounce (func)
      local last = 0
      local delay = 50000 -- 50ms
      return function (...)
          local now = tmr.now()
          local delta = now - last
          if delta < 0 then delta = delta + 2147483647 end;
          if delta < delay then return end;
          last = now
          return func(...)
      end
    end

    function onChange ()
        local btn
        btn = gpio.read(pin)
        if btn == 0 then
            button = 0
        end
    end

    gpio.mode(pin, gpio.INT)
    gpio.trig(pin, 'both', debounce(onChange))

    tmr.alarm(0, 100, 1, function()
        if button == 0 then
           print ("Button pressed ".. count .." times!")
           button = 1
           count = count + 1;
        end
    end)
     
     
    Последнее редактирование: 5 дек 2016
  12. igboris

    igboris Нерд

    Здравствуйте, коллеги!

    И всё же попробуем импортозаместить :)

    На мой запрос ответили с Яндекса:
    На tech.yandex.ru - ничего не нашёл (может плохо искал), а выяснил следующее:
    1. изменился адрес *.xml файла, да и ID городов сделали другими.
    2. Файл доступен по адресу: http://export.yandex.ru/bar/reginfo.xml?region=213.xml (213 - Москва)
    3. ID своего (или ближайшего города) можно узнать по адресу: http://yandex.ru/yaca/geo.c2n
    Не знаю сколько это проработает, но пока всё хорошо.
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    Ай, спасибо! Хорошая информация у Яндекса но прячет он её. Вернусь к импортозамещению вновь :)
     
  14. igboris

    igboris Нерд

    Всегда пожалуйста!
    Из полезностей с этом xml-е ещё загруженность дорог и пробки показывает, что тоже можно на сайтмап вывести (если кому это понадобится).
     
  15. ИгорьК

    ИгорьК Гуру

    Там есть ссылки на картинки погоды. В первую очередь это погода.
    Ссылку на Ваш пост в заголовок вынесу как до компа доберусь.
     
  16. ИгорьК

    ИгорьК Гуру

    Видимо я проспал и всем это известно... (NodeMCU, ESP8266)
     
    Последнее редактирование: 21 июн 2016
    Securbond нравится это.
  17. ИгорьК

    ИгорьК Гуру

    Обновил шаблончик запуска скрипта и удержания связи с MQTT брокером. Сделал его компактнее , на одном таймере и слегка изменил логику работы.
    Полагаю, решил проблему для GPRS/LTE роутеров на дачах.
    В чем там она: после выключения и включения всего электричества в доме сеть восстанавливается быстрее чем в ней самой появляется Интернет.
    В таких случаях, соединение с брокером (если он находится за пределами локальной сети) при старте ESP8266 не устанавливается и в дальнейшем модуль хотя и держит сеть, но клиент перестает искать брокер.
     
    Последнее редактирование: 23 июн 2016
    alp69 нравится это.
  18. alp69

    alp69 Форумчанин

    Потестить пока не на чем. Но кажется, что getConnect() крутится в бесконечном цикле. Ведь на выходе из нее опять происходит ее вызов. Причем при любом исходе проверки на наличие коннекта.И старта функции по 6-му таймеру так и не произойдет.
     
    ИгорьК нравится это.
  19. alp69

    alp69 Форумчанин

    Имхуется мне, что вот этот участок:
    Код (Lua):
     getConnect()
        tmr.alarm(6, 90000, 1, function()
            getConnect()
    должен выглядеть вот так:
    Код (Lua):
     tmr.alarm(6, 90000, 1, function()
            connecting()
     
  20. ИгорьК

    ИгорьК Гуру

    Проверяйте. Или неспеша анализируте. У меня все работает :)
    Анонс: Почти готов проект полива теплицы.
     
    Последнее редактирование: 23 июн 2016