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

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

  1. ИгорьК

    ИгорьК Гуру

    34. Полив теплицы.
    Устройство описано здесь, однако код будет другой.

    UPD 05/12/2016. Скрипты необходимо подправить с учетом вот этого.
    Во всех скриптах функция debounce() должна выгдядеть так:
    Код (Lua):
    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
     
    А именно:
    Прошивка и код в приложении, страница неправильно его форматирует
    Итемы:
    Код (Java):
    Group       Garden "" (Dacha)

    Number        gardenLight    "Освещенность [%d ]"    <lux1>      (DachaLight, Garden)    { mqtt="<[mosquitto:garden/light/state:state:default]" }
    Switch        gardenVl    "Кран"                 (Garden)     { mqtt=">[mosquitto:garden/vl:command:on:ON],>[mosquitto:garden/vl:command:off:OFF],<[mosquitto:garden/valve/state:state:default]" }
    DateTime    gardenVl_LastOpen "Открыт [%1$td %1$tb %1$tY %1$tT]"    <clock2>    (Garden)
    DateTime    gardenVl_LastClosed "Закрыт [%1$td %1$tb %1$tY %1$tT]"    <clock2>    (Garden)

    Switch        gardenPm    "Насос"             (Garden)     { mqtt=">[mosquitto:garden/pm:command:on:ON],>[mosquitto:garden/pm:command:off:OFF],<[mosquitto:garden/pump/state:state:default]" }
    Switch        gardenGr    "Устройство"         (Garden)     { mqtt=">[mosquitto:garden/gr:command:on:ON],>[mosquitto:garden/gr:command:off:OFF],<[mosquitto:garden/gr/state:state:default]" }
    Правила:
    Код (Java):
    rule "When Valve Is Switched ON"            //
    when
        Item gardenVl changed from OFF to ON
    then
        postUpdate(gardenVl_LastOpen, new DateTimeType())
    end

    rule "When Valve Is Switched OFF"            //
    when
        Item gardenVl changed from ON to OFF

    then
        postUpdate(gardenVl_LastClosed, new DateTimeType())
    end
    Вставлять на сайтмэп - по вкусу.
    Тепличка4.jpg

    Следующая версия кода.
     

    Вложения:

    Последнее редактирование: 5 дек 2016
    Sachapda и Securbond нравится это.
  2. Securbond

    Securbond Гуру

    Ещё бы минимальное описание кода (lua)... Было бы совсем хорошо ;).
     
  3. ИгорьК

    ИгорьК Гуру

    Сделаю обязательно. Может, завтра.
     
  4. ИгорьК

    ИгорьК Гуру

    Ловите.
     

    Вложения:

    Securbond нравится это.
  5. ИгорьК

    ИгорьК Гуру

    34.1 Полив теплицы: кран и насос.
    Устройство с краном для наполнения бочки и насосом для полива.
    Применяю насос для откачки грязной воды и поплавковым выключателем. Поэтому, как и в случае с бочкой не надо ловить уровень воды в ней.
    Насос подключен к реле.

    Бета. Для пользования тем кому надо и исправления ошибок. Код рабочий, но мало ли что...
    Тепличка21.jpg
    Код (Javascript):
    pins = {
        open = 7,
        close = 6,
        led = 2,
        pump = 5
    }

    data = {
        false, -- isOpen
        false, -- isWater
        true,  -- isWork
        false, -- isPump
        "valve",
        "watering",
        "working",
        "puping"
    }

    for _, pin in pairs(pins) do
        gpio.mode(pin, gpio.OUTPUT)
        gpio.write(pin, 1)
    end
    gpio.write(pins.led, 0)

    brk="ВАШ_САЙТ"
    port=ВАШ_ПОРТ
    clnt="garden3"
    pass="pass"
    publ = false

    m = mqtt.Client(clnt, 180, clnt, pass)
    m:lwt("/lwt", clnt, 0, 0)

    function cnting() -- tmr 3
        publ = false
        local function getC()
           if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                m:connect(brk, port, 0, 0,
                    function(conn)
                        publ = true
                        tmr.stop(3)
                        tmr.unregister(3)
                        m:subscribe(clnt.."/#",0, function(conn)
                        end)
                end)
            end
        end
        getC()
        tmr.alarm(3, 90000, 1, function()
            getC()
        end)
    end

    m:on("offline", function(con)
        cnting()
    end)

    function pM()
        local count = 1
        local tt, mm
        local pubb = function(mess, top)
            if publ == true then
                top = top or "valve"
                m:publish(clnt.."/"..top.."/state",mess,0,0)
                mm = data[count]
                if mm == false then mm = "OFF" else mm = "ON" end
                tt = data[count + 4]
                count = count + 1
                if count == 5 then count = 1 end
                m:publish(clnt.."/"..tt.."/state",mm,0,0)
            end
        end
        return pubb
    end
    pubM = pM()

    m:on("message", function(conn, topic, dt)
        if (string.find(topic, "state")) == nil then
            local top = string.gsub(topic, clnt.."/","")
            print(top..":"..dt)
            if top == "vl" then
                if dt == "ON" then
                    turn(pins.open)
                else
                    turn(pins.close)
                end
            end
            if top == "gr" then
                if dt == "ON" then
                    data[3] = true
                    data[2] = false
                    print('work = true')
                    pubM("ON", "working")
                else
                    data[3] = false
                    print('work = false')
                    pubM("OFF","working")
                    tmr.stop(5)
                    turn(pins.close)
                    pmp(false)
                end
            end
            if top == "pm" then
                if dt == "ON" then
                    pmp(true)
                else
                    pmp(false)
                end
            end

        end
        collectgarbage()
    end)

    function dbnc (func)
        local last = 0
        local delay = 60000

        return function (...)
            local now = tmr.now()
            if now - last < delay then
              return
            end

            last = now
            return func(...)
        end
    end

    function onCh ()
        if  gpio.read(1) == 0  then
                if data[1] == true then
                    turn(pins.close)
                else
                    turn(pins.open)
                end
        end
        if  gpio.read(3) == 0  then
            if data[4] == true then
                pmp(false)
                else
                pmp(true)
            end
        end
    end

    function pmp(work)
        if work then
            data[4] = true
            gpio.write(pins.pump, 0)
            gpio.write(pins.led, 1)
            pubM("ON", data[8])
            print("pmp!")
            tmr.alarm(5, 3600000, 0, function()
                pmp(false)
                turn(pins.open)
            end)
            return
        end
        data[4] = false
        gpio.write(pins.pump, 1)
        gpio.write(pins.led, 0)
        pubM("OFF", data[8])
        print("pmp stopped!")
    end

    function turn(pin) -- tmr 1,2
        tmr.stop(1)
        gpio.write(pins.open, 1)
        gpio.write(pins.close, 1)

        gpio.write(pin, 0)
        print('Power ON pin '..pin)

        tmr.alarm(1, 30000, 0, function()
            gpio.write(pin, 1)
            print("Power OFF from 30 sec. pin "..pin)
        end)

        if pin == pins.open then
            data[1] = true -- isOpen
            pubM("ON")
            gpio.write(pins.led, 1)
            print("Valve is open")
            tmr.alarm(2, 1800000, 0, function()
                print("Time to Close by Time")
                turn(pins.close)
            end)
        else -- pin close
            pubM("OFF")
            tmr.stop(2)
            gpio.write(pins.led, 0)
            print("Valve is closed")
            data[1] = false -- isOpen
        end
    end

    tmr.alarm(4, 10000, 1, function()
        local lght = adc.read(0)
        print("light: ", lght)
        pubM(lght, "light")

        if lght > 1010 and data[2] == false and data[3] == true then
            pubM("OFF", "day")
            data[2] = true
            print("start")
            pmp(true)
        end
        if lght < 300 and data[2] == true then
            data[2] = false
            print('Day now!')
            pubM("ON", "day")
        end
    end)
    gpio.mode(1, gpio.INT)
    gpio.trig(1, 'down', dbnc(onCh))

    gpio.mode(3, gpio.INT)
    gpio.trig(3, 'down', dbnc(onCh))

    cnting()
     
    Картинки. Это насос, ему уже три года. Вполне сносно работает. Сидит внутри бочки и поливает огород, когда его кормят электричеством:
    45325134.jpg
    А это вторая бочка. Она включена параллельно бочке, что стоит в теплице и заливается вместе с ней.
    121212121212.jpg
     
    Последнее редактирование: 18 июл 2016
  6. ИгорьК

    ИгорьК Гуру

    ESP8266 ESP-201
    ESP201.jpg


    [​IMG]
     
    Последнее редактирование: 18 янв 2020
    Securbond нравится это.
  7. worders

    worders Нуб

    Подскажите что не так?
    настроил все как тут https://wifi-iot.com/?m=wiki&id=140&lang=ru
    передача данных в openhab по mqtt
    в консоли данные есть то есть он и оф 1 и 0 при нажатии на кнопку
    а в опенхаб переключатель не меняет значение хотя и сам тоже управляет
    айтем Switch cofe "cofe" { mqtt=">[mosquitto:/roz1/output12:command:eek:n:1],>[mosquitto:/roz1/output12:command:eek:ff:0],<[mosquitto:/roz1/output12:state:MAP(switchMQTT.map)]" }

    Спасибо заранее
     
  8. ИгорьК

    ИгорьК Гуру

    На предыдущей странице ответ.

    А там то что не спрашиваете?
     
  9. worders

    worders Нуб

    Там не отвечают
     
  10. worders

    worders Нуб

    Сделал все точно так как и на предыдущей странице
    но опенхаб не реагирует
    Подскажите пожалуйста что не так?

    итем - Switch cofe "cofe" { mqtt=">[mosquitto:/roz1/output12:command:ON:1],>[mosquitto:/roz1/output12:command:OFF:0],<[mosquitto:/roz1/output12:state:MAP(on.map)]" }
     
  11. Securbond

    Securbond Гуру

    А файлик on.map положили куда нужно?
     
  12. worders

    worders Нуб

    в папку transform
    и перезапустил полностью распбери
     
  13. ИгорьК

    ИгорьК Гуру

    1. Данные в консоли должны полностью совпадать с определением приёмной части итема OpenHab.
    2. В самом OpenHab должны быть сделаны настройки на приём mqtt сообщений.
    3. Железка должна естественно получать то на что заточена.

    Все указанное выше настраивается и проверяется через MqttSpy по отдельности. Нюансы иногда выплывают. Действуйте.
     
  14. worders

    worders Нуб

    температуру опенхаб принимает нормально
     
  15. ИгорьК

    ИгорьК Гуру

    Вы поймите, я не представляю что там навортили эти товарищи, которые не отвечают на вопросы.
    Алгоритм исследования ситуации я привёл.
     
  16. worders

    worders Нуб

    У меня опенхаб 2
    может это что то меняет?
     
  17. ИгорьК

    ИгорьК Гуру

    Ничего не меняет. Протокол mqtt он и есть протокол. Дело либо в железе либо в ваших настройках.
    MqttSpy наше все. Он позволяет методом инженерного тыка и обычной логики понять в чем причина.
     
  18. worders

    worders Нуб

    Спасибо! Буду дальше ковырять
    Подскажите если не сложно еще одно?
    Как сделать наверное через rules
    мне надо - я включаю кнопку в опенхаб и что бы она работала заданное время (2 минуты 15 секунд )и выключалась
     
  19. ИгорьК

    ИгорьК Гуру

    И это здесь есть:http://forum.amperka.ru/threads/arduino-esp8266-raspberry-pi-2-openhab-Умный-дом-азы-управления.5043/#post-41682
    Функция createTimer(now.plusSeconds(сколько надо секунд)
     
  20. worders

    worders Нуб

    Игорь! Будьте добры подскажите как объединить эти 2 правила под 1 айтем
    что бы в sitemap был выбор что включать 1 или 2 ???
    Спасибо заранее!!!