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

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

  1. Securbond

    Securbond Гуру

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

    ИгорьК Гуру

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

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

    Securbond Гуру

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

    ИгорьК Гуру

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

    Securbond Гуру

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

    ИгорьК Гуру

    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 нравится это.
  7. Securbond

    Securbond Гуру

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

    Дениc Нуб

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

    ИгорьК Гуру

    Что мешает его попробовать и поделиться результатами?
     
  10. Дени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.
     
  11. ИгорьК

    ИгорьК Гуру

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

    ИгорьК Гуру

    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 нравится это.
  13. alp69

    alp69 Форумчанин

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

    Securbond Гуру

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

    alp69 Форумчанин

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

    alp69 Форумчанин

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

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

    Smerlin Нерд

    Последнее редактирование: 21 июл 2017
  18. Oberon

    Oberon Нерд

    Подскажите, пожалуйста, что править в org.ops4j.pax.logging.cfg (openhab2) чтоб в events.log именно изменения итемов не писались ?
     
  19. ip-ua

    ip-ua Нерд

    Снечала
    Код (C++):
    sudo service openhab2 stop
    Затем в строке
    log4j.logger.smarthome.event = INFO, event, osgi:*
    меняещь INFO на WARN
    Код (C++):
    sudo service openhab2 start
    Все!
     
    Oberon нравится это.
  20. sancho_sumy

    sancho_sumy Нуб

    а reverse proxy не пробовали?

    http://docs.openhab.org/installation/security.html

    Где-то на их форуме видел вариант с выдачей разных sitemaps согласно логину и паролю....