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

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

  1. zloy-glide

    zloy-glide Нерд

    Тоже думал об этом, но решил что в будущем буду использовать цветовую дифференциацию для определения температурных режимов. И решил отказаться от этого. В принципе ваша реализация мне нравится больше. Это в секундах?
     
  2. ИгорьК

    ИгорьК Гуру

    У меня подсвека гостинной сделана на цветной ленте. Сделал, наладил, включил чтобы всем показать... и все. С тех пор ни разу. Лучше бы больше белых лент проложил.
    Ну так. Делюсь опытом.
     
  3. Smerlin

    Smerlin Нерд

    Здравствуйте уважаемые Openhab-овцы, ардуинщики и ESP8266-воды.
    Предлагаю вам на суд реализованные у себя "глупости умного дома".
    В общем, как тут принято, сначала кино (снял немного сумбурно, мало времени было):


    ну и еще одно вдогонку


    Аппаратная часть у меня такая: Openhab крутится на OrangePI (более дешевый вариант малины), а управляемые узлы - ESP8266. Программной часть на узлах реализована ArduinoIDE с библиотеками Souliss и aREST. Обмен данными между узлами и openhab идет как через Souliss, например в случает передачи показаний температуры и состояния кнопки включения лампы (соответствующий binding есть), так и посредством простых GET запросов, например для передачи ИК кодов на телек и приставку (соответствующий binding тоже есть).
    Дальше приведу часть итемов (не привожу как у всех погодные, мониторинг апельсинки и прочие)
    Код (Java):
    Group    TechnicView_Node0    (Diagnostic, All)  
    Group    TechnicView_Node1    (Diagnostic, All)  
    Switch    SimpleLight    "Лампа"    <switch>    (Light, TechnicView_Node0)        { souliss="T11:0:4", autoupdate="false" }
    //Switch    SimpleLight1    "Свет 1"    <switch>    (Light,TechnicView_Node1)        { souliss="T12:1:0", autoupdate="true" }
    Number    HEALTHNode0    "Здоровье узла 0 [%1d]"    <keyring>    (Diagnostic,TechnicView_Node0,Health)        { souliss="D98:0:998" }
    String    TIMESTAMP_Node0    "Время обновления узла 0 [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]"    <clock>    (Diagnostic,TechnicView_Node0)        { souliss="D99:0:999" }
    Number    HEALTHNode1    "Здоровье узла 1 [%1d]"    <keyring>    (Diagnostic,TechnicView_Node1,Health)        { souliss="D98:1:998" }
    String    TIMESTAMP_Node1    "Время обновления узла 1 [%1$td.%1$tm.%1$tY %1$tk:%1$tM:%1$tS]"    <clock>    (Diagnostic,TechnicView_Node1)        { souliss="D99:1:999" }
    Group    Media                "Медиагруппа"        <video>    (All)  
    Group    TV                    "ТВ"                <video>    (Media)  
    Number    TV_Cannel            "Канал TV [%d]"    <video>    (TV, Media)  
    Number    TV_Input            "Вход TV [%d]"        <video>    (TV, Media)  
    String    TV_State             "Статус ТВ[%s]"                (TV, Media)
    Switch    TV_Switch            "Телевизор"            <video>    (TV, Media)  
    Dimmer  TV_Volume             "Громкость ТВ [%d]" <video> (TV, Media)
    Group    STB                    "STB Приставка"        <video>    (STB, Media)  
    Switch    STB_Switch            "Приставка"            <video>    (STB, Media)  
    Number    STB_Cannel            "Канал [%s]"        <video>    (STB, Media)  
    Switch    STB_Cannel_Up        "Следующий Канал"    <video>    (STB, Media)  
    Switch    STB_Cannel_Down        "Предыдущий Канал"    <video>    (STB, Media)
    Switch     STB_Last_Cannel     "Последний канал"    <video>    (STB, Media)
    Switch    STB_USB                "Флешка"            <video>    (STB, Media)
    Switch    STB_Wether            "Погода"            <video>    (STB, Media)
    Group    SUB                 "Колонки"            <kolonki> (Media)
    Switch    SUB_Switch            "Питание колонок"    <music>    (SUB, Media)  
    Number    IR_Code                "Последний IR код [%X]"        <siren>    (Media)  
    Switch    Comp_WS                "Компьютер"            <switch>(Media) {nh="192.168.1.33", wol="192.168.1.255#00-1d-60-5b-64-b6", exec=">[OFF:./configurations/scripts/shutdown_WS.sh]" }
    Switch    Comp_OPI            "Сервер"            <orangepi> (Media) {nh="orangepi", exec=">[OFF:poweroff]" }
    Switch    Restart_OH            "Перезапуск OpenHab"<switch>(Media) {nh="orangepi", exec=">[OFF:./configurations/scripts/restart_OH.sh]" }
    Switch    Comp_Note_Lin        "Ноутбук Линукс"    <switch>(Media) {nh="192.168.1.34", wol="192.168.1.255#c0-18-85-ba-ac-53", exec=">[OFF:ssh root@192.168.1.34 poweroff] >[ON:]" }
    Switch    Comp_Note_Win        "Ноутбук Windows"   <switch>(Media) {nh="192.168.1.34", wol="192.168.1.255#c0-18-85-ba-ac-53", exec=">[OFF:./configurations/scripts/shutdown_Note_win.sh]" }
     
    ИгорьК нравится это.
  4. Smerlin

    Smerlin Нерд

    Теперь вырезка из Sitemap
    Код (Java):
    Frame label="Свет" {
            Switch item=SimpleLight
        //     Switch item=SimpleLight1  
                 
        }
        Frame item=Media label="Медиагруппа" {
            Group item=TV label="ТВ" icon="television" {
                Switch item=TV_Switch label="Телевизор" icon="switch"          
                Slider item=TV_Volume label="Громкость ТВ [%d %%]" icon="slider" switchSupport // visibility=[TV_Switch!=OFF]          
                Text item=TV_State
                Selection item=TV_Input label="Вход ТВ" icon="video" mappings=[1="Антенна", 2="Видеовход 1", 3="Видеовход 2", 4="С-видео", 5="Композит", 6="Цифровой вход", 7="ВГА вход"] //visibility=[TV_Switch!=OFF]          
                Text item=IR_Code label="Последний ИК Код [%X]"          
            }      
            Group item=STB label="STB Приставка" icon="video" {
                Switch item=STB_Switch label="Приставка" icon="switch" //mappings=[ON="Включено", OFF="Выключено"]          
                Selection item=STB_Cannel label="Канал [%s]" icon="video" mappings=[1="Первый канал", 2="Россия 1", 3="Матч ТВ", 4="НТВ", 5="Пятый канал", 6="Россия Культура", 7="Россия 24", 8="Карусель", 9="ОТР", 10="ТВ Центр", 11="РЕН ТВ", 12="Спас", 13="СТС", 14="Домашний", 15="ТВ3", 16="Пятница!", 17="Звезда", 18="Мир", 19="ТНТ", 20="Муз-ТВ", 27="Че", 28="Shopping Live", 29="SHOP24", 30="France 24", 31="Russia Today", 32="EuroNews", 33="Deutsche Welle", 34="Ю", 35="РБК", 36="BBC World News", 37="NHK World", 40="Мир 24", 42="Успех", 43="Инва Медиа ТВ", 44="Промоканал HD", 45="LifeNews", 46="Вместе-РФ", 100="Всё ТВ", 101="TV1000 Action", 102="TV1000", 103="СТС Love", 104="TV XXI", 105="Иллюзион+", 106="Русский Иллюзион", 107="TV1000 Русское кино", 108="Комедия ТВ", 109="Paramount Comedy", 110="SET", 111="Sony Turbo", 112="НСТ", 113="Fox", 114="Fox Life", 115="Феникс+Кино", 117="Sony Sci-Fi", 118="Дом кино", 119="AMEDIA 2", 120="Еврокино", 122="НТВ-ПЛЮС Кино Плюс", 123="НТВ-ПЛЮС Киносоюз", 124="НТВ-ПЛЮС Наше кино", 125="НТВ-ПЛЮС Наше новое кино", 126="Paramount Channel", 127="Кино ТВ", 128="AMC", 129="Zee TV", 130="Ретро", 131="Русский роман", 132="Русский бестселлер", 133="AMEDIA 1", 134="Русский детектив", 200="History", 201="Travel+Adventure", 202="National Geographic", 203="Viasat Explore", 204="Viasat History", 205="Техно 24", 206="Моя планета", 207="Discovery Channel", 208="Animal Planet", 209="Zooпарк", 211="Вопросы и ответы", 212="Психология 21", 213="Наука 2.0", 214="Nat Geo Wild", 215="Охота и рыбалка", 216="Усадьба", 217="Food Network", 218="Ocean TV", 219="Здоровое ТВ", 220="English Club TV", 221="Первый образовательный", 222="DTX", 223="Discovery Science", 226="Страна", 227="ID Xtra", 228="Da Vinci Learning", 229="Просвещение", 230="Viasat Nature", 231="24_DOC", 235="Кто есть кто", 238="Ностальгия", 240="История", 241="Парк развлечений", 242="Оружие", 243="World Business Channel", 301="Nickelodeon", 302="Disney", 303="Мульт", 304="Детский", 305="Радость моя", 306="TiJi", 307="Cartoon Network", 308="Мама", 309="Детский мир", 311="JimJam", 312="Gulli", 313="Nick Jr.", 314="Baby TV", 315="Boomerang", 400="TLC", 401="Бобёр", 403="Fashion TV", 404="Сарафан", 405="Юмор Box", 406="2x2", 408="Живи!", 410="MTV", 501="A-ONE", 502="Russian Music Box", 503="Music Box", 505="RU.TV", 506="Шансон ТВ", 507="Ля-минор", 508="VH1 European", 509="MCM Top", 510="Bridge TV", 511="Европа Плюс ТВ", 512="MTV Dance", 513="MTV Rocks", 514="MTV Hits", 515="VH1 Classic", 516="Mezzo", 517="Rusong TV", 601="Eurosport", 602="Eurosport 2", 603="КХЛ ТВ", 604="Матч! Боец", 605="Матч! Арена", 606="Viasat Sport", 607="Русский Экстрим", 608="Наш футбол HD", 609="Футбол", 610="Extreme Sports Channel", 611="Motors TV", 612="Матч! Наш Спорт", 614="Морской", 615="Eurosport News", 616="Матч! Игра", 617="Outdoor Channel", 619="Драйв", 620="Авто Плюс", 701="Союз", 703="ТРО", 705="Восьмой канал", 706="Беларусь 24", 801="Русская ночь", 802="Blue Hustler", 804="XXL", 806="О-ля-ля", 900="Первый канал HD", 901="Eurosport HD", 902="Матч ТВ HD", 903="Fox Life HD", 904="National Geographic HD", 905="Nat Geo Wild HD", 906="Travel+Adventure HD", 907="myZen.tv HD", 908="MTV Live HD", 909="Mezzo Live HD", 910="Fashion One HD", 911="Outdoor Channel HD", 913="Nickelodeon HD", 914="SET HD", 915="Fox HD", 916="Discovery HD", 917="Animal Planet HD", 918="TV1000 Premium HD", 919="TV1000 Megahit HD", 920="TV1000 Comedy HD", 921="Viasat History HD (19:00-7:00 МСК)", 922="Россия HD", 923="Russia Today HD", 924="History HD", 925="КХЛ ТВ HD", 926="Страшное HD", 927="Paramount Comedy HD", 928="Food Network HD", 929="AMEDIA Hit HD", 930="AMEDIA 1 HD", 931="AMEDIA Premium HD", 932="Paramount Channel HD", 933="Viasat Golf HD", 934="Viasat Sport HD", 935="Живи! HD", 937="Discovery Science HD", 938="TLC HD", 939="МАТЧ! Футбол 1 HD", 940="МАТЧ! Футбол 2 HD", 941="МАТЧ! Футбол 3 HD", 942="Дом кино HD", 943="IQ HD", 945="ID Xtra HD", 946="Мир HD", 947="Museum HD", 948="IConcerts HD", 949="Телеканал Еда HD", 952="Bollywood HD", 953="Авто24", 954="RTД", 955="Охотник и рыболов HD"] //visibility=[STB_Switch!=OFF]          
                Switch item=STB_Cannel_Up label="Следующий канал" icon="video"    //visibility=[STB_Switch!=OFF]      
                Switch item=STB_Cannel_Down label="Предыдущий канал" icon="video" //visibility=[STB_Switch!=OFF]
                Switch item=STB_Last_Cannel    label="Последний канал" icon="video"  
                Switch item=STB_USB label="Флешка" icon="video"  
                Switch item=STB_Wether label="Погода" icon="video"
                Text item=IR_Code label="Последний ИК Код [%X]"          
            }
            Group item=SUB {
                Switch item=SUB_Switch //mappings=[ON="Включено", OFF="Выключено"]          
                Text item=IR_Code label="Последний ИК Код [%X]"          
            }
            Switch item=Comp_WS icon="computer"
            Switch item=Comp_OPI
            Switch item=Restart_OH icon="icon16x16"
            Switch item=Comp_Note_Lin icon="notebook"
            Switch item=Comp_Note_Win icon="notebook"
        }    
     
    ИгорьК нравится это.
  5. Smerlin

    Smerlin Нерд

    Ну и правила
    Код (Java):
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    import org.openhab.core.library.items.*
    import org.joda.time.*
    import org.openhab.model.script.actions.Timer



    var String SCan = null
    var String Dig1
    var String Dig2
    var String Dig3
    var Number Cannel
    var PercentType VolHide = null
    var Boolean UIEnabled = false
    //var Integer i
    var Timer timer1 = null

    rule "IR_Code control"
        when
            Item IR_Code received update
        then
            //Пришел код вкл/выкл TV, обновляем статус выключателя TV
            if (IR_Code.state == 1119866927){
                if (!UIEnabled) {  
                    if (TV_Switch.state==OFF)
                       postUpdate(TV_Switch,ON)
                    else
                       postUpdate(TV_Switch,OFF)            
                }
                UIEnabled=false
            }
            //Пришел код вкл/выкл приставки, обновляем статус выключателя приставки STB
            if (IR_Code.state == 12535991){  
                if (!UIEnabled) {
                    if (STB_Switch.state==OFF)
                       postUpdate(STB_Switch,ON)
                    else
                       postUpdate(STB_Switch,OFF)    
                 }            
                UIEnabled=false
            }
            //Пришел код "Канал STB вверх", обновляем канал STB
            if (IR_Code.state == 12523751){  
                    Cannel=(STB_Cannel.state as DecimalType) + 1
                    postUpdate(STB_Cannel, Cannel)
            }  
            //Пришел код "Канал STB вниз", обновляем канал STB
            if (IR_Code.state == 12531911){  
                    Cannel=(STB_Cannel.state as DecimalType) - 1
                    postUpdate(STB_Cannel, Cannel)
            }
            // Пришел код "Mute TV", отключаем/включаем громкость TV
            if (IR_Code.state ==1119834287){
                    if (TV_Volume.state as PercentType!=0){
                    //выключаем громкость
                    VolHide=TV_Volume.state as PercentType
                    postUpdate(TV_Volume, 0)
                    }
                    else{
                    //включаем громкость
                    postUpdate(TV_Volume, VolHide as PercentType)
                    }
            }
         
            //Пришел код "StandBy" для колонок, включаем/отключаем их
            if (IR_Code.state == 552552631){  
                if (!UIEnabled) {
                    if (SUB_Switch.state==OFF)
                       postUpdate(SUB_Switch,ON)
                    else
                       postUpdate(SUB_Switch,OFF)    
                }            
                UIEnabled=false
            }
        end  
    rule "STB_Cannel_Up control"
        when
            Item STB_Cannel_Up received command
        then
            UIEnabled=true
            if(receivedCommand==ON) {
                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12523751")
             //  postUpdate (IR_Code, "12523751")
                sendCommand(STB_Cannel_Up, OFF)
                }
        end
     
    rule "STB_Cannel_Down control"
        when
            Item STB_Cannel_Down received command
        then
            UIEnabled=true
            if(receivedCommand==ON) {
                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12531911")
            //  postUpdate (IR_Code, "12531911")  
                sendCommand(STB_Cannel_Down, OFF)
                }
        end
    /**
    * This rules control the volume of TV
    */

    rule "TV_Volume control"
        when
            Item TV_Volume received command
        then
            UIEnabled=true
            var Integer incVol =10
            var Integer decVol =10
            //postUpdate(TV_State,"Vol_receive_command")
            if(receivedCommand instanceof PercentType) {
                    postUpdate(TV_State,"Vol=" + receivedCommand)
                    if (receivedCommand as PercentType ==0 || receivedCommand==OFF)    {
                        sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119834287") // Mute Громкость TV
                        postUpdate (IR_Code, "1119834287")
                        VolHide=TV_Volume.state as PercentType
                        postUpdate(TV_Volume, 0)
                    }
                    else{
                        if (TV_Volume.state as PercentType==0)
                            {
                                postUpdate(TV_Volume, VolHide)
                                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119832247")
                                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119815927")
                            }
                    }
                     
                }
            //    setMasterVolume(receivedCommand as PercentType)
            if(receivedCommand==INCREASE) {            //Увеличиваем громкость
                    //postUpdate (TV_State,"Vol_receive_command_INC")
                     var DState = TV_Volume.state as DecimalType + incVol
                    postUpdate(TV_State, "Vol="+ DState)
                    while (incVol>0){
                         sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119832247") //Громкость TV вверх
                          incVol=incVol-1
                     }
                   
                    postUpdate(TV_Volume, DState)
                    postUpdate (IR_Code, "1119832247")
                 }
            if(receivedCommand==DECREASE) {            //Уменьшаем громкость
                    //postUpdate(TV_State,"Vol_receive_command_DEC")
                    var DState = TV_Volume.state as DecimalType - decVol
                    postUpdate(TV_State, "Vol="+ DState)
                    while (decVol>0){
                         sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119815927") //Громкость TV вниз
                        decVol = decVol-1
                     }
                     postUpdate (TV_Volume, DState)
                     postUpdate (IR_Code, "1119815927")
                }  
            // postUpdate(TV_Volume, "" + receivedCommand)
            //postUpdate(TV_Volume, receivedCommand as PercentType)
         
        end
     
    rule "STB_Last_Cannel control"
        when
            Item STB_Last_Cannel received command
        then
            UIEnabled=true
            if(receivedCommand==ON) {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12519161")
                    sendCommand(STB_Last_Cannel, OFF)
                }
        end
    rule "STB_USB run"
        when
            Item STB_USB received command
        then
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12574751")
            if (timer1!= null) {
                   timer1.cancel
                  timer1 = null
                  }
               
            timer1 = createTimer(now.plusSeconds(1)) [|
                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            ]
            timer1 = null
            timer1 = createTimer(now.plusSeconds(1)) [|
                sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            ]
         
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12554861")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12554861")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12562511")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12562511")
        end
     
     
    ИгорьК нравится это.
  6. Smerlin

    Smerlin Нерд

    Продолжение правил
    Код (Java):
    rule "STB_Wether run"
        when
            Item STB_Wether received command
        then
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12574751")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12538541")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12554861")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12562511")
            Thread::sleep(300)
            sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12562511")
        end
     
    rule "TV_ON/OFF control"
         when
             Item TV_Switch received command
         then
             UIEnabled=true
              sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=1119866927")
              Thread::sleep(500)
                 if (receivedCommand == ON){
                     sendCommand(STB_Switch, ON)
                     postUpdate(TV_State,"ON")}
                 else{
                     sendCommand(STB_Switch, OFF)
                       postUpdate(TV_State,"OFF")
                       }
         end
       
    rule "STB_Switch_ON/OFF"
          when
             Item STB_Switch received command
         then
             UIEnabled=true
              sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12535991")
         
         end
    rule "Select STB Channel"
        when
            Item STB_Cannel received command
        then
        UIEnabled=true
        Cannel = (receivedCommand as DecimalType)
        SCan = ""+receivedCommand
        // println("length "+SCan.length())
        if (SCan.length()==1) {
            Dig1 = '0'
            Dig2 = '0'
            Dig3 = ""+SCan.charAt(SCan.length()-1)
        }
        else if (SCan.length()==2) {
            Dig1 = '0'
            Dig2 = ""+SCan.charAt(SCan.length()-2)
            Dig3 = ""+SCan.charAt(SCan.length()-1)
        }
        else if (SCan.length()==3) {
            Dig1 = ""+SCan.charAt(SCan.length()-3)
            Dig2 = ""+SCan.charAt(SCan.length()-2)
            Dig3 = ""+SCan.charAt(SCan.length()-1)
        }
        //println("Dig1="+Dig1+" Dig2="+Dig2+" Dig3="+Dig3)
        switch Dig1 {
                case '1' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12560471")
                    postUpdate (IR_Code, "12560471")
                    println("Dig1="+Dig1)
                }
                case '2' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12544151")
                    postUpdate (IR_Code, "12544151")
                    println("Dig1="+Dig1)
                }
                case '3' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12576791")
                    postUpdate (IR_Code, "12576791")
                    println("Dig1="+Dig1)
                }
                case '4' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12556391")
                    postUpdate (IR_Code, "12556391")
                    println("Dig1="+Dig1)
                }
                case '5' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12540071")
                    postUpdate (IR_Code, "12540071")
                    println("Dig1="+Dig1)
                }
                case '6' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12572711")
                    postUpdate (IR_Code, "12572711")
                    println("Dig1="+Dig1)
                }
                case '7' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12564551")
                    postUpdate (IR_Code, "12564551")
                    println("Dig1="+Dig1)
                }
                case '8' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12548231")
                    postUpdate (IR_Code, "12548231")
                    println("Dig1="+Dig1)
                }
                case '9' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12580871")
                    postUpdate (IR_Code, "12580871")
                    println("Dig1="+Dig1)
                }                    
        }

        switch Dig2 {
                case '0' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12550781")
                    postUpdate (IR_Code, "12550781")
                    println("Dig2="+Dig2)
                    }
                case '1' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12560471")
                    postUpdate (IR_Code, "12560471")
                    println("Dig2="+Dig2)
                    }
                case '2' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12544151")
                    postUpdate (IR_Code, "12544151")
                    println("Dig2="+Dig2)
                    }
                case '3' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12576791")
                    postUpdate (IR_Code, "12576791")
                    println("Dig2="+Dig2)
                    }
                case '4' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12556391")
                    postUpdate (IR_Code, "12556391")
                    println("Dig2="+Dig2)
                    }
                case '5' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12540071")
                    postUpdate (IR_Code, "12540071")
                    println("Dig2="+Dig2)
                    }
                case '6' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12572711")
                    postUpdate (IR_Code, "12572711")
                    println("Dig2="+Dig2)
                    }
                case '7' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12564551")
                    postUpdate (IR_Code, "12564551")
                    println("Dig2="+Dig2)
                    }
                case '8' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12548231")
                    postUpdate (IR_Code, "12548231")
                    println("Dig2="+Dig2)
                    }
                case '9' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12580871")
                    postUpdate (IR_Code, "12580871")
                    println("Dig2="+Dig2)
                    }                    
            }

        switch Dig3 {
                case '0' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12550781")
                    postUpdate (IR_Code, "12550781")
                    println("Dig3 "+Dig3)
                    }
                case '1' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12560471")
                    postUpdate (IR_Code, "12560471")
                    println("Dig3 "+Dig3)
                    }
                case '2' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12544151")
                    postUpdate (IR_Code, "12544151")
                    println("Dig3 "+Dig3)
                    }
                case '3' : {
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12576791")
                    postUpdate (IR_Code, "12576791")
                    println("Dig3 "+Dig3)
                    }
                case '4' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12556391")
                    postUpdate (IR_Code, "12556391")
                    println("Dig3 "+Dig3)
                    }
                case '5' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12540071")
                    postUpdate (IR_Code, "12540071")
                    println("Dig3 "+Dig3)
                    }
                case '6' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12572711")
                    postUpdate (IR_Code, "12572711")
                    println("Dig3 "+Dig3)
                    }
                case '7' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12564551")
                    postUpdate (IR_Code, "12564551")
                    println("Dig3 "+Dig3)
                    }
                case '8' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12548231")
                    postUpdate (IR_Code, "12548231")
                    println("Dig3 "+Dig3)
                    }
                case '9' :{
                    sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=12580871")
                    postUpdate (IR_Code, "12580871")
                    println("Dig3 "+Dig3)
                    }                    
            }
         end
    rule "SUB_Switch_ON/OFF"
          when
             Item SUB_Switch received command
         then
             UIEnabled=true
              sendHttpGetRequest("http://192.168.1.31:8080/irc?volume=552552631")
         
         end
     
    ИгорьК нравится это.
  7. Smerlin

    Smerlin Нерд

    И еще в Persist в файле rrd4j добавил

    IR_Code : strategy = everyUpdate, restoreOnStartup
    STB_Cannel : strategy = everyUpdate, restoreOnStartup

    Текст скриптов на выключение компьютеров, привязанных к переключателям в соответствующих итемах приводить не буду они простые буквально из одной строки и там присутствуют мои пароли)). Ну если надо - выложу.

    Однако есть вопрос. Я перезапускаю сервис openhab командой service openhab restart, что из консоли, что скриптом из-под самого openhab. Если из консоли руками, то сервис останавливается, а потом опять запускается. А вот из-под самого openhab происходит только остановка сервиса, а запуск приходится делать ручками, где порылась собака?

    И есть еще вопрос: Как реализовать обратную связь от управляемых ИК командами устройств? Я ловлю команды обычного пульта, если пользователь переключил канал, например, им и меняю соответствующие итемы в опенхабе, но а вдруг пользователь воспользуется не пультом, а кнопками на телевизоре например, тут я попал в просак! Как узнать актуальное состояние у того же телевизора, есть идеи?
     
  8. Smerlin

    Smerlin Нерд

    Ну и забыл как все это выглядит показать:
    screen.jpg screen2.jpg screen3.jpg
     

    Вложения:

    • kolonki.png
      kolonki.png
      Размер файла:
      51,3 КБ
      Просмотров:
      883
    • notebook.png
      notebook.png
      Размер файла:
      214,4 КБ
      Просмотров:
      908
    • computer.png
      computer.png
      Размер файла:
      1,6 КБ
      Просмотров:
      873
    Securbond и ИгорьК нравится это.
  9. Smerlin

    Smerlin Нерд

    Иконки направления ветра
     

    Вложения:

    mex79 и ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Вот это подарок! Доберусь до компа вынесу в заголовок.
    Чтобы ОН лучше управлял she'll его надо внести в группу root
     
  11. Smerlin

    Smerlin Нерд

    И добавка к погоде Yandex
    Код (Java):
    Number    YandexWind    "Скорость Ветра [%.1f м/с]"    <wind>   {http="<[http://export.yandex.ru/bar/reginfo.xml?region=xxxxx.xml:120000:REGEX(.*?<wind_speed>(.*?)</wind_speed>.*)]" }
    String    YandexWindDirection    "Направление Ветра [%s]"    <wind_dur>  { http="<[http://export.yandex.ru/bar/reginfo.xml?region=xxxxx.xml:120000:REGEX(.*?<wind_direction.*>(.*?)</wind_direction>.*)]" }
    Number    YandexPress   "Атмосферное давление [%d мм рт.ст.]" <barometr>   { http="<[http://export.yandex.ru/bar/reginfo.xml?region=xxxxx.xml:120000:REGEX(.*?<pressure>(.*?)</pressure>.*)]" }
    вместо xxxxx.xml поправьте свой город

    Код (Java):
    Text item=YandexWind
    Text item=YandexWindDirection
    Text item=YandexPress
     
  12. Smerlin

    Smerlin Нерд

    Игорь, не спешите в заголовок, там в правилах не все работает как надо, например в громкости, некогда отлаживать, или пометить что "как есть" )))
     
  13. ИгорьК

    ИгорьК Гуру

    Вот погода Яндекс... я на нее забил из-за постоянных сбоев, переделок, не ответов. Как у Вас, работает успешно?
    И повторюсь, ОН включили в root?
    edit to /etc/default/openhab:

    USER_AND_GROUP=root:root

    And then edit /usr/lib/systemd/system/openhab.service and set the following:

    User=root
    Group=root
     
    Последнее редактирование: 9 дек 2016
  14. ИгорьК

    ИгорьК Гуру

    Эта тема учебная, тема примеров. Каждый пример ценен как направление мысли.
    Это не готовый проект и не будет им никогда. Поэтому ваши сообщения достойны и будут в заголовке.
     
  15. Smerlin

    Smerlin Нерд

    А код узлов то чуть не забыл!!!
    Первый в лампе (в нем попутно шлюз узлов souliss) и второй в ик пульте (там пир soullis).
    Если будете делать только пульт, то его нужно перевести из пира в шлюз. Шлюз в сети соулис всегда должен быть один, а пиров может быть много/не быть вовсе. Opehhab рассматривается шлюзом как один из пиров.
     

    Вложения:

    Последнее редактирование: 9 дек 2016
    ИгорьК нравится это.
  16. Smerlin

    Smerlin Нерд

    Ну так насчет обратной связи от ИК управляемых устройств подскажите идею, а то нехорошо получается: выдернули телек из розетки, а openhab то не знает!
     
  17. ИгорьК

    ИгорьК Гуру

    Если устройство не сообщает о своём состоянии - какие могут быть идеи.
     
  18. Smerlin

    Smerlin Нерд

    Есть одна - хотя бы выкл/вкл контролировать, добавить ESP8266 в сам телевизор, подцепить к нему светодиод с передней панели и опрашивать его состояние. Только это называется "на безрыбье и рак рыба", потому это на худой конец. И так слишком расточительно получается, в каждое устройство ради только вкл/выкл пихать модуль.
     
  19. ИгорьК

    ИгорьК Гуру

    Если устройство сетевое и выключается с вылетом из сети - его можно проверять. Но это частный случай.
    А вообще, не перебор ли это? Так ли это нужно? Автоматизации ради автоматизации?
     
  20. ZAZ-965

    ZAZ-965 Гуру

    Включенное ли выключенное состояние можно контролировать по потреблению тока (ожидание <5Вт, работа >15Вт). Для считывания состояний кнопок можно использовать накладную клавиатуру, принцип как мошенники ставят накладки на банкоматы.