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

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

  1. ИгорьК

    ИгорьК Гуру

    DHT
    DHT не стоит использовать, если Вы делаете что-то всерьез и надолго. Как известно, "нет ничего более постоянного, чем временное". Их лучше просто не покупать, чтобы не иметь поганое устройство.
     
  2. ИгорьК

    ИгорьК Гуру

    49. Автоматическая перезагрузка роутера с индикацией текущего состояния, времени и причины перезагрузки. Тестируем. RC.

    UPD. 02/02/2017 - код изменен.

    ...а также с подсчетом перезагрузок за месяц и день, а за день - учет трех причин:
    • выключение электричества
    • потеря wifi
    • не прошел ping
    Пингуются последовательно три сайта, если все не отвечают - роутер перегружается.
    При потере wi-fi роутер перегружается немедленно.
    Железо здесь.

    Код (Bash):
    Group Restart <batary01>
    Number connect "Сейчас [%d]" (Restart) { mqtt="<[mosquitto:connect:state:default]" }
    Switch internetDacha "Интернет:"
    Number restartingAtDay "За День [%d]" (Restart)
    Number restartingAtDayP "За День Электро [%d]" (Restart)
    Number restartingAtDayW "За День WiFi [%d]" (Restart)
    Number restartingAtDayL "За День Ping [%d]" (Restart)
    Number restartingAtMonth "За Месяц [%d]" (Restart)

    Код (Bash):
                Group item=Restart {
                    Frame {
                       // Text item=connect
                        Switch item=internetDacha
                        Text item=restartingAtDay{
                            Frame  {
                                Chart item=connect period=D
                            }
                        }
                        Text item=restartingAtDayP
                        Text item=restartingAtDayW
                        Text item=restartingAtDayL
                        Text item=restartingAtMonth
                    }
                }

    Код (Bash):
    Restart* : strategy = everyChange, everyMinute, restoreOnStartup
        connect : strategy = everyChange, everyMinute, restoreOnStartup
        restartingAtDay : strategy = everyChange, everyMinute, restoreOnStartup
        restartingAtDayP : strategy = everyChange, everyMinute, restoreOnStartup
        restartingAtDayW : strategy = everyChange, everyMinute, restoreOnStartup
        restartingAtDayL : strategy = everyChange, everyMinute, restoreOnStartup
        restartingAtMonth : strategy = everyChange, everyMinute, restoreOnStartup

    Код (Bash):
    rule "Reset Day Restarts"
        when
            Time cron "0 0 0 * * ?"
        then
            postUpdate(restartingAtDay, 0)
            postUpdate(restartingAtDayP, 0)
            postUpdate(restartingAtDayW, 0)
            postUpdate(restartingAtDayL, 0)
    end


    rule "Count Inernet Work"
        when
             Item connect received update
        then
            if(restartingAtDay.state == Undefined || restartingAtDay.state == Uninitialized) {
                postUpdate(restartingAtDay, 0)
            }
            if(restartingAtMonth.state == Undefined || restartingAtMonth.state == Uninitialized) {
                postUpdate(restartingAtMonth, 0)
            }
            if(restartingAtDayP.state == Undefined || restartingAtDayP.state == Uninitialized) {
                postUpdate(restartingAtDayP, 0)
            }
            if(restartingAtDayW.state == Undefined || restartingAtDayW.state == Uninitialized) {
                postUpdate(restartingAtDayW, 0)
            }
            if(restartingAtDayL.state == Undefined || restartingAtDayL.state == Uninitialized) {
                postUpdate(restartingAtDayL, 0)
            }

            var Number intern = connect.state as DecimalType
            var Number rAtDay = restartingAtDay.state as DecimalType

            var Number rAtDayP = restartingAtDayP.state as DecimalType
            var Number rAtDayW = restartingAtDayW.state as DecimalType
            var Number rAtDayL = restartingAtDayL.state as DecimalType

            var Number rAtMonth = restartingAtMonth.state as DecimalType

            var Number power = 0
            var Number wifi = 0
            var Number lost = 0

            if (intern == 5) {
                power = 1
            }
            if (intern == 15) {
                wifi = 1
            }
            if (intern == 25) {
                lost = 1
            }
            rAtDay = rAtDay + power + wifi + lost
            rAtDayP = rAtDayP + power
            rAtDayW = rAtDayW + wifi
            rAtDayL = rAtDayL + lost

            rAtMonth = rAtMonth + power + wifi + lost
            postUpdate(restartingAtDay, rAtDay)

            postUpdate(restartingAtDayP, rAtDayP)
            postUpdate(restartingAtDayW, rAtDayW)
            postUpdate(restartingAtDayL, rAtDayL)

            postUpdate(restartingAtMonth, rAtMonth)
    end

    rule "Is Dacha Inernet Work"
        when
             Item connect received update
        then
            var Number intern = connect.state as DecimalType

            if(intern == 0) {
                postUpdate(internetDacha, OFF)
            }
            else{
                postUpdate(internetDacha, ON)
            }
    end
     
    Код (Lua):
    trying = - 14
    restarting = 0
    routerPin = 4
    lightPin = 3
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)
    servrs = {"www.google.com", "ya.ru", "www.yahoo.com"}
    svNow = 1
    Broker = "ВАШ_САЙТ"
    port = ВАШ_ПОРТ
    myClient = "connect"
    pass = "pass"
    publish = false
    reason = 5
    m = mqtt.Client(myClient, 30, myClient, pass)
    m:lwt(myClient, 0, 0, 0)
    function startPublish()
      m:publish(myClient,0,0,0,function(conn)
      print("Sent start: 0")
      m:publish(myClient,reason,0,0,function(conn)
      print("Sent reason "..reason.. " on start")
      reason = 10
      publish = true
      end)
      end)
    end

    function connecting()
      print('(Re)Connecting')
      local getConnect
      getConnect = function()
      print("Start Connect")
      if wifi.sta.status() == 5 then
      print("Got WiFi!")
      pcall(
      m:connect(Broker, port, 0, 0,
      function(conn)
      tmr.stop(1)
      print("Connected")
      startPublish()
      return true
      end)
      )
      end
      end
      tmr.alarm(1, 10000, 1, function()
      print("Time to Check!")
      getConnect()
      end)
      getConnect()

    end
    --
    m:on("offline", function(con)
      print("Offline Now!")
      publish = false
      connecting()
    end)
    --]]
    --
    function check(srv)
      net.dns.resolve(srv, function(sk, ip)
      if (ip == nil) or (ip == "10.0.0.1") then
      print("DNS fail!")
      else
      print("Got IP: "..ip)
      trying, restarting = 1, 0
      if publish then
      m:publish(myClient,reason,0,0,function(conn)
      print("Sent reason", reason)
      reason = 10
      end)
      end
      end
      end)
    end
    function relay(muv)
      if muv then
      gpio.write(routerPin,gpio.LOW)
      gpio.write(lightPin,gpio.HIGH)
      else
      gpio.write(routerPin,gpio.HIGH)
      gpio.write(lightPin,gpio.LOW)
      end
    end
    function restartRouter()
      tmr.stop(0)
      relay(true)
      restarting = restarting + 1
      print("Restart No "..restarting)
      if restarting == 1 then
      trying = -14
      elseif restarting == 2 then
      trying = -28
      else
      trying = -120
      end
      tmr.alarm(6, 10000, 0, function()
      relay(false)
      tmr.start(0)
      print("Exit Restart Router!")
      end)
    end
    check(servrs[svNow])
    connecting()
    tmr.alarm(0, 30000, 1, function()
      print("Trying: "..trying)
      svNow = svNow + 1
      if svNow == 4 then svNow = 1 end

      ip = wifi.sta.getip()
      print("Got ip:", ip)

      if ((ip=="0.0.0.0" or ip==nil) and trying > 0) then
      reason = 15
      restartRouter()
      elseif trying > 3  then
      reason = 25
      restartRouter()
      else
      trying = trying + 1
      print("Check conection with "..servrs[svNow])
      check(servrs[svNow])
      end
    end)

    221.jpg

    04522222.jpg
     
    Последнее редактирование: 2 фев 2017
    SergeiL и alp69 нравится это.
  3. dimksum

    dimksum Нерд

    Не выводят информацию итемы
    Код (Text):
    String    YandexSet    "Закат [%s]"    <mun>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<sunset>(.*?)</sunset>.*)]" }
    DateTime     Date         "Сегодня: [%1$tA, %1$td.%1$tm.%1$tY]"             {ntp="Europe/Moscow:en_EN"}
    DateTime     Time         "Московское время: [%tT]"
     
    т.е там, где есть дата и время (из демо тоже). Но если выводить время через правило
    Код (Text):
     postUpdate(Hall_update, new DateTimeType())
    то информация отображается. В чем может быть дело?
     
  4. ИгорьК

    ИгорьК Гуру

    Что касается Яндекса, то там всегда странное поведение. Один раз отдает информацию, пятнадцть раз подряд - нет.
    Про время - смотрите пристальнее настройки.
     
    Последнее редактирование: 18 янв 2017
  5. dimksum

    dimksum Нерд

    В данный момент xml доступен. А про время какие именно настройки? В конфиге стоит
    Код (Text):
    ntp:refresh=800000

    # the hostname of the timeserver
    ntp:hostname=0.ru.pool.ntp.org
     
  6. ИгорьК

    ИгорьК Гуру

    У меня так работает:
    Код (C++):
    Text item=MyDate label="Сегодня: [%1$td %1$tb %1$tY %1$tR]" icon="calendar"    
    Код (C++):
    DateTime MyDate  "Date [%1$td %1$tb %1$tY %1$tT]"    <calendar>    { ntp="Europe/Moscow:ru_RU" }
    Код (C++):
    ################################ NTP Binding ##########################################
    #
    # refresh interval in milliseconds (optional, defaults to 900000 [15 minutes])
    ntp:refresh=600000

    # the hostname of the timeserver
    ntp:hostname=ptbtime1.ptb.de
    2341234.jpg
     
  7. dimksum

    dimksum Нерд

    Сделал аналогично, перегрузил машину (CB3, armbian jessy 8, OH 1.8.3 установка через apt-get) и никаких результатов :(
     
  8. ИгорьК

    ИгорьК Гуру

    Ждите. Иногда до 10-15 минут время синхронизируется.
    Да и вообще - смысла этого итема нет, честно говоря.
    ntp:refresh=600000 - понимаете что это значит?
     
  9. dimksum

    dimksum Нерд

    Да! (но если через правило время, то ставит сразу и правильное. значит OH знает сколько время)
    Мне так кажется armbian глючный. С официального сайта только один образ запустился. Не могу русифицировать консоль (перепробовал всё что можно), при перезагрузке иногда зависает,..... Раньше стоял Cubian и по моему даже в demo время показывало. Придётся откатываться назад. Единственно что победил это поддержка websocket в mosquitto
     
  10. dimksum

    dimksum Нерд

    К предыдущему посту
     

    Вложения:

  11. ИгорьК

    ИгорьК Гуру

    Я таки не знаю что это. У меня малина и ee Raspbian. Конечно возможно и в системе дело.
     
  12. SportMaster

    SportMaster Нерд

    Тоже долго не мог понять почему на домашнем ноуте с Win10 дата и время отображается нормально,
    а на работе ОН на Ubuntu ни как, и часовой пояс менял и локали - нифига.
    Даже в логах ни какого намека на то, что переменная "curDate state updated to ...."
    Методом "научного тыка" перенес org.openhab.binding.ntp-1.8.3.jar из /etc/openhab/addons в /usr/share/openhab/addons и о Чудо! - дата/время нормально заработали.

    Через некоторое время дата/время снова пропали :(
    Еще возможно причина в не правильно работающих / не настроенных биндингах.
    В логах при старте ОН было " [ERROR] [b.s.internal.SysteminfoBinding] - System monitor error: {}"
    после удаления SysteminfoBinding - все вновь заработало.
     
    Последнее редактирование: 19 янв 2017
    ИгорьК и dimksum нравится это.
  13. dimksum

    dimksum Нерд

    Спасибо!! Заработало!!
     
    SportMaster нравится это.
  14. alp69

    alp69 Форумчанин

    У меня сегодня тоже весь день "лежит" астрономия (восход/закат)
     
  15. SergeiL

    SergeiL Оракул Модератор

    Да нет, вроде работает, выключатель выключился / включился вечером.
     
  16. dimksum

    dimksum Нерд

    Сегодня столкнулся ещё с одной странностью: перезапускаю кубик3 - дата на английском и в погоде от яндекса кракозябры. Перезапускаю только OH все становится в норме: и дата на русском и текст от яндекса тоже. Локаль стоит русская, все файлы в нужной кодировке. :(
     

    Вложения:

    • 1.png
      1.png
      Размер файла:
      5,6 КБ
      Просмотров:
      754
    • 2.png
      2.png
      Размер файла:
      7,5 КБ
      Просмотров:
      582
  17. ИгорьК

    ИгорьК Гуру

    Зарелизися OpenHAB 2. Будем переползать или рано?
    Ashampoo_Snap_2017.01.24_18h03m17s_006_.jpg

    Не, попробуем еще 1.9.0!
     
  18. dobrMAN

    dobrMAN Нерд

    Учитывая сколько у вас нагорожено, задача эта не тривиальная. Я несколько дней назад переполз на 2.0RC1, провозился весь день (благо отпуск), а у меня из всего что есть OH это одна релюшка Sonoff RF и ... все, еще погоду яндекс и температуру CPU апельсина перенес, ну и добавил Samsung TV, он теперь видит новые модели, правда кроме как звук регулировать ни чего не может. Зато показывает состояние вкл/выкл, номер канала, и источник (TV,HDMI1 и т.п.).... А ну еще openpaths прикрутил на скорую руку для теста...
     
  19. Egony

    Egony Нерд

    А как посмотреть, какая версия сейчас установлена? C ходу не нашел.
    (Я знаю, что у меня 1.8.3, но тем не менее).
     
  20. dimm71

    dimm71 Нерд

    Самый простой способ это посмотреть в клиенте OpenHAB. openHAB info

    Ну, или на сервере
    Код (C++):
    dpkg -l | grep openhab
     
    Последнее редактирование: 25 янв 2017
    petr0vsk, Egony и Smerlin нравится это.