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

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

  1. sky keeper

    sky keeper Нерд

    Понял, спасибо. Завтра вот работу работать пойду )))) и поработаю )
    Наверно всех с наступающим и спасибо за вдохновение. Надо отложить все в сторону и отдыхать уже начинать
     
  2. sky keeper

    sky keeper Нерд

    Он перепрошитый, но к вафле цепляется ) тут обрубай не обрубай, играть на нем можно будет )
     
  3. alp69

    alp69 Форумчанин

    Так на роутере задраконить и снаружи на него заходить - раздраконивать :cool:
     
  4. sky keeper

    sky keeper Нерд

    Не понял, но извне на хбокс не зайти. Только хардварно обрубать, только хардкор)
     
  5. alp69

    alp69 Форумчанин

    Не на бокс. На роутер. Бокс же в инет через роутер ломится?
     
  6. sky keeper

    sky keeper Нерд

    Не, стандартный да, ломится, а перепрошитый просто цепляется к локадьной сети через вайфай или кабель, просто в роли медиа комбайна так сказать. Игрушки и тд все работает без сети, без денег и тп
     
  7. alp69

    alp69 Форумчанин

    Так ему роутер все равно путь в инет показывает. Вот в эту калитку и прикрыть.
     
  8. sky keeper

    sky keeper Нерд

    Закрытие калитки никак не влияет на работу хбокса. Он дальше будет работать)
     
    alp69 нравится это.
  9. alp69

    alp69 Форумчанин

    Тогда телеком управлять дистанционно.

    Что-то флудим. Предложение съехать либо в отдельную новую тему (родительский контроль), либо в личку.
    Но в любом случае я на сегодня - пас. Завтра с утра по распорядку - подвиг и разгон облаков. Надо выспаться. ;)
     
    sky keeper нравится это.
  10. mex79

    mex79 Нерд

    Еще немного оффтопа, я дитю на компе скорость режу по графику дабы стимулировать процесс обучения, понятно что без сети игры будут работать но им то уже не интересно так что такое решение прокатывает, скорость режется правилами на микротике к слову офигенная железка за исключением того что не умеет OVPN с сжатием и tcp.
     
  11. sky keeper

    sky keeper Нерд

    Новую тему не надо, я думаю у всех свои методы, обсуждался мой конкретный алгоритм чтобы вписаться в опенхаб, так что офттопик предлагаю не засчитывать)))
    Я за более радикальные способы "лишения", то есть если запрет играть, то запрет, а не полумера, но и если разрешить, то сделать это легко и в любое время
     
  12. mex79

    mex79 Нерд

    В моем случае этого было достаточно, скорость 8к и вопрос с сетью решен, полного запрета легко добиться соответствующим правилом это два клика мышью или строка в консоли, а график был нужен для ограничения в разрезе времени ибо общение в сети сильно отвлекает а так есть время на уроки и есть на интернет.[/QUOTE]
     
  13. alp69

    alp69 Форумчанин

    Дополню скриптом по отправке значений, которые могут изменяться. Например, значения температуры. Может кому пригодится.
    В примере контролируется превышение заданного значения. При получении итемом значения, превышающего установленное (в примере 35), Telegram присылает уведомление, в котором содержится полученное итемом значение. В примере - температура (°C).
    Код (C++):
    rule "Send TELEGRAM ИМЯ_ВАШЕГО_ИТЕМА > 35"
    when
        Item ИМЯ_ВАШЕГО_ИТЕМА changed
    then
        if(ИМЯ_ВАШЕГО_ИТЕМА.state>35) {
        sendTelegram("bot1", "ИМЯ_ВАШЕГО_ИТЕМА %s °C", ИМЯ_ВАШЕГО_ИТЕМА.state.toString)
        }
    end
     
    Последнее редактирование: 31 дек 2016
    Securbond и ИгорьК нравится это.
  14. alp69

    alp69 Форумчанин

    30.1. Быстрое восстановление связи с брокером MQTT. Шаблон.
    Уважаемые коллеги, представляю слегка подпиленный и дополненный шаблон.
    Суть дополнений:
    1. Возможность онлайн перенастройки параметров обслуживающей сети Wi-Fi.
    При пропадании родной сети модуль переводится в режим точки доступа и запускается сервис поиска сетей. Нужно только подключиться к сети, организованной модулем (параметры сети и комментарии см.в коде).
    2. Автоматическая отправка причины последней перезагрузки модуля при его включении.

    В прошивке должны быть модули "node" и "enduser setup".

    Item, принимающий причины перезагрузки:
    Код (Javascript):
    String  resume_restart "Причина рестарта [%s]"  <question>{ mqtt="<[mosquitto:/myhome/resume_restart:state:default]" }
    Вставка item'а в Sitemap:
    Код (Javascript):
    Text item=resume_restart
    Собственно код шаблона:
    Код (Lua):

    --Использованы таймеры tmr.alarm c id(0) и id(1)

    Broker = "192.168.0.110"
    port = 1883
    myClient = "Ваш_Клиент"
    name = myClient
    pass = "Ваш_Пароль"
    publish = false -- регулируем возможность публикаций

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

    --*********************************************
    --ФУНКЦИЯ ОРГАНИЗАЦИИ ВЗАИМОДЕЙСТВИЯ С БРОКЕРОМ
    --*********************************************
    function connecting()
        if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then --если wifi  и  ip есть, то
                print("Есть WiFi, есть IP-адрес")
                m:connect(Broker, port, 0, 0, function(conn)
                    print("Подключено к брокеру")
                    publish = true
                    m:subscribe(myClient.."/#",0, function(conn)
                    print("Есть подписка")
                    tmr.alarm(2, 3000, 0, function() RestartResume() end)   --Отсюда стартует проверка причин перезагрузки
                    Main_prog() -- Отсюда стартует основная программа
                    end)
                end)
        elseif wifi.sta.status() ~= 5 or wifi.sta.getip() == nil then
            print("Нет WI-FI или IP-адреса, включаем точку доступа")
            publish = false
            search_wifi() --Иначе устанавливаем точку доступа и включаем поиск сетей wifi
        end
    end


    --*********************************************
    --ФУНКЦИЯ ОНЛАЙН СМЕНЫ WI-FI СЕТИ
    --*********************************************
    --При отсутствии wi-fi или IP-адреса модуль приостанавливает выполнение основной программы и переходит в режим точки доступа.
    --Действия пользователя:
    --1. Подключиться к сети с именем и паролем, которые будут указаны
    -- в строке "wifi.ap.config({ssid="SSID", pwd="PASSWORD"})" перед заливкой кода в модуль:
    --2. Любым браузером попытаться перейти на любой адрес в сети.
    --3. В появившемся окне выбрать нужную сеть, ввести её пароль, нажать "SAVE".
    --После этого модуль подключится к выбранной сети.
    --При успешном подключении модуль перейдет в режим клиента,
    --остановит сервис поиска сетей и продолжит выполнение основной программы
    function search_wifi()
    tmr.stop(0) --тормозим таймер основной программы Main_prog. Если их несколько, не забываем про остальные.
    wifi.setmode(wifi.STATIONAP) --выставляем режим точки доступа
    --НИЖЕ ПРОПИШИТЕ ИМЯ СЕТИ, КОТОРУЮ ЗАПУСТИТ УСТРОЙСТВО И ПАРОЛЬ ДОСТУПА К НЕЙ.
    -- рекомендуется имя сети, совпадающее с именем устройства.
    -- кавычки не удалять!
    wifi.ap.config({ssid="SSID", pwd="PASSWORD"})
    enduser_setup.manual(true)
      enduser_setup.start( --запускаем сервис
      function()
      print("Подключено к wifi IP-адрес:" .. wifi.sta.getip())
      end,
      function(err, str)
      print("enduser_setup: Err #" .. err .. ": " .. str)
      end)
        tmr.alarm(1, 5000, 1, function() --каждые 5 сек. проверяем наличие ip-адреса
            if wifi.sta.getip() ~= nil then --если ip-адрес есть, то
            publish = true --ставим флаг возможности публикаций
            tmr.start(0) -- возобновляем основную программу
            enduser_setup.stop() --тормозим сервис поиска сетей
            wifi.setmode(wifi.STATION) --переводим в режим клиента
            print("Получен IP-адрес. Точка доступа остановлена")
            connecting() --идем устанавливать связь с брокером
            end
        end)
    end

    --*********************************************
    --ОСНОВНАЯ ПРОГРАММА
    --*********************************************
    function Main_prog()
    tmr.alarm(0, 5000, 1, function()  --мы ведь бесконечно чем-то заняты? )))
    -- здесь код Вашей основной программы, которая будет выполняться каждые 5 сек.
    -- Если каждые 5 сек. (5000 миллисекунд) не устраивает - поменяйте интервал
    -- или режим запуска таймера (третий параметр) -
    -- "1" - постоянная работа; "0" - однократный запуск.
    --
    -- отчитываемся о проделанной работе (если нужна отправка данных):
        if wifi.sta.status() == 5 or wifi.sta.getip() ~= nil then -- если wi-fi или IP-адрес есть, то
            m:publish("/ИМЯ_ТОПИКА",(ЧТО-ТО),0,0) --ЧТО-ТО отправляем
        --иначе
        else
            connecting() --ищем связь
        end
    end)
    end

    --*********************************************
    --ФУНКЦИЯ ПРОВЕРКИ ПРИЧИН ПЕРЕЗАГРУЗКИ
    --*********************************************
    --при включении, а также после каждой перезагрузки модуль отправляет брокеру
    --текстовую строку с причинами последней перезагрузки.
    function RestartResume()
    local _, resume = node.bootreason()
        if     resume == 0     then resume = "power-on"
        elseif resume == 1     then resume = "hardware watchdog reset"
        elseif resume == 2     then resume = "exception reset"
        elseif resume == 3     then resume = "software watchdog reset"
        elseif resume == 4     then resume = "software restart"
        elseif resume == 5     then resume = "wake from deep sleep"
        elseif resume == 6     then resume = "external reset"
        end
        m:publish("/myhome/resume_restart",resume,0,0)
    end

    connecting() --ищем связь
     
     
    Последнее редактирование: 6 янв 2017
    dimm71 и ИгорьК нравится это.
  15. alp69

    alp69 Форумчанин

    Новогодние выходные не проходят даром. Возникла необходимость сделать контроль температуры в щенячьем беби-боксе. Сразу усложнил себе задачу вводными:
    1. При выходе параметров температуры за установленные пределы должно приходить оповещение в смартфон на Telegram. Как подключиться к этому сервису написано здесь.
    2. Должна существовать онлайн возможность регулировки пределов срабатывания оповещения.

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

    Итак, начнем.
    По традиции для начала картинки:
    Screenshot_2017-01-05-23-41-26.png Screenshot_2017-01-05-23-42-02.png
    Screenshot_2017-01-05-23-42-38.png

    Код (Javascript):

    Number        Mur_pet_temp_max "Верхний предел [%.1f °C]" <temperature> (Mur_pet_chart)
    Number        Mur_pet_temp "Температура [%.2f °C]"    <temperature>    (Mur_pet_chart)        { mqtt="<[mosquitto:/myhome/Mur_pet_temp:state:default]" }
    Number        Mur_pet_temp_min "Нижний предел [%.1f °C]" <temperature> (Mur_pet_chart)
    Number        Mur_pet_period    ""
    Group        Mur_pet_chart    " [%.2f]"    <line>
    DateTime    Mur_pet_temp_upd    "Обновлено [%1$td %1$tb %1$tY %1$tR]"    <clock>
    String       Mur_pet_restart "Из-за чего [%s]"    <question>{ mqtt="<[mosquitto:/myhome/Mur_pet_restart:state:default]" }
    DateTime    Mur_pet_restart_upd    "Обновлено [%1$td %1$tb %1$tY %1$tR]"    <clock>
    String  Mur_pet_web      "За последний час  [%s]"
    Код (Javascript):

    Frame label="Щенячий модуль"{

            Group item=Mur_pet_temp icon="temperature" valuecolor=[>30="red", >25="green", <25="blue"] {

                Frame {
                    Switch item=Mur_pet_period mappings=[0="Ч", 1="Д", 2="Н", 3="2Н", 4="М", 5="2М", 6="4М", 7="Г"]  
                    Chart item=Mur_pet_chart period=h    refresh=6000         visibility=[Mur_pet_period==0, Mur_pet_period==Uninitialized]      
                    Chart item=Mur_pet_chart period=d     refresh=600000         visibility=[Mur_pet_period==1]  
                    Chart item=Mur_pet_chart period=W     refresh=600000         visibility=[Mur_pet_period==2]  
                    Chart item=Mur_pet_chart period=2W     refresh=600000         visibility=[Mur_pet_period==3]
                    Chart item=Mur_pet_chart period=M     refresh=600000         visibility=[Mur_pet_period==4]  
                    Chart item=Mur_pet_chart period=2M     refresh=600000         visibility=[Mur_pet_period==5]  
                    Chart item=Mur_pet_chart period=4M     refresh=600000000     visibility=[Mur_pet_period==6]  
                    Chart item=Mur_pet_chart period=Y     refresh=600000000    visibility=[Mur_pet_period==7]
     
                }
                    Frame label="Перезагрузка щенячьего модуля"{
                        Text item=Mur_pet_restart
                        Text item=Mur_pet_restart_upd
                    }
            }
                Webview item=Mur_pet_web url="[URL]http://192.168.0.110:8080/rrdchart.png?items=Mur_pet_temp_max,Mur_pet_temp,Mur_pet_temp_min&period=h&w=440&h=160[/URL]" height=6
                Text item=Mur_pet_temp_upd
                Group label="Настройка оповещения" icon="settings"  {
                    Frame label="Пределы срабатывания оповещения"{
                    Setpoint item=Mur_pet_temp_max  labelcolor=["red"]     valuecolor=["red"]     minValue=25.1     maxValue=40 step=0.1  
                    Setpoint item=Mur_pet_temp_min  labelcolor=["blue"] valuecolor=["blue"] minValue=10     maxValue=25 step=0.1
                    }
                }
        }
    К сожалению:
    1. Не нашел способа во второй строке Sitemap'а подставить значения итемов Mur_pet_temp_max и Mur_pet_temp_min вместо 30 и 25 соответственно, чтобы не было жесткой привязки к значениям при изменении цвета значения при выходе за установленные параметры. А так хорошо было бы - подстроил предельные значения, и сайтмэп соответственно цветом на эти новые значения реагирует.
    2. График, вставленный в сайтмэп строкой
    Код (Javascript):
    Webview item=Mur_pet_web url="http://192.168.0.110:8080/rrdchart.png?items=Mur_pet_temp_max,Mur_pet_temp,Mur_pet_temp_min&period=h&w=440&h=160" height=6
    не масштабируется. Поэтому подбирайте его размеры параметрами:
    w=440 - ширина графика
    h=160 - высота графика
    height=6 - высота поля итема для вставки графика.
    Код (Javascript):

    Mur_pet_temp : strategy = everyMinute, everyChange, everyUpdate, restoreOnStartup
    Mur_pet_restart : strategy = everyChange, everyUpdate, restoreOnStartup
    Mur_pet_temp_max : strategy = everyMinute, everyChange, everyUpdate, restoreOnStartup
    Mur_pet_temp_min : strategy = everyMinute, everyChange, everyUpdate, restoreOnStartup
    Код (Javascript):

    var boolean Flag_pet_max_min = false  // Флаг для инициализации Setpoint'ов

    rule "Mur_pet_restart Update"
    when
      Item Mur_pet_restart received update
    then
      postUpdate(Mur_pet_restart_upd, new DateTimeType())
    end


    rule "Mur_pet_temp Update"
    when
      Item Mur_pet_temp received update
    then
      postUpdate(Mur_pet_temp_upd, new DateTimeType())
    end

    //Инициализация Setpoint'ов - если флаг Flag_pet_max_min говорит, что инициализации не было,
    // Setpoint'ы инициализируются первым пришедшим значением температуры
    rule "Mur_pet_temp (max/min) initialize"
    when
        Item Mur_pet_temp received update
    then

             if(Flag_pet_max_min == false) {
            postUpdate(Mur_pet_temp_max, Mur_pet_temp.state)
            postUpdate(Mur_pet_temp_min, Mur_pet_temp.state)
            Flag_pet_max_min = true
            }
    end


    rule "Send TELEGRAM Mur_pet_temp >max or <min"
    when
        Item Mur_pet_temp changed
    then
        if(Mur_pet_temp.state>Mur_pet_temp_max.state){
        sendTelegram("bot1", "Температура в щенячьем боксе выше нормы!!! %s °C", Mur_pet_temp.state.toString)
        }
        if(Mur_pet_temp.state<Mur_pet_temp_min.state) {
        sendTelegram("bot1", "Температура в щенячьем боксе ниже нормы!!! %s °C", Mur_pet_temp.state.toString)
        }
    end
     
     
    Последнее редактирование: 6 янв 2017
    petr0vsk и ИгорьК нравится это.
  16. ИгорьК

    ИгорьК Гуру

    Вот какая новость обнаружена здесь: Static timers are deprecated and will be removed later.

    Что это значит? Это значит не стоит удивляться, если с очередной прошивкой встанут колом все чудесно работавшие устройства.
    Надо будет всего лишь переписать таймеры в них.
    А на будущее - не использовать статические таймеры в устройствах с сего момента.
    Новость плохая и хорошая.
    Хороша она тем, что пропадает необходимость считать таймеры в устройствах, а появляется возможность давать им нормальные имена и не путать между собой.
     
  17. alp69

    alp69 Форумчанин

    Ну наконец-то!
     
  18. faster_light

    faster_light Нерд

    Вопрос:
    Как по приходу конкретной посылки по UART (на GPIO raspberri pi) менять значения итемов в openHAB?
    Или выводить значение пришедшей температуры, например
     
  19. ИгорьК

    ИгорьК Гуру

    Ответ: Здесь есть разбор полётов с модулями nooLite - изучайте. Там что-то и по UART работало.
     
  20. faster_light

    faster_light Нерд

    Есть такое, заработало и у меня. Однако на прием со стороны RPI я не нашел, только на отправку.
     
    ИгорьК нравится это.