Išmaniųjų namų sąsajos projektavimas ir integravimas. Mobilus valdymas

Tai scenarijus sukurta namų valdymo sistema. Tai leidžia pakabinti savavališką logiką (scenarijus) įvairiems įvykiams namuose (daviklių suveikimui, mygtukų paspaudimams, įvykiams iš išorinių tarnybų, pavyzdžiui, el. laiškų ar žinučių gavimo Twitter). Sistema turi modulinę architektūrą, visos funkcijos yra įskiepiuose. Jei reikia pridėti naują įvykio tipą arba naujas „namų API“ komandas, tereikia pridėti tam skirtą papildinį.

Pirmą kartą išleidome vasario mėnesį. Pirmojoje versijoje buvo sukurta sistema namų automatika: įskiepių sistema ir jiems skirta infrastruktūra (kad įskiepiai galėtų aprašyti savo API ir įvykius, taip pat naudotis API ir užsiprenumeruoti vieni kitų įvykius). Dabar pasirodo antroji versija, kurios pagrindinė ypatybė yra nauja žiniatinklio sąsaja.

UI dabar yra modulinė vieno puslapio programa. Papildiniai gali apibūdinti savo vartotojo sąsają kaip html / js / css failus, esančius DLL šaltiniuose. Kliento vartotojo sąsaja yra pagrįsta backbone.js ir marionette.js, moduliai įkeliami per request.js. Apskritai tai pasirodė gana patogu įskiepių autoriams – net ir neturėdami gilių Java scenarijaus žinių, žvelgdami į pavyzdžius galite aprašyti visavertę vartotojo sąsają, kuri bus automatiškai prijungta prie namų valdymo sąsajos.


Namų valdymo sąsaja susideda iš "skyrių", kiekvienas papildinys gali turėti keletą skyrių (ir gali turėti tik vieną arba gali neturėti sąsajos). Skyriai skirstomi į 2 grupes: sistema ( įvairūs nustatymai, pavyzdžiui, namų scenarijų skiltis) ir vartotojo apibrėžtas (skiltys, kuriose naudotojai dirba Kasdienybė pvz., „orų prognozė“ ir „pavojaus signalai“).

Taip pat yra specialus puslapis - "desktop" (dar žinomas kaip "pradžios puslapis"). Yra "pradžios puslapio elementai" - mažos plokštės, kurios rodomos Naudinga informacija, o juos paspaudus atsidaro puslapis arba atliekamas veiksmas.

Pradinis puslapis

skyrius su signalizacija (in tinkamas laikas paleis muziką arba pradės scenarijaus vykdymą)

Skyrius su orų prognozėmis (atsisiųsta iš interneto)

scenarijaus rengyklė (ekrano kopijoje scenarijus, kuriame fotografuojami lankytojai, paspaudę durų skambučio mygtuką)

įvykių prenumeratos puslapis: pirmasis išskleidžiamasis sąrašas - įvykiai sistemoje (jie aprašyti papildiniuose), antrasis sąrašas - scenarijai

Sąsaja prisitaiko prie mažų mobiliųjų įrenginių ekranų.

pradžios puslapis mažame ekrane

mažo ekrano orų puslapis

Dabar, kaip jau rašiau, sistema sparčiai artėja prie 2 versijos išleidimo, išeities kodas yra github. Dar yra galimybė kažką pakeisti. Labai norėčiau sulaukti konstruktyvios kritikos ir pasiūlymų tobulėjimui (o jei kas atsiųs traukimo užklausą, tai apsidžiaugsiu).

Jei kas nori pabandyti gyvai, kaip viskas veikia, rasykite asmenine zinute - surinksiu jums sviezia distribucija.

PS.
Beje, kiekvieną dieną bandžiau dirbti su šiuo projektu ir tai davė nuostabių rezultatų. Dabar jau 8-oji darbo šiuo režimu savaitė (Ilgiausia serija 49 dienos). Per šį laiką projektas pajudėjo į priekį daugiau nei per ankstesnius šešis mėnesius. Esu labai patenkintas rezultatu ir planuoju kuo daugiau dirbti šiuo režimu.

Dar kartą klaidžiodamas po internetą ieškodamas žiniatinklio sąsajos elektros prietaisams valdyti naudojant X10 protokolą, natūraliai atsidūriau Melloware įmonės svetainėje. Palaikydama savo X10 aparatinę įrangą, bendrovė siūlo (nemokamą) programinės įrangos produktą, vadinamą X10 vadas ... Tai serveris, įdiegtas Windows kompiuteryje, prie kurio prijungtas USB X10 valdiklis, pvz., CM15 ar panašus. Visi X10 name esantys įrenginiai, jų adresai ir tipai, yra užregistruoti serveryje. X10 Commander leidžia valdyti aprašytus įrenginius tiesiai iš kompiuterio, kuriame jis įdiegtas, arba nuotoliniu būdu, naudojant HTTP (GET) užklausas, pvz.(tai, visų pirma, komanda įjungti įrenginį A1) Be to, ta pati įmonė (jau už nedidelius pinigus) siūlo iOS / Android planšetiniame kompiuteryje ar telefone įdiegtas programas, kurios veikia per tą patį serverį ir leidžia jums labai patogiai valdyti X10 įrenginius.

Mano mintis buvo tokia. Kompiuteryje, kurį turiu namuose, jis veikia kaip namų medijos serveris, kintantis torrentas, Skype ir pan. ir tt Diegiu Web ir FTP serverius, X10 komandą ir pajungiu CM15 valdiklį. Nubraižome svetainę ir publikuojame ją per žiniatinklio serverį LAN ir, jei pageidaujame, persiunčiame į pasaulinį tinklą visiškai nuotoliniam valdymui. (Beje, vėliau šiame kompiuteryje įdiegiau HomeSapiens serverį ir dėl to gavau valdymą balsu.

Norint įgyvendinti šią idėją, teko šiek tiek paskaityti google ir padirbėti su galva bei rašikliais. Šiame straipsnyje neaprašysiu, kaip įdiegtas žiniatinklio serveris ir kaip jis veikia (jums padės Google ir išmaniosios knygos). Pasidalinsiu, kad „Google“ ieškojau tiesiogiai, kad galėčiau valdyti X10 per CM15 valdiklį ir naudoti „X10 Commander“.
Galite sužinoti daugiau apie X10commander sintaksę. Atsisiųsti ActiveHomePro SDK paketą iš gamintojo x10 svetainės taip pat nebus nereikalinga, yra išsamus keitimosi protokolo su CM15 aprašymas, nors pagrindinės ištraukos yra čia (Google išversta aprašymo dalis):

Pažvelkime į sintaksę .... http: // localhost: 8086 = serveris ir prievadas, kur veikia X10 Commander? x10command = = signalizacijos parametras, kurią komandą norite vykdyti ĮRENGINIO ~ ~ sendplc "A1 OFF", atskirtas tilde pirmiausia įrenginyje, o tada sendplc / sendrf, priklausomai nuo to, ar norite maitinimo linijų ar radijo dažnio(RS vis dar veikia su queryplc komanda – būsenos užklausa)ir tada „A1 OFF“ kabutėse, įrenginio ir namo kodas bei komanda. keli pavyzdziai....

// Įjunkite A1
http://localhost: 8086 /? x10command = ĮRENGINIS ~ sendplc ~ "A1 ON"
// Padidinkite A1 ryškumą 50 %
http: // localhost: 8086 /? x10command = ĮRENGINIS ~ sendplc ~ "A1 BRIGHT 50"
// Pritemdykite A1 iki 30 %

http: // localhost: 8086 /? x10command = ĮRENGINIS ~ sendplc ~ "A1 DIM 30"

Skiltyje „Web Interface To X10 Commander“ esančiame Melloware forume radau labai įdomų pavyzdį „Javascript“, leidžiantį puslapyje sukurti patogų mygtukų lauką, kurį paspaudę galėsite valdyti savo įrenginius per X10 protokolą per X10commander serveris. Štai kažkas, ko ilgai nereikėtų ieškoti. Norintys pakartoti, pritaikykite jį prie savo namų parametrų, užregistruodami atitinkamus adresų pavadinimus ir komandas, nurodydami serverio adresą, prisijungimo vardą ir slaptažodį, kurie yra nustatyti X10 Commander. Tada įdėkite šį scenarijų į savo HTML puslapį... ir viskas! Tu būsi laimingas :-)

Taip pat nusprendžiau pabandyti sukurti savo puslapį naudodamas šį scenarijų. Kadangi nesu programuotojas ir esu susipažinęs su HTML arbatinuko lygmeniu, ėmiau sukurti puslapį naudodamas kokį nors svetainių kūrėją. Radau programą, skirtą greitas kūrimas svetaines WebSite X5, pasirinkau svetainės išvaizdos šabloną, sukonfigūravau meniu, įterpiau paveikslėlį ir scenarijų, pritaikytą mano nustatymams. ir išėjo maždaug taip:

Tada norėjau organizuoti interaktyvų valdymą, kad svetainė matytų, ką aš valdau ir kokios būsenos lempos patalpoje dabar. Gilinimasis į mainų su serveriu sintaksęX10 Commander ir HTML kalba toje pačioje programoje nesukūriau man reikalingų puslapių su atitinkamu išvaizda ir įterpė į juos nedidelį kodą su rašikliais, kad būtų sudarytos užklausos serveriuiX10 vadas. (Tikrai sakoma - Palaiminti sunkumai! Mes augame iš jų!)

Štai kas atsitiko kaip rezultatas:




Spustelėjus paveikslėlį pasikeičia lempų būsena kambaryje ir atitinkamai paveiksle.

Taigi tikslas buvo pasiektas tiesiogine prasme per 3-4 vakarus tankiai sėdint prie kompiuterio.

Nors verta paminėti, kad nepaisant to, kad valdymo sąsaja tinklalapyje yra labai paprasta ir intuityvi, aš ja naudojuosi tik aš. Namų ūkiai iš įpročio renkasi jungiklius. Panašu, kad ši paslauga būtų paklausi vietoje jungiklių, kurių gija turėtų pakabinti planšetę su įkeltu valdymo puslapiu būtent šiam kambariui. Tačiau šios paslaugos taip pat negalima vadinti nenaudinga! Sėdžiu prie kompiuterio, kaip sakoma, nepakeldamas atramos taško patogi kėdė, įjunkite / išjunkite viršutinę šviesą, kai reikia. Ir žinoma galiu valdyti savo elektros prietaisus per internetą, kai iškyla poreikis. (jei taip atsitiks, žinoma :-))

B-Tune® sistema valdoma BT-4000/6000 valdikliu, kuris yra mini WEB serveris, valdomas per naršyklę. Mobilusis telefonas, kompiuteris, planšetinis kompiuteris, pvz., iPad arba netbook. Įvairių modifikacijų BT-4000/6000 gali veikti tinkluose: Ethernet, GSM, ADSL ir WiMax (per USB modemai), leidžianti optimizuoti ryšio išlaidas.

BT-4000/6000 galima prijungti prie energijos skaitiklių, laidiniu ir belaidžiai jutikliai, oro kondicionieriai, Prietaisai..., kontroliuoti ir valdyti juos.

Valdiklis veikia Linux sistemoje, todėl galite naudoti daugybę programų ir protokolų. Visų pirma, galima organizuoti ryšį, nereikia kiekvienam abonentui skirti fiksuoto IP adreso. Taip pat yra galimybė naudoti šį sprendimą skirta: resursų apskaitai namuose (ASKUE), darbuotojų darbo laiko apskaitai, orų stebėjimui ir kt.

BT-4000/6000 pagrindu sukurti sprendimai yra visapusiškos išmaniųjų namų sistemos, leidžiančios valdyti ir valdyti visus būsto nuosavybės parametrus naudojant patogią ir intuityvią grafinę sąsają. Valdymas gali būti vykdomas ir iš namo vidaus (dažniausiai per vidinį WiFi tinklas), o iš išorės – internetu, naudojantis telekomunikacijų operatoriaus serveriu. Tuo pačiu metu sistemos bazinio abonento rinkinio kaina neviršys savikainos biudžetinis GSM signalizacija.

Vietinis namų valdymas (iš namų vidaus)

Fig. 1 parodytas tipinio buto su įdiegta B-Tune® sistema grindų planas. Apsaugos funkcijoms užtikrinti: ant kai kurių durų sumontuoti varstymo davikliai, taip pat infraraudonųjų spindulių davikliai, valdantys judėjimą koridoriuje ir svetainėje. Siekiant apsisaugoti nuo nuotėkio, vonios kambaryje ir tualete įrengiami vandens nuotėkio davikliai. Virtuvėje įrengtas dūmų detektorius. Dėl nuotolinio valdymo pultas už buto koridoriuje ir darželyje įrengtos vaizdo kameros, iš kurių "vaizdas" gali būti perduotas į buto savininko kompiuterį arba PDA, bet kokiu būdu prijungtą prie interneto. Temperatūros jutikliai naudojami vidaus ir lauko temperatūrai stebėti.

Elektros skydelyje sumontuota pavojaus sirena, valdomų relių blokas nuotoliniam apkrovų įjungimui ir išjungimui bei elektros skaitiklis. Šie įrenginiai yra prijungti prie sistemos valdiklio. Buto savininkas gali nuolat stebėti bendrą ir esamą energijos suvartojimą. Pavyzdžiui, buto savininkas gali nesunkiai patikrinti, ar nepaliko įjungto lygintuvo lyginimo lenta: taip yra, jei sąnaudos (elektros skaitiklio duomenys) yra 1-2 kW. Tačiau jei atitinkama lizdų grupė yra prijungta prie valdomos relės, išjungus relę galima išjungti kairįjį lygintuvą. Zonoje priekinės durys ne matomoje vietoje, taip pat įrengtas iButton® valdymo pultas, skirtas buto apsaugai įjungti ir išjungti.

Sistema įdiegta tipinis butas

Būdamas namuose, abonentas iš savo kompiuterio, PDA, nešiojamojo kompiuterio ar planšetinio kompiuterio, naudodamasis WEB naršykle, galės:

  • Valdykite šviesą
  • Kontroliuokite užuolaidų ir žaliuzių atidarymą
  • Stebėkite jutiklių būseną (temperatūrą, drėgmę, dūmus, kintamosios srovės įtampą, judėjimą ir kt.)
  • Valdykite oro kondicionierius, televizorių ir garso įrangą
  • Peržiūrėkite „nuotraukas“ iš vaizdo kamerų
  • Naudotis nuotolinio medicinos centro telemedicinos paslaugomis (jei yra papildoma įranga)

Prieš naudojantis abonentu lokaliai (iš buto), reikia sukonfigūruoti Sistemą per Ethernet tinklą, naudojant WEB naršyklę. Darbas per grafinę ir paprastą sąsają primena žaidimą su moderniomis „programėlėmis“, o norint nustatyti nereikia skaityti aprašymo ir siųsti „šifruotų SMS“. Norėdami konfigūruoti, turite prijungti kompiuterį prie valdiklio tiesiogiai arba per Ethernet šakotuvą. Esant išoriniam Wifi maršrutizatorius valdiklį galima konfigūruoti iš mobiliojo telefono, PDA, planšetinio kompiuterio ar nešiojamojo kompiuterio. (Kad tinkamai veiktų, valdymo įrenginyje turi būti įdiegta moderni naršyklė, palaikanti WEB 2.0 technologiją).

Sąranką sudaro šie veiksmai, kuriuos abonentas gali atlikti savarankiškai:

  • Nubraižykite ir įkelkite namo planą (neprivaloma)
  • Prijunkite jutiklius (kai kurių jutiklių tipą automatiškai nustato valdiklis)
  • Padėkite jutiklius ant plano
  • Nustatykite parametrus, pagal kuriuos valdiklis turėtų siųsti aliarmo pranešimus (SMS, skambinti ...) arba atlikti tam tikrus veiksmus (įjungti šviesą, uždaryti užuolaidas ...)

Nuotolinis valdymas iš bet kurio interneto taško per operatoriaus „asmeninę paskyrą“

Nuotolinei prieigai prie valdiklio operatoriaus pusėje naudojamas tam skirtas interneto serveris (toliau – Serveris), kuris turi simbolinį pavadinimą ir statinį IP adresą.

Valdiklis, bet kokiu būdu prisijungęs prie interneto, automatiškai atidaro saugų VPN ryšį su serveriu. Serveris periodiškai tikrina valdiklio prieinamumą ir informuoja abonentą, jei nutrūksta ryšys su juo (El. paštas, SMS, Skambutis).

Norėdami susisiekti su valdytoju, prie interneto prisijungęs abonentas turės prisijungti prie Serverio ir įvesti savo duomenis, kad patektų į operatoriaus „asmeninę paskyrą“. Serveris autentifikuoja Abonentą ir patikrina, ar ryšio kanalas su jo Valdikliu yra atidarytas. Jei ryšio kanalas yra atviras, tada serveris siunčia duomenis tarp abonento ir Valdytojo. Per sąsają " Asmeninė paskyra»Abonentas turi prieigą prie:

  • WEB sąsaja, skirta „Išmaniesiems namams“ valdyti, panašiai kaip vietinė sąsaja
  • Įvykių žurnalas
  • Temperatūros, drėgmės ir kt. pokyčių grafikai.
  • Programavimo įvykiai, kai serveris turi siųsti SMS / Mail / Skype / ICQ žinutes
  • Valdiklio darytos ir į serverį įkeltos nuotraukos ar vaizdo įrašai

Neatidėliotinais atvejais Valdytojas išsiųs abonentui SMS žinutę. Norint valdyti svarbiausias funkcijas, gali tekti diegti SMS žinutėmis gautų komandų apdorojimą.

Stebėjimas ir grupės valdymas naudojant operatoriaus "grupinę spintelę"

Atskirai reikia pažymėti, kad Serveris gali būti naudojamas stebėjimo sistemoms organizuoti kotedžų gyvenvietės ir daugiabučiai namai... Tokiu atveju grupės dispečeriui / operatoriui reikės „grupės kabineto“, per kurį bus galima pasiekti:

  • Duomenų bazė su energijos skaitiklių verčių rodmenimis.
  • Konkrečių įvykių duomenų bazė abonento pusėje (pavyzdžiui, prekystalio atidarymas arba durų atidarymas saugojimo režimu)
  • Grafinis žemėlapis – su valdiklių susiejimu su geografine objektų vieta ( darbo vieta dispečeris).
  • Grupinės programinės įrangos keitimas įrenginiuose
  • Papildomos funkcijos... Pavyzdžiui, tiesioginio elektros suvartojimo stebėjimo funkcija: kas 15 minučių rodmenų suma iš visų buto skaitikliai lyginamas su pyrago (bendras) skaitiklio rodmenimis. Aptikus didesnį nei iš anksto nustatytą slenkstį neatitikimą, duodamas signalas, kad būtų apžiūrėta vieta dėl neteisėto elektros parinkimo.

Serveris taip pat teikia integravimo funkciją (API sąsają) su trečiųjų šalių paslaugomis. Pavyzdžiui, telemedicinos paslaugų teikėjai, saugumo agentūros ir kt.

Sugebėjome išmokyti savo išmaniųjų namų sistemą atpažinti tai, ką pasakėme, ir susintetinti balso atsakymus naudodami „Google“.
Šiandien noriu jums pasakyti, kaip organizuoti prieigą prie mūsų sistemos per žiniatinklio sąsają.

Technologijos

Kaip prisimenate, programinė įranga, skirta valdyti mūsų protingas namas»Rašome kalba perl... Modernus Informacinė sistema praktiškai neįsivaizduojamas be duomenų bazės. Mes taip pat neliksime nuošalyje ir savo duomenims saugoti naudosime DBVS. MySQL... Norėdami įdiegti žiniatinklio serverį, nusprendžiau naudoti ne trečiosios šalies programinę įrangą, o perl modulį - HTTP :: Serveris :: Paprasta, ypač - HTTP :: Serveris :: Paprastas :: CGI... Kodėl aš tai padariau? Dažniausiai dėl pramogos;) Tačiau teoriškai galite gauti prieigą prie žemo lygio HTTP užklausų / atsakymų apdorojimo, neperkraunant Apache / mod_perl komplekso. Apskritai niekas netrukdo perkelti projekto į Apache bėgius, jei turite noro ir pakankamai laiko.

Duomenų bazė

Pirmiausia įdiegsime MySQL DBVS ir sukursime duomenų bazę su lentelėmis iš db.sql. Štai sąrašas:

KURTI DUOMENŲ BAZĖS joną; NAUDOKITE joną; # # Lentelės struktūra lentelės "kalendorius" # DROP TABLE JEI YRA kalendorius; KURTI LENTELĘ `calendar` (` id` int (15) NOT NULL AUTO_INCREMENT, `data` datetime NOT NULL, ` message` tekstas, `exttimeplay` datetime NOT NULL, `expired` datetime NOT NULL, `type` int (1) NUMATYTOJI NULIS, PIRMINIS RAKTAS („id“)) VARIKLIS = MyISAM NUMATYTOJI CHARSET = latin1; # # Lentelės struktūra lentelės "commandslog" # DROP TABLE IF EXISTS commandslog; KURTI LENTELĘ "commandslog" (" id" int (15) NOT NULL AUTO_INCREMENT, "data" datatime NOT NULL, "cmd" varchar (255) NOT NULL, PRIMARY KEY ("id")) VARIKLIS = MyISAM AUTO_INCREMENT = 1 DEFAFAKT. = lotyn1; # # Lentelės struktūra "log" # DROP TABLE JEI YRA žurnalas; KURTI LENTELĘ 'log' (' id' int (15) NOT NULL AUTO_INCREMENT, "data" datetime NOT NULL, " message" varchar (255) NOT NULL, "level" int (1) NUMATYTOJI NULL, PIRMINIS RAKTAS (" id" )) VARIKLIS = MyISAM AUTO_INCREMENT = 1 NUMATYTOJI CHARSET = latin1;

Imkimės būtinų veiksmų:

[apsaugotas el. paštas]: ~ $ sudo apt-get install mysql-server
[apsaugotas el. paštas]: ~ $ mysql -uroot -ppassword< db.sql

Kodo modifikavimas

Dabar turime sukurti aplankus lib, html ir konfig(šalia aplanko duomenis). Į aplanką lib mes sukursime modulį, atsakingą už žiniatinklio serverio diegimą ir HTTP užklausų tvarkymą.

Turime šiek tiek pakoreguoti scenarijų srv.pl... Pridėkite prie inicijavimo bloko:

Mūsų% cfg = readCfg ("bendrasis.cfg"); mūsų $ dbh = dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass"));
Po inicijavimo bloku pridėkime eilutes, atsakingas už HTTP serverio paleidimą:

## HTTP serverio paleidimas ################################ my $ pid = lib :: HTTP-> naujas ( $ cfg ("httpPort")) -> fonas (); spausdinti "HTTP PID: $ pid \ n"; logSystem ("HTTP paslauga - PID: $ pid, prievadas: $ cfg (" httpPort "), priegloba: $ cfg (" httpHost ")", 0); ###############################
Dabar failo pabaigoje pridėkime trūkstamas funkcijas:

Sub readCfg (mano $ failas = shift; mano% cfg; atidaryti (CFG, " ; foreach my $ line (@cfg) (kita if $ line = ~ / ^ \ # /; if ($ line = ~ /(.*?) \ = \ "(. *?) \" \; /) (chomp 2 USD; $ cfg (1 USD) = 2 USD;)) uždaryti (CFG); grąžinimo% cfg; ) ####################################### sub dbConnect (mano ($ db, $ vartotojas , $ pass) = @_; return $ dbh = DBI-> connect ("DBI: mysql: $ db", $ vartotojas, $ pass) || die "Nepavyko prisijungti prie duomenų bazės: $ DBI :: errstr"; ) ####################################### sub logSystem (mano ($ tekstas, $ lygis ) = @_; mano% cfg = readCfg ("bendrasis.cfg"); dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass")); $ dbh-> do ("INSERT INTO log (data, pranešimas, lygis) VERTYBĖS (DAbar ()," $ tekstas ", $ lygis)");)

Kaip galite suprasti iš funkcijų pavadinimų, dbConnect () yra atsakinga už prisijungimą prie mūsų DBVS, logSystem () yra už registravimą, readCfg () yra už konfigūracijos įkėlimą. Pakalbėkime apie tai išsamiau. Konfigūracija yra paprastas tekstinis failas konfigūracijos kataloge. Mūsų atveju jis vadinamas bendras.cfg... Tai atrodo maždaug taip:

## Nustatymai daemonMode = "undef"; logSystem = "1"; logUser = "1"; dbName = "jonas"; dbUser = "root"; dbPass = "slaptažodis"; camNumber = "4"; camMotionDetect = "1"; httpPort = "16100"; httpHost = "localhost"; telnetPort = "16000"; telnetHost = "localhost"; micThreads = "5";

Kai kurios jame esančios eilutės bus naudojamos vėliau. Kol kas mus domina tik priešdėliu prasidedančios eilutės db... Kaip matome, tai yra prisijungimo prie mūsų duomenų bazės nustatymai.

Dabar aš kalbėsiu apie tai, kaip įveikti pakartotinį komandos vykdymą. Redaguojame funkciją checkcmd ():

Sub checkcmd (mano $ tekstas = shift; chomp $ tekstas; $ tekstas = ~ s / $ // g; spausdinti "+ Gerai - Gauta komanda \" $ tekstas \ "(Ilgis:" .ilgis ($ tekstas). ") \ n "; if ($ tekstas = ~ / sistema /) (################################### ############# mano $ sth = $ dbh-> paruošti ("SELECT cmd FROM komandoslog WHERE DATE_SUB (NOW (), INTERVALAS 4 SECOND)<= date LIMIT 0, 1"); $sth->vykdyti (); mano $ rezultatas = $ sth-> fetchrow_hashref (); if ($ rezultatas -> (cmd) ne "") (return;) $ dbh-> do ("INSERT INTO commandslog (data, cmd) VALUES (NOW ()," $ tekstas ")"); ################################################ if ( $ text = ~ / check /) (mano $ up = `veikimo laikas`; $ up = ~ / up (. *?), /; sayText (" Serverio veikimo laikas - $ 1. Pagrindinio proceso numeris - $ pirminis. ") ; ) if ($ tekstas = ~ / laikas /) (mano $ iki = `veikimo laikas`; $ up = ~ /(.*?) up /; sayText (" Dabar $ 1 ");) if ($ tekstas = ~ / finišas / || $ tekstas = ~ / užbaig * .wav "); sistema (" killall perl "); išeiti (0);) if ($ tekstas = ~ / oras /) (mano ($ addit, $ mod); mano% wh = lib :: HTTP :: checkWeather (); $ wh ("sąlyga") = koduoti :: decode_utf8 ($ wh ("sąlyga"), $ koduoti :: FB_DEFAULT); $ wh ("hum") = koduoti :: decode_utf8 ($ wh ("hum") "), $ Koduoti :: FB_DEFAULT); $ wh (" vėjas ") = koduoti :: decode_utf8 ($ wh (" vėjas "), $ koduoti :: FB_DEFAULT); if ($ wh (" temp ")< 0) { $mod = "ниже нуля"; } if($wh{"temp"} >0) ($ mod = "virš nulio";) $ wh ("vėjas") = ~ s /: В, / rytai /; $ wh ("vėjas") = ~ s /: З, / vakarų /; $ wh ("vėjas") = ~ s /: S, / pietų /; $ wh ("vėjas") = ~ s /: С, / šiaurė /; $ wh ("vėjas") = ~ s /: ŠV, / šiaurės rytai /; $ wh ("vėjas") = ~ s /: ŠV, / šiaurės vakarai /; $ wh ("vėjas") = ~ s /: SE, / pietryčiai /; $ wh ("vėjas") = ~ s /: SW, / pietvakariai /; sayText ("Dabar $ wh (" sąlyga "), $ wh (" temp ") laipsniai $ mod. $ wh (" hum "). $ wh (" vėjas ")"); if ($ wh ("temp")<= 18) { $addit = sayText("Одевайтесь теплее, на улице холодно!"); } if ($wh{"temp"} >= 28) ($ addit = sayText ("Nešiojamasis oro kondicionierius nepakenks!");))) #SayText ("Jūsų komanda yra $ tekstas"); grąžinti; )
Per keturias sekundes pasirenkame paskutinę vykdytą komandą ir, jei ji sutampa su esama, išeiname iš funkcijos. Kaip matote, pridėjau keletą komandų, palyginti su funkcija, aprašyta paskutiniame straipsnyje. Įdomiausias oras. Žemiau pateikiamas jo duomenų gavimo įgyvendinimas.

Modulis HTTP.pm

Grįžkime prie integruoto HTTP serverio diegimo. Sukurkime failą HTTP.pm kataloge lib... Parašykime ten tokį kodą:

Paketo lib :: HTTP; naudoti HTTP :: Serveris :: Paprastas :: CGI; naudoti LWP :: UserAgent; naudoti URI :: Escape; naudoti bazinį qw (HTTP :: Serveris :: Paprastas :: CGI); naudoti šabloną; ####################################### ######### # ############################### mūsų% išsiuntimas = ("/" => \ & goIndex, "/ index" = > \ & goIndex, "/ cameras" => \ & goCamers,); mūsų $ tt = Šablonas-> naujas (); ####################################### ######### # ############################## sub hand_request (mano $ self = pamainos; mano $ cgi = pamainos; mano $ kelias = $ cgi-> path_info (); mano $ tvarkytoja = $ dispatch ($ kelias); if ($ kelias = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf) ) )) (mano $ url = 1 $; spausdinkite "HTTP / 1.0 200 OK \ n"; spausdinkite "Turinio tipas: tekstas / css \ r \ n \ n", jei $ url = ~ / css /; spausdinkite "Turinys- Tipas: vaizdas / jpeg \ r \ n \ n "jei $ url = ~ / jpg /; spausdinti" Turinio tipas: vaizdas / png \ r \ n \ n "jei $ url = ~ / png /; spausdinti" Turinys- Tipas: vaizdas / gif \ r \ n \ n "jei $ url = ~ / gif /; spausdinti" Turinio tipas: tekstas / xml \ r \ n \ n "jei $ url = ~ / xml /; spausdinti" Turinys- Tipas: application / x-shockwave-flash \ r \ n \ n "if $ url = ~ / swf /; atidaryti (DTA,"<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $ line (@dtast) (print $ line;) close (DTA); grąžinti; ) if (ref ($ handler) eq "CODE") (spausdinti "HTTP / 1.0 200 OK \ r \ n"; $ handler -> ($ cgi);) else (spausdinti "HTTP / 1.0 404 Nerasta \ r \" n "; spausdinkite $ cgi-> antraštę, $ cgi-> start_html (" Nerasta "), $ cgi-> h1 (" Nerasta "), $ cgi-> h2 ($ cgi-> path_info ()); $ cgi-> end_html;)) ## Apdorojama užklausa / ##################################### # # sub goIndex (mano $ cgi = poslinkis; # CGI.pm objektas grąžinamas, jei! ref $ cgi; mano% w = checkWeather (); mano $ cmd; mano $ dbh = iON :: dbConnect ($ iON :: cfg ( " dbName"), $ iON :: cfg ("dbUser"), $ iON :: cfg ("dbPass")); mano $ sth = $ dbh-> paruošti ("SELECT cmd FROM komandoslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1 "); $ sth-> vykdyti (); mano $ rezultatas = $ sth-> fetchrow_hashref (); if ($ rezultatas -> (cmd) ne" ") ($ cmd = $ rezultatas -> ( cmd );) else ($ cmd = "Jokių komandų...";) spausdinti "Turinio tipas: tekstas / html; simbolių rinkinys = UTF-8 \ n \ n"; mano $ veiksnumo laikas = "veikimo laikas"; $ veikimo laikas = ~ / aukštyn (. *?), /; $ veiksnumo laikas = 1 USD; mano $ videosys = `ps aux | grep motion`; if ($ videosys = ~ / motion -c /) ($ videosys = darbai";) else ($ videosys =" neveikia";) mano $ micsys =` ps aux | grep mic`; if ($ micsys = ~ / perl mic \ .pl /) ($ micsys = " darbai";) else ($ micsys = neveikia";) mano $ vars = (whIcon => $ w (" piktograma "), whCond => $ w (" sąlyga "), whTemp => $ w (" temp "), whHum => $ w (" hum " ), whWind => $ w ("vėjas"), cmd => $ cmd, veiksnumo laikas => $ veikimo laikas, vaizdo įrašas => $ videosys, mikrofonas => $ micsys, gijos => $ iON :: cfg ("micThreads") ,); mano $ išvestis; $ tt-> procesas ("html / indeksas", $ vars, $ išvestis) || spausdinti $ tt-> klaida (), "\ n";) ## Apdorojama užklausa / kameros ## ###################################### sub goCamers (mano $ cgi = Shift; # CGI. pm objektas grąžinamas if! ref $ cgi; mano% w = checkWeather (); mano $ cmd; mano $ dbh = iON :: dbConnect ($ iON :: cfg ("dbName"), $ iON :: cfg ("dbUser" ), $ iON :: cfg ("dbPass")); mano $ sth = $ dbh-> paruošti ("SELECT cmd FROM komandoslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1"); $ sth-> vykdyti ( ); mano $ rezultatas = $ sth-> fetchrow_hashref (); if ($ rezultatas -> (cmd) ne "") ($ cmd = $ rezultatas -> (cmd);) else ($ cmd = "Jokių komandų .. . ";) if ($ cgi-> param (" text ") ne" ") (mano $ txt = $ cgi-> param (" tekstas "); reikalauti koduoti; $ txt = koduoti :: decode_utf8 ($ txt, $ Koduoti :: FB_DEFAULT); iON :: sayText ( $ txt); ) spausdinti "Turinio tipas: tekstas / html; simbolių rinkinys = UTF-8 \ n \ n"; mano $ vars = (camera1 => "video-0 / camera.jpg", camera2 => "video-1 / camera.jpg", camera3 => "video-2 / camera.jpg", camera4 => "video- 3 / camera.jpg ", whIcon => $ w (" piktograma "), whCond => $ w (" sąlyga "), whTemp => $ w (" temp "), whHum => $ w (" hum ") , whWind => $ w ("vėjas"), cmd => $ cmd,); mano $ išvestis; $ tt-> procesas ("html / kameros", $ vars, $ išvestis) || spausdinti $ tt-> klaida (), "\ n"; ) ## Orai ####################################### sub checkWeather (mano% wh ; mano $ ua = LWP :: UserAgent-> naujas (agentas => "Mozilla / 5.0 (Windows NT 5.1; ru-RU) AppleWebKit / 535.2 (KHTML, kaip Gecko) Chrome / 15.0.872.0 Safari / 535.2"); mano $ turinys = $ ua-> gauti ("http://www.google.com/ig/api?hl=ru&weather=" .uri_escape ("Sankt Peterburgas")); $ turinys-> turinys = ~ / (.*?)<\/current_conditions>/ g; mano $ cond = 1 $; $ cond = ~ /

Pažvelkime į turinį atidžiau. Maišoje % išsiuntimo nustatome url ir iškviestos funkcijos atitikimą. Visi kiti šioje maišoje neaprašyti URL grąžins puslapį 404 .
Mūsų šablonų variklis bus galinga ir lanksti biblioteka. Šablonų įrankių rinkinys... Mes inicijuojame jį eilute:

Mūsų $ tt = Šablonas-> naujas ();
Funkcijos perkrovimas hand_request () pirminė klasė, mes valdome HTTP serverio užklausų apdorojimą. Norint pateikti naršyklei statinį turinį (png, gif, jpg, css, xml, swf), naudojamas šis blokas:

If ($ kelias = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf)))) (mano $ url = 1 USD; spausdinkite "HTTP / 1.0 200 OK \ n " ; spausdinkite "Turinio tipas: tekstas / css \ r \ n \ n", jei $ url = ~ / css /; spausdinkite "Turinio tipas: vaizdas / jpeg \ r \ n \ n", jei $ url = ~ / jpg / ; spausdinkite "Turinio tipas: vaizdas / png \ r \ n \ n", jei $ url = ~ / png /; spausdinkite "Turinio tipas: vaizdas / gif \ r \ n \ n", jei $ url = ~ / gif / ; spausdinkite "Content-Type: text / xml \ r \ n \ n", jei $ url = ~ / xml /; spausdinkite "Turinio tipas: programa / x-shockwave-flash \ r \ n \ n", jei $ url = ~ / swf /; atidaryti (DTA, "<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $ line (@dtast) (print $ line;) close (DTA); grąžinti; )
Kadangi aš neturėjau daug MIME tipų, aš juos šiek tiek užsirašiau hindu kalba;)
Toliau ateina funkcijos, atsakingos už konkretaus URL turinio generavimą. Kol kas jų yra tik du – rodyklė ir puslapis su kameromis.
Rodyklėje matome, ar veikia tokios posistemės kaip vaizdo ir garso įrašymas. Atskira eilutė eina:

Mano% w = checkWeather ();
Ši funkcija grąžina maišą su dabartiniais miesto orų duomenimis, kurie bus rodomi mūsų puslapyje. Tokia maža graži bandelė ;)
Toje pačioje vietoje šalia rodysime paskutinę gautą ir atpažintą komandą „išmaniesiems namams“.

Kita funkcija goCamers () atlieka tas pačias funkcijas kaip ir indeksas, tik vietoj informacijos apie posistemių būseną atvaizdavimo rodo vaizdą iš mūsų kamerų ir galima rašyti bet kokį tekstą, kurį susintetins ir įgarsins mūsų „protingas namas“.

Visi puslapiai sukurti pagal aplanke esančius šablonus html... Čia nebus patogu skelbti sąrašą, todėl duosiu nuorodą į archyvą -

Habré yra daug straipsnių apie išmaniųjų namų projektus, tačiau beveik visi jie buvo apie naminę įrangą ir kiniškus įtaisus. Savo straipsnyje norėjau pakalbėti apie kitą požiūrį, kuris parodo, kaip daug lengviau vykdyti projektus naudojant jau paruoštus pasaulinių gamintojų sprendimus ( ir atrodo solidžiau), taip pat parodo galimybę naudoti įrangą ne tik pramoniniuose objektuose, bet ir privačioje sferoje. Rezultatas – technologijų ir automatizavimo sričių simbiozė. Viena vertus, naudojant PLC, kuris daugiausia skirtas pramonės poreikiams, leidžiantis atlikti bet kokio sudėtingumo užduotis be griežtų paruoštų išmaniųjų namų įrenginių algoritmų apribojimų (pavyzdžiui, naudojant KNX technologiją) su susiejimas su html / javascript žiniatinklio technologija suteikia neribotą fantazijų skrydį plečiant projektus ...

Einamosios išlaidos - 170 tūkstančių rublių (senuoju euro kursu).

Pradėkime.

Ką aš turiu galvoje

Tvarkome apšvietimą ir elektros tiekimą
- Iš esmės valdymas bus atliekamas įjungimo / išjungimo signalu, nenoriu ir nenoriu pritemdyti;
- Noriu valdyti iš įvairių vietų, pavyzdžiui, įėjau į miegamąjį - įjungė šviestuvą, atsigulė į lovą - paspaudė, kad išjungtų sietyną. Jei pamiršo išjungti šviesą prieškambaryje (ar tualete ...), jis paspaudė mygtuką „išjungti šviesą visur“. Patogus;
- Išeidamas iš buto paspaudžiu vieną mygtuką - visame bute išjungiamos šviesos ir pan.;
- Nuskaityti elektros skaitiklio rodmenis;
- Nepertraukiamas buto valdymo ir apsaugos sistemų maitinimas;
- Be išimties visos apšvietimo grupės turi būti valdomos PLC. Kilus gaisrui, išvadų grupės turi būti atjungtos nuo mašinoje esančio PLC - avarijos atveju išjunkite maitinimą bute;
- Kiekviena apšvietimo grupė turi ateiti prie skirstomojo skydo ir pereiti per artimiausią jungiklį, kad būtų galima perprojektuoti apšvietimo valdymą į įprastą schemą (jei parduosiu butą, viską paimsiu);
- Koridoriuje įrengti žmogaus judesio jutiklį, kuris valdytų apšvietimą + pririštas prie signalizacijos;
- Šiltos grindys balkone, tualete, vonioje, koridoriuje - su galimybe reguliuoti priklausomai nuo lauko temperatūros, pagal laiką.

Mes kontroliuojame šildymą ir vėdinimą
- Šildymo valdymas - ant kiekvieno akumuliatoriaus sumontuotas vožtuvas su pavara (temperatūrai reguliuoti pagal patalpą, patalpos temperatūrai matuoti būtina numatyti temperatūros jutiklius);
- Numatyti oro kondicionierių valdymą infraraudonųjų spindulių kanalu (dabartinis problemos sprendimas dar nerastas, susuktą porą atnešime į vidinį kondeya bloką, galvosiu toliau);
- Lauko temperatūros davikliai (saulėtoje ir ne saulėtoje pusėje);
– Žiemą gana dažnos dvi problemos – šalta ir nėra kuo kvėpuoti. Išeitis – įrengti tiekimo sistemą. Toliau užtikrinti tiekimo sistemos valdymą (temperatūra kanale, lauko temperatūros jutiklis, trys šildymo pakopos, ventiliatorius);
- Išmetimo ventiliatorių valdymas (vonios kambarys, vonia).

Apsaugos signalizacija
Įėjimo durų būklės signalizavimas (durų būklės archyvavimas – atidarymo/uždarymo laikas);
Apsaugos įjungimas naudojant žiniatinklio sąsają arba šviesos valdymo jungiklį.

CCTV
Priekinių durų kameros įrašymas, stovėjimo vieta gatvėje;
Įrašų archyvavimas nuotoliniame serveryje.

Įranga

Kadangi jau esu pripratęs prie ABB PLC, buto valdymo sistemos smegenys buvo pasirinktas AC500-eco PLC (PM554-ETH CPU su Ethernet palaikymu);
– Tada pradėjau skaičiuoti pinigus ir... turėjau pasirinkti informacijos rodymo aplinką, su galimybe internete rodyti informaciją apie namą. Variantų yra daug, bet iš esmės viskas paremta ne tarpplatforminiais sprendimais, kas man netinka. Viskas su žodžiais SCADA ir WEB turėjo nepaprastai didelę kainą. Teko šiek tiek išsigąsti, dėl to buvo nuspręsta naudoti ne SCADA sistemą, o puikų funkcionalumą turintį karkasą HTML5. Atėjo į CSWorks. Ši sistema leidžia ja naudotis nemokamai, ne daugiau kaip 999 kintamieji, 1 klientas. Kas man visiškai tiko.
- JUNG, Serie A buvo pasirinkta kaip jungikliai ir lizdai (šviesos valdymas). Iš privalumų - jie gali turėti iki 4 mygtukų vienam mygtuko stulpeliui (jungiklis be užrakto), jie taip pat turi indikacinius šviesos diodus, kurių įtampa yra 24 V (ši įtampa yra standartinė pramoninė įtampa automatikos sistemų maitinimui). Šių funkcijų nematė nė vienas elektros instaliacijos gamintojas (neskaitant Kinijos);

Darbo pradžia

1. Laidų apšvietimo būdas. Kiekviena grupė ateina tiesiai į maitinimo spintą. Spintoje yra valdymo kontaktoriai ir relės. Relės ir kontaktoriaus ritės valdomos PLC signalais (DC24V). Valdymo dubliavimui naudoju kontaktorius su rankiniu valdymu. Maitinimo laidas buvo atliktas per jungiklio kaušelį, kad būtų galima perjungti laidus į įprastą grandinę.

Pats rankinis kontaktorius:

Spintelė surenkama ir montuojama:

Kaip jau rašiau aukščiau, jungiklius pasirinkau be fiksavimo su led indikatoriais. Daugiausia 4 mygtukai, šiuos mygtukus galima priskirti 8 grupėms (žr. JUNG 4248TSM dokumentaciją.



Kitose dalyse apie projekto įgyvendinimą bus kalbama plačiau.

Aplenkdamas save, rodau jums žiniatinklio sąsajos ekrano kopijas:



Šis įrašas buvo paskelbtas Uncategorized autoriaus. Skirtukas.