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

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

  1. ИгорьК

    ИгорьК Гуру

    Если Вы по ссылке - там одно правило. В противном случае я мысли не читаю :)
     
  2. alp69

    alp69 Форумчанин

    Завершено изготовление анонсированного устройства «Управление двумя нагрузками с помощью импульсных реле. Контроль состояния нагрузок». Код переработан.
    Подробности и полное описание здесь.
     
    Последнее редактирование: 17 июл 2016
    ИгорьК нравится это.
  3. worders

    worders Нуб

    Код (C++):
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    import org.openhab.model.script.actions.Timer

    rule Cofe_1
    when
        Item cofe changed
    then
            if (cofe.state==ON) {
                    createTimer(now.plusMinutes(3)) [|
                sendCommand(cofe, OFF)
                cofe.sendCommand(OFF)
                    ]
            }
    end

    rule Cofe_2
    when
        Item cofe2 changed
    then
            if (cofe2.state==ON) {
                    createTimer(now.plusMinutes(5)) [|
                sendCommand(cofe2, OFF)
                cofe2.sendCommand(OFF)
                    ]
            }
    end
     
  4. ИгорьК

    ИгорьК Гуру

    Пожалуйста, попробуйте изложить свою проблему так, чтобы было понятно что Вам надо и что Вы не можете сделать.
    Здесь не занимаются гаданием и не пишут код по запросу.
     
  5. dimksum

    dimksum Нерд

    Нубский вопрос: где хранятся данные, которые датчики отсылают в топик? (например таймаут отправки данных 5 минут, открываем приложение, а там уже температура, влажность, состояние пинов.....) Или openhab при открытии опрашивает все?
     
  6. alp69

    alp69 Форумчанин

    Посмотрите файлы events-XXXX-XX.log.zip в папке openhab\logs. Это протоколы событий. А данные он сохраняет и берет из отдельной базы данных для каждого итема. По умолчанию базы данных rrd4j. Находится openhab/etc/rrd4j/имя_итема.rrd
    Удалите файл - данные исчезнут, графики опустеют. После удаления новый файл будет создан автоматически без Вашего участия.
     
    Последнее редактирование: 18 июл 2016
    dimksum нравится это.
  7. dimksum

    dimksum Нерд

    Спасибо!
     
  8. ИгорьК

    ИгорьК Гуру

    Полив теплицы следующая версия.
    Поскольку добавил еще одну бочку, общее время наполнения двух бочек (а в них стоит заливная арматура) подошло к полутора часам. Решил задействовать внутренний таймер.
    Код (Lua):
    -- ready to load!
    -- light = 500
    rtctime.set(1000, 0) -- Установка начального времени при запуске системы от "балды"
    delOFFvl = 2*60*60 -- Задержка выключения крана после его включения в секундах - два часа
    delStart = 3*60*60 -- Задержка включения крана после наступления темноты в секундах - три часа
    pins = {
        open = 7, -- пин открытия крана
        close = 6, -- пин закрытия крана
        ledOpen = 2, -- пин светодиода
        read = 1 -- пин кнопки
    }

    data = {
        false, -- isOpen
        false, -- isWater
        true,  -- work
        "valve",
        "watering",
        "working"
    }

    for _, pin in pairs(pins) do -- устанавливаем все в HIGH
        gpio.mode(pin, gpio.OUTPUT)
        gpio.write(pin, gpio.HIGH)
    end
    gpio.write(pins.ledOpen, gpio.LOW) -- а светодиод гасим

    Broker="Ваш_сайт"
    port=ваш_порт
    myClient="garden"
    pass="pass"
    publish = false

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

    function connecting() -- как работает раскрывал на сайте
        publish = false
        local function getConnect()
           if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                m:connect(Broker, port, 0, 0,
                    function(conn)
                        publish = true
                        tmr.stop(3)
                        tmr.unregister(3)
                        m:subscribe(myClient.."/#",0, function(conn)
                        end)
                end)
            end
        end
        getConnect()
        tmr.alarm(3, 90000, 1, function()
            getConnect()
        end)
    end

    m:on("offline", function(con)
        publish = false
        connecting()
    end)

    function pM() -- обертка над функцией публикации для создания замыканий
        local count = 1 -- одновременно с публикацией немедленной информации
        local tt, mm -- идет публикация таблицы сосотяний
        local pubb = function(mess, topic)
            if publish == true then
                topic = topic or "valve"
                m:publish(myClient.."/"..topic.."/state",mess,0,0)
                mm = data[count]
                if mm == false then mm = "OFF" else mm = "ON" end
                tt = data[count + 3]
                count = count + 1
                if count == 4 then count = 1 end
                m:publish(myClient.."/"..tt.."/state",mm,0,0)
            end
        end
        return pubb
    end
    pubMess = pM() -- вызов публикации

    m:on("message", function(conn, topic, dt) -- разбор входящих сообщений mqtt
        if (string.find(topic, "state")) == nil then
            local top = string.gsub(topic, myClient.."/","")
            print(top..":"..dt)
            if top == "vl" then
                if dt == "ON" then
                    turnOn(pins.open)
                else
                    turnOn(pins.close)
                end
            end
            if top == "gr" then
                if dt == "ON" then
                    data[3] = true
                    data[2] = false
                    print('work = true')
                    pubMess("ON", "working")
                else
                    data[3] = false
                    print('work = false')
                    pubMess("OFF","working")
                    tmr.stop(5)
                    turnOn(pins.close)
                end
            end
        end
        collectgarbage()
    end)

    function debounce (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 turnOn(pin) -- работа с пинами крана
        tmr.stop(1) -- при вызове функции все останавливаем
        tmr.stop(2)
        gpio.write(pins.open, gpio.HIGH)
        gpio.write(pins.close, gpio.HIGH)

        gpio.write(pin, gpio.LOW) -- выполняем пин что вызвали
        print('Power ON pin '..pin)
        -- запускаем таймер чтобы его выключить через 30 секунд
        tmr.alarm(1, 30000, tmr.ALARM_SINGLE, function()
            gpio.write(pin, gpio.HIGH)
            print("Power OFF from 30 sec. pin "..pin)
        end)
        -- если это включение - дополнительно задаем выключение
        if pin == pins.open then
            data[1] = true -- isOpen
            pubMess("ON")
            gpio.write(pins.ledOpen, gpio.HIGH)
            print("Valve is open")
            local delOFF = function() -- готовим фнкию выключения
                local timeToOff = rtctime.get() + delOFFvl -- засекаем время
                print("OFF at ", timeToOff)
                tmr.alarm(2, 1000, 1, function() -- читаем каждую секунду
                    if (rtctime.get()) > timeToOff then -- если время пришло
                        print("Time to Close by Time")
                        turnOn(pins.close) -- выключаем
                        tmr.stop(2) -- тормозим таймер
                        tmr.unregister(2)
                    end
                end)
            end
            delOFF()
        else -- pin close
            data[1] = false -- isOpen
            pubMess("OFF")
            tmr.stop(2) -- тормозим таймер выключения, потому что выключаем сейчас
            tmr.unregister(2)
            gpio.write(pins.ledOpen, gpio.LOW)
            print("Valve is closed")
        end
    end


    tmr.alarm(4, 10000, tmr.ALARM_AUTO, function() -- Проверяем освещенность
        local light = adc.read(0)
        print("Light: ", light)
        pubMess(light, "light") -- публикуем информацию о свете, а также данные из
        -- таблицы состояний data
        -- если ночь и нет захода для наполнения бочек
        if light > 1020 and data[2] == false and data[3] == true then
            pubMess("OFF", "day") -- публикуем что ночь
            data[2] = true -- начали заполнение бочек...
            print("delayStart")
            local delayStart = function() -- заполняем, но через некоторое время
                local timeToStart =  rtctime.get() + delStart -- когда будем заливать?
                print("Will Start at ", timeToStart)
                tmr.alarm(5, 1000, 1, function() -- проверяем ежесекундно не пора ли залить бочки
                    if rtctime.get() > timeToStart then  -- Ура! Наконец то!
                        tmr.stop(5)
                        tmr.unregister(5)
                        if data[3] then turnOn(pins.open) end -- если устройство в режиме работы - заполняем
                    end
                end)
            end
            delayStart() -- вызов
        end
        if light < 350 and data[2] == true then -- наступил день
            data[2] = false
            print('Day now!')
            pubMess("ON", "day")
        end
    end)

    gpio.mode(pins.read, gpio.INT)
    gpio.trig(pins.read, 'down', function() -- наблюдение за кнопкой с антидребезгом
        local a = debounce -- подгружаем функцию антидребезга
        local onChange = function() -- функция для исполнения
            if  gpio.read(pins.read) == 0  then
                    if data[1] == true then
                        turnOn(pins.close)
                    else
                        turnOn(pins.open)
                    end
            end
        end
        a(onChange()) -- вызываем функцию по ниспадающему фронту
    end)

    connecting()  -- На старт, внимание, марш!
     
     
    Последнее редактирование: 4 авг 2016
    alp69 и Securbond нравится это.
  9. alp69

    alp69 Форумчанин

    Интересно читать. Познавательно.
     
  10. Securbond

    Securbond Гуру

    Ага.. И код все непонятнее и непонятнее))
     
  11. chibis

    chibis Нерд

    Доброго времени суток!
    Хочу простую, не новую задачу реализовать. На текущий момент заключается в следующем - вывести температурные датчики дома и дачи в домашнюю локальную сеть и организовать хранение статистики дома, а не в сети. Датчики, esp уже на руках. Сейчас закажу малину третьей версии (как понимаю будет ряд сложностей т.к все заточено на вторую версию, но и вторую брать при наличии третей не вижу смысла если не прав, поправьте меня)

    Главный вопрос заключается в датчике. Какой лучше всего поставить в парилку? Показания хочу вывеси на экранчик(Nextion HMI) в комнату отдыха и соответственно в локальную сеть

    На текущий момент на руках имеются следующие датчики: DHT 11/22, DS18B20(влагозащищенный), AM2301.
    Больше всего подходит DS18B20.
    НО!
    Не понятно как он себя ведет на высоких температурах 90-120 градусов) Да, да по даташиту идет до 125 градусов. А на практике? Какая погрешность? У кого-нибудь имеется опыт в данном вопросе? Буду очень благодарен за информацию.
     
    Последнее редактирование: 22 июл 2016
  12. ИгорьК

    ИгорьК Гуру

    С третьей малиной проблем быть не должно, ds18b20 по даташиту до 125. То есть на пределе но работать будет.
     
    chibis нравится это.
  13. woow

    woow Гик

  14. woow

    woow Гик

    Ух всю ночь пока в RPi3 засунул Raspbian+Mosquitto+OpenHab и тут то трблы с openhab: Failed to start openhab.service: Access denied. И папка /var/log/openhab пуста. Как будто его совсем нет.
     
  15. ip-ua

    ip-ua Нерд

    Проверьте каким юзером стартует Openhab и поменяйте права на каталог Где стоит Openhab. Если ставили из zip архива то логи лежат в /opt/openhab/logs
     
  16. ip-ua

    ip-ua Нерд

    Для всех у кого Openhab стоит на малине и не только.
    Обязательно поставьте java 8 от Oracle - на малине с другими реализациями есть подтвержденные проблемы и после этого выберите 8 как основную:
    Код (Bash):
    $ sudo update-alternatives --config java
    Есть 2 варианта для альтернативы java (предоставляет /usr/bin/java).

      Выбор   Путь                                               Приор Состояние
    ------------------------------------------------------------
      0            /usr/lib/jvm/java-7-openjdk-armhf/jre/bin/java          1063      автоматический режим
      1            /usr/lib/jvm/java-7-openjdk-armhf/jre/bin/java          1063      ручной режим
    * 2            /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/bin/java   318       ручной режим

    Нажмите enter, чтобы сохранить текущий выбор[*], или введите выбранное число: 2
     
    У меня выше сказанное ускорило прорисовку графиков с 5 секунд до почти нуля на raspberry pi 3.
     
  17. ИгорьК

    ИгорьК Гуру

  18. woow

    woow Гик

    мда тут только поиском нашёлся этот файл и его так запрятали /dev/fm/17/17........17/13/ и так далее, как изять его, а то малина ругается.
     
  19. ИгорьК

    ИгорьК Гуру

    Nextion + ESP8266. Первый опыт. Не художественный но уже рабочий. Кнопка включает уличное освещение. Правда... оно само включается по солнцу и выключается по времени.
    Но можно и кнопкой. (Зачем, сам не знаю).
    20160729_120354.jpg
     
    Последнее редактирование: 29 июл 2016
    sys, DIYMan, Securbond и ещё 1-му нравится это.
  20. woow

    woow Гик

    Привет. Вот опят с чистого листа начал инсталяцию малины. Успехи такие:
    RASPBIAN JESSIE с полным апдейтом;
    Mosquitto - проверил по инструкции связь между терминалом #1 и #2- связь есть;
    Java 1.8.0_101 https://www.linuxbabe.com/desktop-linux/install-oracle-java-8-debian-jessie-raspbian-jessie-via-ppa
    OpenHab по инструкции https://github.com/openhab/openhab/wiki/Linux-and-OS-X и тут опят есть вопросы: если запрашиваешь
    service openhab start
    ответ
    Failed to start openhab.service: Access denied
    sudo systemctl start openhab
    не каких изменений т.е. начальная строка.
    Есть там тестовая строка
    Test it
    Point your browser to http://localhost:8080/openhab.app?sitemap=yourname and you should see your sitemap.
    какой должен быть результат?