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

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

  1. ИгорьК

    ИгорьК Гуру

    Не встречал подписки одного клиента на два топика.

    Код (C++):
    m:subscribe({["topic/0"]=0,["topic/1"]=1,topic2=2}, function(conn) print("subscribe success") end)
     
     
    Последнее редактирование: 28 янв 2016
  2. ИгорьК

    ИгорьК Гуру

    17.3. Управляем nooLite.
    Закончил материал о соединении вместе пульта управления, UART передатчика и USB приемника nooLite.
    Велкам.



    Продолжение.
     
    Последнее редактирование: 30 мар 2016
    АндрейШвед нравится это.
  3. Подписка одновременно на два топика!
    Получилось следующие:
    Код (C++):
    function slave()
    m:subscribe("/myhome/dacha/kotel/command",0,function(conn)end)
    m:on("message", function(conn, topic, data)
    data=tonumber(data)
    if(data>5)and(data<30) then
    tGet=data
    file.open("data.txt", "w+")
    file.write(tGet)
    file.close()
    m:publish("/myhome/dacha/kotel/get",tGet,0,0)
    end
    end)
    n:subscribe("/MyHome/out/TemperatureOutDoor/state",0,function(conn)end)
    n:on("message",function(conn,topic,th)
    th=tonumber(th)
    t=th
    file.open("th.txt", "w+")
    file.write(th)
    file.close()
    end)
    collectgarbage()
    end
    function master()
    if t<tGet then
    gpio.write(6,gpio.LOW)
    switch="ON"
    end
    if t>tGet then
    gpio.write(6,gpio.HIGH)
    switch="OFF"
    end
    m:publish("/myhome/dacha/kotel/switch",switch,0,0)
    collectgarbage()
    end
    function init_network()
    collectgarbage()
    if wifi.sta.status() ~= 5 then
    print("Reconnecting WIFI")
    wifi.setmode(wifi.STATION)
    wifi.sta.config("belka","q65575ea788")
    wifi.sta.connect()
    tmr.alarm(0,5000,0,function()init_network()end)
    else
    print("Connecting to MQTT server")
    tmr.alarm(0,7000,0,function()init_network()end)
    if m~=nil then
    m:close()
    end
    m=mqtt.Client("ESPThero02", 180, "test", "test")
    n=mqtt.Client("ESPThero01", 180, "test", "test")
    m:connect('192.168.1.101',1883,0,function(conn)
    n:connect('192.168.1.101',1883,0,function(conn)
    tmr.stop(0)
    print("Connected")
    m:publish("/myhome/dacha/kotel/get",tGet,0,0)
    m:publish("/MyHome/out/TemperatureOutDoor/state",t,0,0)
    collectgarbage()
    tmr.alarm(0, 1000, 1, function() slave()
    tmr.alarm(0, 3000, 1, function() master()end)
    end)
    m:on("offline",function(con)
    print("offline.Reconnecting")
    init_network()
    end)
    n:on("offline",function(con)
    print("offline.Reconnecting n")
    init_network()
    end)
    end)
    end)
    end
    end
    gpio.mode(6,gpio.OUTPUT)
    gpio.write(6,gpio.HIGH)
    tGet=18
    t=17
    switch="OFF"
    file.open("data.txt","r")
    stT = file.read()
    file.close()
    file.open("th.txt","r")
    th = file.read()
    file.close()
    tGet=tonumber(stT)
    t=tonumber(th)
    init_network()
    Если есть мысли как можно оптимизировать код, буду рад выслушать.(!!!модуль работает на пределе памяти!!!)
     
    ИгорьК нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Код (C++):

    m:subscribe({["topic/0"]=0,["topic/1"]=1,topic2=2}, function(conn) print("subscribe success") end)
     

    Компилировали? Все принты - долой!
    Это скрипт, поэтому каждую букву, каждый лишний пробел надо удалить.
     
    Последнее редактирование: 28 янв 2016
    АндрейШвед нравится это.
  5. Принты не удалял, но компилировал, становится легче, но малоли есть еще какие хаки, nodemcu пока тяжело дается...
     
  6. ИгорьК

    ИгорьК Гуру

    Не nodemcu а Lua :) А ведь когда-то за 400 р покупал! Фигасе!
    Поудаляйте все лишнее, скомпилируйте - будет работать однозначно. Не сомневайтесь.
     
  7. Хорошо, спасибо за советы))
    Время-покажет стабильность!
     
  8. alp69

    alp69 Форумчанин

    Разве компилятор сам не удаляет комменты, а также лишние пробелы и строки?
     
  9. ИгорьК

    ИгорьК Гуру

    Сниппеты ESP-8266.

    Код (Lua):
    wifi.setmode(wifi.STATION)
    wifi.sta.config("AP", "password")
    wifi.sta.autoconnect(1)
    wifi.sta.connect()
    tmr.alarm(0,10000, tmr.ALARM_SINGLE, function()
         ip = wifi.sta.getip()
         print('\n', ip)
    end)

    Код (Lua):
    connection = nil
    do
    print('Start at '..tmr.now())
    conn=net.createConnection(net.TCP, 0)
    --print("Connection = "..conn)
    conn:on("connection",function(conn, payload)
                conn:send("HEAD / HTTP/1.1\r\n"..
                          "Host: google.com\r\n"..
                          "Accept: */*\r\n"..
                          "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
                          "\r\n\r\n")
                connection = conn
                print("Connection = ")
                print(conn)
                end)

    conn:on("receive", function(conn, payload)
        print('\nRetrieved in '..((tmr.now()-t)/1000)..' milliseconds.'..t)
        print('Google says it is '..string.sub(payload,string.find(payload,"Date: ")
               +6,string.find(payload,"Date: ")+35))
        conn:close()
        end)
    t = tmr.now()
    conn:connect(80,'google.com')
    print(connection)
    end

    Код (Javascript):
    do
    conn=net.createConnection(net.TCP, 0)
    conn:on("connection",function(conn, payload)
        conn:send("HEAD / HTTP/1.1\r\n\r\n")
        connection = conn
    end)
    conn:on("receive", function(conn, payload)
        --[[
        print(string.sub(payload,string.find(payload,"Date: ")
        +6,string.find(payload,"Date: ")+35))
        --]]
        -- print(payload)

        local dateNow = string.sub(payload,string.find(payload,"Date: ")
        +11,string.find(payload,"Date: ")+30)
        -- print(dateNow)

        local hourNow = tonumber(string.sub(dateNow, 13,14))+3
        -- print(hourNow)

        local itog = ""..(string.sub(dateNow,1,12))..hourNow..(string.sub(dateNow,15))
        print(itog)

        conn:close()
        -- wifi.setmode(wifi.NULLMODE)
    end)

    --conn:connect(80,'google.com')
    conn:connect(80,'ya.ru')

    end

    Код (Javascript):
    do
    print("\n\n\n\n=================================")
    table.foreach(_G, print)
    print("=================================")
    end

    Код (Javascript):
    do
    for k, v in pairs(package.loaded) do
    --for k, v in pairs(package.loaded.tsmqttmod2) do
    print(k, v)
    end
    end

    Код (Javascript):
    do
    local wifiADD = wifi.sta.getip()
    print(wifiADD)
    wifiADD = nil
    end

    Код (Javascript):
    --If the function returns a [B]non[/B]-nil value the iteration loop terminates
    table.foreach({1,"two",3} , function(k,v) print(k,v) return k<3 and nil end)
    table.foreach(_G, function(k,v) print(v,k) end)

    Код (Lua):
    t = { 1,2,"three"; pi=3.14159, banana="yellow" }
    table.foreachi(t, print)
    -- only for indexed elements
     

    Код (Lua):
    do
    print("\n\n\n\n\n\n")
    print("WiFi: ", (wifi.sta.getip()))
    majorVer, minorVer, devVer, chipid, flashid, flashsize, flashmode, flashspeed = node.info()
    print("NodeMCU "..majorVer.."."..minorVer.."."..devVer)
    print("Flash chip ID: "..flashid)
    print("Flashsize: "..flashsize)
    print("Flashmode: "..flashmode)
    print("Flashspeed: "..flashspeed)
    majorVer, minorVer, devVer, chipid, flashid, flashsize, flashmode, flashspeed =
    nil, nil, nil, nil, nil, nil, nil, nil
    end

    Код (Lua):
    do
    sntp.sync({"ntp4.stratum1.ru", "ntp2.stratum2.ru"},
      function(sec, usec, server, info)
        rtctime.set(sec, 0)
        print('sync', sec, usec, server)
        local tm = rtctime.epoch2cal(rtctime.get())
        print(string.format("%04d/%02d/%02d %02d:%02d:%02d", tm["year"], tm["mon"], tm["day"], tm["hour"], tm["min"], tm["sec"]))
      end,
      function()
       print('failed!')
      end
    )
    end

    Код (C++):
    do
    Broker = "BROKER"
    port = 1883
    myClient = "test"
    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

    Код (Lua):
    do
    print("\n\n\n\n\n\n\n\n\n\n\n\n\n=========== _G table: ===========")
    table.foreach(_G, print)
    print("===== package.loaded table: =====")
    table.foreach(_G.package.loaded, print)
    print("=================================")
    end
     
    Последнее редактирование: 17 фев 2017
  10. alp69

    alp69 Форумчанин

    Немного не въезжаю. В ESP разве не скомпилированный код заливается?
     
  11. ИгорьК

    ИгорьК Гуру

    Нет. Туда заливается скрипт. Скрипт может быть скомпилирован внутри модуля. После компиляции там оказывается два файла: скрипт и новый скомпилированный исполняемый файл. Скрипт после этого надо удалить.
    Но можно не компилировать. Скрипт и так работает, если небольшой.
    Компиляция осуществляется командой
    Код (C++):
    node.compile("myfile.lua")
     
    АндрейШвед и alp69 нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Последнее редактирование: 30 мар 2016
    АндрейШвед и alp69 нравится это.
  13. Доброе утро!
    Нарисовалась проблема...
    Установленное значение "command" не записываеться в файл, после перезагрузки модуль устанавливает первое значение которое было записано в этот файл.
    Т.е. изначально в файле записано значение 10, через "command" устанавливаю 12, itemы обновляются, и через некоторое время, значение сбрасывается в 10.
    Может я немного не так понимаю функцию записи в файл?
     
  14. ИгорьК

    ИгорьК Гуру

    Я до конца в вопрос не въехал, Вы как-то "в себе" его задали :)
    Но так, по контексту: файл, в который идет запись, надо инициализировать первый раз вручную и убедиться, что он существует в памяти модуля.
     
  15. "Инициализировать в ручную" - это как?
    Я залил файл data.txt в модуль со значением 10, потом сетпоинтом устанавливаю нужную мне температуру допустим 15, я так понимаю, что цифра 15 должна перезаписаться вместо 10 в файле data.txt, и при следующем перезапуске ESP, файл должен содержать уже не цифру 10, а цифру 15.
    Правильно?
    Если да, то вот у меня после перезапуска модуль устанавливает значение 10, а не 15.
    Из чего следует, что запись в файл неосуществлятся(
     
  16. Ipss

    Ipss Нуб

    Dear Igorka,

    sorry for my bad english, as I cannot write in russian, I need some help.
    As you wrote here your code: 11.4.1.
    http://forum.amperka.ru/threads/ard...ный-дом-азы-управления.5043/page-3#post-43403

    I can see, you start the code you pull up the GPIO3 & 4,
    gpio.write(4,gpio.HIGH)....etc
    As I turn the device ON, the leds are blinking a few times (throught the initialization process), but I wat to use relays insted of leds....
    My question is: Is there any way to "mute" this outputs right at the beginning, or this is impossible?
    Thank you!
     
  17. ИгорьК

    ИгорьК Гуру

    Дык... Откатитесь назад. Извлеките из кода все лишнее и оставьте только то, что касается записи и чтения в файл. Понаблюдайте за явлением.
     
  18. Логику записи в файл я правильно понимаю?
     
  19. ИгорьК

    ИгорьК Гуру

    Dear Ipss, it is possible not to pull up GPIO3 & 4 by the start at the programm gpio.write(4,gpio.HIGH) gpio.write(3,gpio.HIGH)), but there is one problem: GPIO3 & 4 should be hardwhere pulluped when ESP8266 start. That conserning definitly GPIO3 & 4 but not other GPIOs.

    You DO NOT CONNECT GPIO3 & 4 to anything that provide the GND: the usual relay modules, for example, or to connect to base of n-p-n transistor, UNL2303 etc.

    There are two ways to cope the problrm:
    - use other GPIOs;
    - if You have to use GPIO3 & 4 you should made special things:
    [​IMG]
    or You should buy the chines rеlay that works by the negative impulse (the same way as at the picture below).
    Relay like this. I think that it is the best relay to use with ESP8266.
     
    Последнее редактирование: 27 окт 2015
    Vlad_L нравится это.
  20. ИгорьК

    ИгорьК Гуру

    Ну да. Вычлените ее - посмотрите что происходит.