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

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

  1. Oberon

    Oberon Нерд

    да какие могут быть ?:) ds18b20.. а wi-fi не признаю по параноидальным причинам :)
     
  2. ИгорьК

    ИгорьК Победитель модулей

    Куда же 30 метров?
    Сделайте 2-3 устройства на ESP. Проще же не куда. Не хотите сами въезжать и программировать - есть тут отличный готовый проект на сайте.
    http://forum.amperka.ru/threads/Датчик-температуры-влажности-давления-движения-и-освещенности-на-esp-12f.7097/
     
  3. Oberon

    Oberon Нерд

    на работе как раз начинаю так делать, а дома вафли не было и не будет. Да и идея состоит в том, чтоб работало только одно устройство со своим бесперебойником на 12 В, и не зависело ни от чего. Вывод инфы, это дело второе, но поддерживать темпу должно одно устройство, а не чтоб датчики отдельно от всего висели
     
    Последнее редактирование: 26 июн 2017
  4. Oberon

    Oberon Нерд

    а на самом деле не всё так сложно, может кому пригодится..
    ставим веб по инструкции например отсюда https://www.howtoforge.com/tutorial/install-lighttpd-with-php-fpm-and-mysql-on-debian/ выполняем пункты 3,4,6,7 мне этих пунктов хватило ( предполагается, что mysql уже работает). Пишем скрипт примерно такого содержания
    PHP:
    <?php
    $link = mysqli_connect(
                'ххх.ххх.ххх.ххх',
                'user',
                'password',
                'baza');

    echo mysqli_query($link,"DELETE `Item30`.* FROM `Item30` WHERE `Item30`.`Value`='-0.06'");
    echo mysqli_query($link,"DELETE `Item31`.* FROM `Item31` WHERE `Item31`.`Value`='-0.06'");
    mysqli_close($link);

    ?>
     
    кидаем его в папку для lighttpd, у меня она была var/www/html/ под именем del006.php
    пишем правило в опенхаб
    Код (C++):
    rule "006" // убиваем темпу -0.06

      when
           Item dsNash changed or
           Item dsDan changed
      then
        if (dsNash.state==-0.06 || dsDan.state==-0.06)  {
        sendHttpGetRequest("http://ххх.ххх.ххх.ххх/del006.php?")
        }
      end
    и да, графики таки должны брать данные из sql
    Код (C++):
    Switch item=Graf_period  icon="chart" mappings=[0="Hour", 1="Day", 2="Week"]
                    Chart item=Graf  service="mysql" period=h refresh=6000 visibility=[Graf_period==0, Graf_period=="Uninitialized"]
                    Chart item=Graf  service="mysql" period=D refresh=30000 visibility=[Graf_period==1]
                    Chart item=Graf  service="mysql" period=W refresh=30000 visibility=[Graf_period==2]
    должно работать... не претендую на истину, камнями не кидаться, программировать не умею
     
    Последнее редактирование: 26 июн 2017
  5. Securbond

    Securbond Гик

    Кто нибудь уже щупает OH 2.1?
     
  6. ИгорьК

    ИгорьК Победитель модулей

    Доступ по паролю так и не появился. Пропускаю.

    Хочу вот что посмотреть: https://home-assistant.io/
     
    zingreen нравится это.
  7. Securbond

    Securbond Гик

    Очень смахивает на разработку "Home" от Apple. Жаль с английским туговато, но если посидеть денёк над переводом документации, то можно попробовать.
     
  8. ИгорьК

    ИгорьК Победитель модулей

    Чем мне ОН не нравится? Странным языком скриптов, освоить который я даже не понимаю как.
    Плюс ОН2 нет доступа по паролю.
    Именно эти две вещи заставляют просматривать по сторонам...
     
  9. Securbond

    Securbond Гик

    Вчера опять пол ночи с Home-Assistant. Вот где настоящий Гемор со скриптами. Конечно нашёл кучу примеров на англоязычных сайтах. Но понимания откуда ноги растут пока нет. С горем пополам получилось прикрутить несколько датчиков.
    IMG_2098.PNG IMG_2099.PNG
    Нужен очень хороший редактор с проверкой синтаксиса. Или огромный опыт программирования скриптов. Иначе ловить нечего. Один лишний пробел и система посылает вас куда подальше. Система очень гибкая и мощная, но нужно иметь какой то базовый туториал. Пока оставлю, ночи длинные.
     
    Последнее редактирование: 3 июл 2017
    zingreen и ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Победитель модулей

    59. Несколько сеток: выбор и проверка Интернет выполнением файла.
    Исходная обстановка: есть независимые сетки с доступом в Интернет. Одна - дешевая и безлимитная и постоянно падает, другая дорогая и лимитная но устойчивая. (Или иные случаи.)

    Восстановление связи происходит просто через запуск файла (dofile("getwifi.lua")).
    Скрипт проверяет наличие wifi, если оного нет - начинает по списку перебирать доступные сети.
    Подключившись к сети он проверяет состояние Интернет путем пинга google.
    Интернета нет - цепляется к другой сетке.

    Будет работать и с одной сеткой в списке. После успешных подключения и проверки Интренет скрипт создает (если не было) глобальную таблицу mod и в поле internet записывает true.
    Проверкой if mod.inernet == true then ... end можно пользоваться для дальнейшего движения программы.

    Опция - раскомментировать кусок кода:
    Интернет есть - проверяет является ли эта сетка главной. Если сетка не главная - через час разрывает соединение и пытается войти в главную.
    Главная сетка должна стоять в списке сетей первой, а также указываться в соответствующем месте кода.

    Скрипт удаляет все записи о сетках во фэш-памяти устройства. То есть файл на исполнение следует вызывать всегда, можно при старте программы, можно, например, при установлении/потере соединения с брокером MQTT.

    Вызов файла при рабочем wifi и наличии Интернет не приводит ни к чему плохому - просто устранавливается mod.inernet = true.

    getwifi.lua:
    Код (Lua):
    local connect
    local checkInternet

    local function nextpoint()
        wifi.setmode(wifi.STATION)
        local scfg={}
        scfg.auto = false
        scfg.save = false
        local i = 1
        -- перечень сеток для подключения
        local ap_db={
            {'AP_Main', "superpassword" },
            {'AP_A'   , "superpasswordA"},
            {'AP_B'   , "superpasswordB"}
        }
        local function nx(call)
            if call then call() end
            wifi.sta.clearconfig()
            scfg.ssid = ap_db[i][1]
            scfg.pwd = ap_db[i][2]
            wifi.sta.config(scfg)
            print("\nConnectig: "..ap_db[i][1])
            i = i + 1
            if i > #ap_db then i = 1 end
            wifi.sta.connect()
        end
        return nx
    end

    local z = nextpoint()

    connect = function()
        tmr.create():alarm(15000, tmr.ALARM_SINGLE,
        function(t)
            t = nil
            checkInternet()
        end)
    end

    checkInternet = function(call)
        local ip = wifi.sta.getip()
        if ip ~= nil then
            net.dns.resolve("www.google.com", function(sk, ip)
                if (ip == nil) then print("DNS fail: Ask Connect!")
                    if call then call() end
                else
                    print('Got google: '..ip)
                    -- mod - глобальная таблица параметров
                    if not mod then mod = {} end
                    -- при удачном соединении:
                    mod.internet = true
                    --[[
                    local gtAP = (wifi.sta.getconfig())
                    -- 'AP_Main' - главная сетка
                    if gtAP ~= 'AP_Main' then
                        print("Connected to "..gtAP..". Reconnect to Main AP Starts after 1 hour." )
                        tmr.create():alarm(3600000, tmr.ALARM_SINGLE,
                        function(t)
                            t = nil
                            wifi.sta.disconnect()
                        end)
                    else
                        print("Now got "..gtAP.. " the main AP")
                    end
                    --]]

                end
            end)
        else
            z(connect)
        end
    end
    checkInternet(connect)
     
     
    Последнее редактирование: 13 июл 2017
    SergeiL, Securbond и Igor68 нравится это.
  11. Securbond

    Securbond Гик

    Последнее редактирование: 15 июл 2017
  12. Дениc

    Дениc Нуб

    Друзья, а что вы скажите про openHABian? Кто пробовал и как оно? Вроде как готовый образ для начинающих.
     
  13. ИгорьК

    ИгорьК Победитель модулей

    Что мешает его попробовать и поделиться результатами?
     
  14. Дениc

    Дениc Нуб

    Я уже попробовал. Сделал все по инструкции с сайта и все запустилось. Но я не программист и впервые работаю с сервером (да и вообще с сетью), немного начал понимать WinSCP с PuTTY, связался с сервером и на этом пока все. Разбираюсь c командами линукса и протоколом SSH.
    Вам и остальным учасникам большое спасибо за эту подробную ветку.

    У меня есть вопросы:
    1. как поменять IP сервера openHABian? Все мои устройства (Arduino) в сети видны с IP 192.168.1.xxx, а сервер openHABian по дефолту 192.168.0.104. Роутер на 192.168.0.254.
    2. Нужно ли вообще его менять? Ведь он так то доступен если вводить 192.168.0.104:8080.
     
  15. ИгорьК

    ИгорьК Победитель модулей

    Ого. Я в тупике. Никогда не встречал такого для одной сетки.
    Ну, общий принцип электроники: работает - не трогай.
     
  16. ИгорьК

    ИгорьК Победитель модулей

    60. Устанавливаем соединение с брокером MQTT. Еще один вариант.
    В дополнение к п 59 два файла. Работает на прошивке SDK 2.1.0(116b762) и выше.
    Результат работы - на обед мало памяти:
    7489124321.jpg
    К обычным восьми записям в глобальной таблице добавляется лишь две.

    setmqtt.lua выглядит так:
    Код (Lua):
    -- setmqtt.lua
    local myClient = _G.myClient or "testwork"
    -- _G.myClient = myClient
    if not mod then mod = {} end
    mod.brocker = false
    mod.interenet = false
    local connecting
    local function setmqtt()
        local pass = "superpassword"
        m = mqtt.Client(myClient, 180, myClient, pass)
        m:lwt("from"..myClient, "OFF", 0, 0)
        m:on("offline", function(con)
            mod.broker = false
            mod.interenet = false
            m:close()
            print("Lost Broker!")
            dofile("setmqtt.lua")
        end)
        m:on("message", function(conn, topic, dt)
            local top = string.gsub(topic, myClient.."/","")
            print(top..":"..dt)
            _G.gtopic = top
            _G.gdata = dt
            -- Публикуем топик и сообщение в глобальном окружении
            -- и вызываем analize.lua - в нем анализируем эту информацию
            -- и удаляем _G.gtopic и _G.gdata
            -- dofile("analize.lua")
        end)
        connecting()
    end

    connecting = function ()
        connect = require('getmqtt')
        connect.connecting(m, "iot.eclipse.org", 1883, myClient, mod, function() connect = nil end)
        begin, setmqtt = nil, nil
    end

    if not m then
        setmqtt()
    else
        connecting()
    end
    getmqtt.lua:
    Код (Lua):
    -- getmqtt.lua
    local M={}
    function M.connecting(m, Broker, port, myCl, mod, unload)
        local getConnect
        getConnect = function()
           if mod.internet == true then
                m:connect(Broker, port, 0, 0,
                function(con)
                    tmr.stop(getmq)
                    tmr.unregister(getmq)
                    getmq = nil
                    print("Connected to "..Broker.." at "..port)
                    m:subscribe(myCl.."/#",0, function(conn)
                        print("Subscribed.")
                    end)
                    m:publish("from"..myCl,"ON",0,0)
                    _G.mod.broker = true
                    if unload then
                        getConnect = nil
                        unload()
                        package.loaded["getmqtt"]=nil
                    end
                end)
            end
        end
        getmq = tmr.create()
        getmq:alarm(10000, 1, function()
            getConnect()
        end)
        dofile("getwifi.lua")
        getConnect()
    end
    return M
     
    Последнее редактирование: 18 июл 2017
    Securbond нравится это.
  17. alp69

    alp69 Гик

    Сижу в аэропорту. Увидел пост и решил попробовать. Коннект есть, а данных нет. Пробовал и "сенсор" и "текст" чтобы исключить конфликт по типу данных. Не пошлО.
    Что не так? Можно скрин страницы настройки сенсора? А то беглое гугленье не выдало внятного описания настройки. Все по интуиции...
     
  18. Securbond

    Securbond Гик

    Если есть коннект, то главное правильно подписаться. IMG_2890.PNG
    Проверяйте как у вас называются топики. Возможно где то слэш забыли.
     
    Последнее редактирование: 18 июл 2017
  19. alp69

    alp69 Гик

    Спасибо, починил. В самом деле - не хватало первого слэша. Хотя некоторые источники в интернет-сообществах, интересующихся mqtt, настоятельно рекомендуют не ставить первый слэш.
     
  20. alp69

    alp69 Гик

    Поигрался с Buddy для Android. Обновление данных происходит только когда они приходят при работающей программе. Т.е. если последний раз я заходил и получил, допустим, температуру от датчика 28 градусов, то при следующем входе в программу она мне покажет эти же 28 градусов, а не последние данные.
    1:0 в пользу ОН.

    Тестил на Андроидах 4.4.2 и 7.0