Dizajn i integracija sučelja pametne kuće. Mobilna kontrola

To je skriptirani sistem za kontrolu doma. Omogućava vam da objesite proizvoljnu logiku (skripte) na različite događaje u kući (okidanje senzora, pritiskanje dugmadi, događaji sa vanjskih servisa, na primjer, primanje e-pošte ili poruka na twitteru). Sistem ima modularnu arhitekturu, sve funkcionalnosti su u dodacima. Ako trebate dodati novi tip događaja ili nove "home API" komande, samo trebate dodati dodatak za to.

Prvo izdanje smo imali u februaru. Prva verzija je uključivala okvir za kućna automatizacija: sistem dodataka i infrastrukture za njih (tako da dodaci mogu opisati svoj API i događaje, kao i koristiti API i pretplatiti se na događaje jedni drugih). Sada dolazi izdanje druge verzije, čija je glavna karakteristika novi web interfejs.

UI je sada modularna aplikacija na jednoj stranici. Dodaci mogu opisati svoje korisničko sučelje kao html / js / css datoteke koje se nalaze u DLL resursima. UI na strani klijenta je baziran na backbone.js i marionette.js, moduli se učitavaju preko require.js. Općenito, pokazalo se prilično zgodnim za autore dodataka - čak i bez dubokog poznavanja java skripte, možete, gledajući primjere, opisati punopravni korisnički interfejs koji će se automatski povezati s sučeljem kućne kontrole.


Interfejs kućne kontrole sastoji se od "sekcija", svaki plug-in može sadržavati nekoliko sekcija (i može sadržavati samo jedan ili ne mora uopće imati interfejs). Sekcije su podijeljene u 2 grupe: sistem ( razne postavke, na primjer, odjeljak kućnih skripti) i korisnički definirani (odjeljci u kojima korisnici rade Svakodnevni život npr. "vremenska prognoza" i "alarmi").

Postoji i posebna stranica - "desktop" (aka "početna stranica"). Postoje "elementi početne stranice" - mali paneli koji se prikazuju korisne informacije, a kada kliknete na njih, otvara se stranica ili se izvršava radnja.

početna stranica

odjeljak sa alarmima (in pravo vrijemeće puštati muziku ili započeti izvršavanje skripte)

odjeljak sa vremenskom prognozom (preuzeto sa interneta)

uređivač skripte (na snimku ekrana, skripta koja slika posjetitelje koji pritiskaju tipku za zvono na vratima)

stranica za pretplatu na događaje: prva padajuća lista - događaji u sistemu (opisani su u dodacima), druga lista - skripte

Interfejs se prilagođava malim ekranima mobilnih uređaja.

početna stranica na malom ekranu

stranica o vremenu na malom ekranu

Sada, kao što sam već napisao, sistem se ubrzano približava izdanju 2. verzije, izvorni kod je na githubu. Još uvijek postoji prilika da se nešto promijeni. Zaista bih volio da dobijem konstruktivne kritike i sugestije za poboljšanje (a ako neko pošalje pull request, bit ću sretan).

Ako neko želi da proba uživo, kako sve funkcioniše, neka mi napiše privatnu poruku - napraviću vam novu distribuciju.

PS.
Inače, svaki dan sam pokušavao da radim na ovom projektu i dao je fantastične rezultate. Sada je 8. nedelja rada u ovom režimu (najduži niz 49 dana). Za to vrijeme, projekat je napredovao više nego u prethodnih šest mjeseci. Veoma sam zadovoljan rezultatom i planiram da nastavim da radim u ovom režimu koliko god je to moguće.

Ponovo sam, lutajući internetom u potrazi za web interfejsom za upravljanje električnim uređajima po X10 protokolu, prirodno završio na sajtu kompanije Melloware. Kao podršku svom X10 hardveru, kompanija nudi (besplatan) softverski proizvod pod nazivom X10 komandant ... Ovo je server instaliran na Windows računaru na koji je povezan USB X10 kontroler kao što je CM15 ili sličan. Svi uređaji dostupni u kući X10, njihove adrese i tipovi, registrovani su na serveru. X10 Commander vam omogućava da kontrolišete opisane uređaje direktno sa računara na kome je instaliran ili daljinski, putem HTTP (GET) zahteva kao npr.(ovo je, konkretno, naredba za uključivanje uređaja na A1) Osim toga, ista kompanija (već za malo novca) nudi programe instalirane na iOS/Android tabletu ili telefonu, koji rade preko istog servera i omogućavaju vam za vrlo udobno upravljanje X10 uređajima.

Moja ideja je bila sljedeća. Na kompjuteru koji imam kod kuće, djeluje kao kućni medijski server, ljulja torrent, Skype itd. itd. Instaliram Web i FTP servere, X10 commander i povezujem CM15 kontroler. Nacrtamo web stranicu i objavljujemo je preko web servera u LAN-u, a po želji prosljeđujemo na globalnu mrežu na potpuno daljinsko upravljanje. (Usput, kasnije sam instalirao HomeSapiens server na ovaj računar, a kao rezultat dobio sam i glasovnu kontrolu.

Da bih implementirao ovu ideju, morao sam malo pročitati gugl i raditi glavom i olovkama. U okviru ovog članka neću opisivati ​​kako se web server instalira i kako radi (Google i pametne knjige će vam pomoći). Podijelit ću da sam direktno guglao u svrhu kontrole X10 preko CM15 kontrolera i korištenja X10 Commandera.
Možete saznati više o sintaksi X10commander. Preuzimanje ActiveHomePro SDK paketa sa x10 web stranice proizvođača također neće biti suvišno, postoji detaljan opis protokola razmjene sa CM15, iako su glavni izvodi ovdje (dio opisa koji je preveo Google):

Pogledajmo sintaksu .... http: // localhost: 8086 = server i port gdje radi X10 Commander? x10command = signalizacijski parametar koju naredbu želite izvršiti UREĐAJ ~ ~ sendplc "A1 OFF" odvojeno tildom u prvo uvijek uređaj, a zatim sendplc / sendrf u zavisnosti od toga da li želite električne vodove ili radio frekvenciju(RS i dalje radi sa naredbom queryplc - statusni upit)a zatim "A1 OFF" u navodnicima, kodu uređaja i kuće i naredbi. par primjera....

// Uključite A1
http: // localhost: 8086 /? x10command = DEVICE ~ sendplc ~ "A1 ON"
// Povećajte svjetlinu A1 za 50%
http: // localhost: 8086 /? x10command = DEVICE ~ sendplc ~ "A1 BRIGHT 50"
// Dim A1 do 30%

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

Na forumima Melloware u odjeljku Web Interface To X10 Commander pronašao sam vrlo zanimljiv primjer u Javascriptu koji vam omogućava da kreirate pogodno polje dugmadi na stranici, klikom na koje možete upravljati svojim uređajima putem X10 protokola putem X10commander server. Evo nečega što ne biste dugo tražili. Oni koji to žele da ponove, prilagođavaju je parametrima svog doma tako što će registrovati odgovarajuće nazive adresa i komandi, navodeći adresu servera, login i lozinku koji su postavljeni na X10 Commander. Zatim ubacite ovu skriptu u svoju HTML stranicu ... i to je to! Bićete srećni :-)

Takođe sam odlučio da pokušam da napravim sopstvenu stranicu koristeći ovu skriptu. Pošto nisam programer i upoznat sam sa HTML-om na nivou čajnika, obavezao sam se da napravim stranicu koristeći neku vrstu web buildera. Naišao sam na program za brzo kreiranje sajtova WebSite X5, izabrao šablon za izgled sajta, konfigurisao meni, ubacio sliku i skriptu prilagođenu mojim postavkama. i ispalo je nesto ovako:

Tada sam poželio da organizujem interaktivnu kontrolu kako bi sajt mogao da vidi šta kontrolišem i u kakvom su stanju lampe u prostoriji sad. Kopanje po sintaksi razmjene sa serveromX10 Commander i HTML jezik, u istom programu, nisam kreirao stranice koje su mi bile potrebne sa odgovarajućim izgled i ubacio mali kod u njih sa olovkama da formira zahteve serveruX10 Commander. (Zaista se kaže – Blago teškoćama! Uz njih rastemo!)

Evo šta se dogodilo kao rezultat:




Klikom na sliku mijenja se stanje lampi u prostoriji, a samim tim i na slici.

Tako je cilj postignut bukvalno za 3-4 večeri gustog sjedenja za kompjuterom.

Iako je vrijedno napomenuti da uprkos činjenici da je upravljački interfejs na web stranici vrlo jednostavan i intuitivan, ja ga jedini koristim. Domaćinstva radije, iz navike, okreću prekidače. Čini se da bi ova usluga bila tražena na mjestu prekidača, koji nit bi trebao okačiti tablet sa učitanom kontrolnom stranicom za ovu konkretnu sobu. Ali ni ova usluga se ne može nazvati beskorisnom! Sjedim za kompjuterom, kako se kaže, bez podizanja tačke oslonca udobna stolica, uključiti / isključiti moje gornje svjetlo kada je potrebno. I naravno mogu kontrolirati svoje električne uređaje putem interneta kada se ukaže potreba. (ako bude, naravno :-))

B-Tune® sistem kontroliše BT-4000/6000 kontroler, koji je mini WEB server koji se kontroliše preko pretraživača mobilni telefon, računar, tablet kao što je iPad ili netbook. BT-4000/6000 u različitim modifikacijama može raditi u mrežama: Ethernet, GSM, ADSL i WiMax (preko USB modemi), što vam omogućava da optimizirate troškove komunikacije.

BT-4000/6000 se može povezati na brojila energije, ožičene i bežični senzori, klima uredjaji, Aparati..., kontrolišu i upravljaju njima.

Kontroler radi pod Linuxom, što vam omogućava korištenje velikog broja programa i protokola. Konkretno, moguće je organizirati komunikaciju bez potrebe za dodjelom fiksne IP adrese za svakog pretplatnika. Postoji i mogućnost korištenja ovu odluku za: kućno računovodstvo resursa (ASKUE), obračun radnog vremena zaposlenih, praćenje vremena itd.

Rešenja zasnovana na BT-4000/6000 su potpuno opremljeni Smart Home sistemi koji vam omogućavaju da kontrolišete i upravljate svim parametrima vlasništva kuće koristeći pogodan i intuitivan grafički interfejs. Upravljanje se može vršiti i iz unutrašnjosti kuće (obično preko unutrašnjeg WiFi mreža), a izvana - putem interneta, koristeći server telekom operatera. Istovremeno, cijena osnovnog pretplatničkog seta Sistema neće premašiti cijenu budžet GSM alarm.

Lokalna kontrola doma (iz unutrašnjosti kuće)

Na sl. 1 prikazuje tlocrt tipičnog stana sa instaliranim B-Tune® sistemom. Kako bi se osigurale sigurnosne funkcije: na nekim vratima ugrađeni su senzori otvaranja, kao i infracrveni senzori koji kontroliraju kretanje u hodniku i dnevnoj sobi. Da bi se zaštitili od curenja, u kupatilu i toaletu su ugrađeni senzori za curenje vode. U kuhinji je ugrađen detektor dima. Za daljinski upravljač iza stana u hodniku i u dječjoj sobi su postavljene video kamere sa kojih se "slika" prenosi na kompjuter ili PDA vlasnika stana, na bilo koji način povezan na internet. Temperaturni senzori se koriste za praćenje unutrašnjih i vanjskih temperatura.

U električnu ploču ugrađeni su alarmna sirena, blok kontrolisanih releja za daljinsko uključivanje i isključivanje opterećenja i brojilo električne energije. Ovi uređaji su povezani na sistemski kontroler. Vlasnik stana može stalno pratiti ukupnu i trenutnu potrošnju energije. Na primjer, vlasnik stana može lako provjeriti da li je ostavio uključenu peglu daska za peglanje: to je tako ako je potrošnja (podaci sa električnog brojila) 1-2 kW. Međutim, ako je odgovarajuća grupa utičnica spojena na kontrolirani relej, tada se lijevo željezo može isključiti isključivanjem releja. U zoni ulazna vrata van vidnog polja, iButton® kontrolna tabla je takođe instalirana za aktiviranje i deaktiviranje stana.

Sistem instaliran u tipičan stan

Dok se nalazi unutar kuće, pretplatnik će sa svog računara, PDA, laptopa ili tableta, koristeći WEB pretraživač, moći:

  • Kontrolišite svetlo
  • Kontrolišite otvaranje zavesa i roletni
  • Pratite status senzora (temperatura, vlažnost, dim, AC napon, kretanje, itd.)
  • Upravljajte klima uređajima, TV i audio opremom
  • Pogledajte "slike" sa video kamera
  • Koristite telemedicinske usluge udaljenog medicinskog centra (ako je dostupna dodatna oprema)

Prije korištenja pretplatnik lokalno (iz stana) mora konfigurirati Sistem preko Ethernet mreže koristeći WEB pretraživač. Rad preko grafičkog i jednostavnog interfejsa liči na igru ​​sa modernim "gadžetima", a za podešavanje nije potrebno čitati opis i slati "šifrovani SMS". Da biste konfigurisali, potrebno je da povežete računar sa kontrolerom direktno ili preko Ethernet čvorišta. U prisustvu eksternog Wifi ruter kontroler se može konfigurisati sa mobilnog telefona, PDA, tableta ili laptopa. (Za ispravan rad, moderan pretraživač koji podržava WEB 2.0 tehnologiju mora biti instaliran na kontrolnom uređaju).

Konfiguracija se sastoji od sljedećih koraka koje pretplatnik može samostalno izvršiti:

  • Nacrtajte i otpremite plan kuće (opcionalno)
  • Povežite senzore (tip nekih senzora automatski određuje kontroler)
  • Postavite senzore na plan
  • Podesite parametre po kojima će kontroler slati alarmne poruke (SMS, Poziv...) ili izvršiti određene radnje (upaliti svjetlo, zatvoriti zavjese...)

Daljinsko upravljanje sa bilo koje tačke na Internetu preko "Licnog naloga" operatera

Za daljinski pristup kontroleru koristi se namenski Internet server (u daljem tekstu Server) na strani operatera, koji ima simbolično ime i statičku IP adresu.

Kontroler, nakon povezivanja na Internet na bilo koji način, automatski otvara sigurnu VPN vezu sa serverom. Server periodično provjerava dostupnost kontrolora i obavještava pretplatnika u slučaju gubitka komunikacije s njim (E-mail, SMS, poziv).

Za komunikaciju sa kontrolorom, pretplatnik povezan na Internet moraće da se poveže sa serverom i unese svoje podatke za ulazak u „lični nalog“ operatera. Server autentifikuje Pretplatnika i proverava da li je komunikacioni kanal sa njegovim Kontrolorom otvoren. Ako je komunikacioni kanal otvoren, tada server šalje podatke između pretplatnika i kontrolora. Kroz interfejs " lični račun»Pretplatnik ima pristup:

  • WEB sučelje za upravljanje "Smart Home", slično lokalnom sučelju
  • Dnevnik događaja
  • Grafikoni promjena temperature, vlažnosti itd.
  • Programiranje događaja kada server treba da šalje SMS / Mail / Skype / ICQ poruke
  • Fotografije ili video zapisi snimljeni od strane kontrolora i postavljeni na server

U hitnim slučajevima, kontrolor će pretplatniku poslati SMS. Za kontrolu najvažnijih funkcija može biti potrebno implementirati obradu naredbi primljenih u SMS porukama.

Praćenje i grupno upravljanje pomoću "grupnog kabineta" operatera

Posebno treba napomenuti da se server može koristiti za organizovanje sistema za praćenje vikend naselja i stambene zgrade... U tom slučaju, dispečeru/operateru grupe će biti potreban "grupni kabinet" preko kojeg je dostupno sljedeće:

  • Baza podataka sa očitanjima vrijednosti mjerača energije.
  • Baza podataka o specifičnim događajima na strani pretplatnika (na primjer, otvaranje šaltera ili otvaranje vrata u naoružanom načinu rada)
  • Grafička karta - sa vezanjem kontrolora za geografsku lokaciju objekata ( radno mjesto dispečer).
  • Grupna promjena softvera na uređajima
  • Dodatne funkcije... Na primjer, funkcija praćenja potrošnje električne energije uživo: svakih 15 minuta, zbroj očitavanja svih stan metara se upoređuje sa očitavanjem kolačića (ukupnog) brojača. Prilikom otkrivanja odstupanja većeg od unaprijed određenog praga, izdaje se signal za ispitivanje mjesta radi neovlaštenog odabira električne energije.

Server takođe pruža funkciju integracije (API interfejs) sa uslugama treće strane. Na primjer, pružatelji telemedicine, sigurnosne agencije itd.

Bili smo u mogućnosti da naučimo naš sistem pametne kuće da prepozna ono što smo rekli i sintetizuje glasovne odgovore koristeći Google.
Danas želim da vam kažem kako da organizujete pristup našem sistemu preko web interfejsa.

Tehnologije

Kao što se sjećate, softver za upravljanje našim " pametna kuća»Pišemo na jeziku perl... Moderna Informacioni sistem praktički nezamislivo bez baze podataka. Ni mi nećemo stajati po strani i koristićemo DBMS za skladištenje naših podataka. MySQL... Za implementaciju web servera, odlučio sam da koristim ne softver treće strane, već modul za perl - HTTP :: Server :: Jednostavan, posebno - HTTP :: Server :: Simple :: CGI... Zašto sam to uradio? Uglavnom, radi zabave;) Ali u teoriji, možete dobiti pristup niskom nivou obrade HTTP zahtjeva/odgovora bez zatrpavanja kompleksa Apache/mod_perl. Generalno, ništa vas ne sprečava da prebacite projekat na Apache rails, ako imate želju i dovoljno vremena.

Baza podataka

Prije svega, instalirat ćemo MySQL DBMS i kreirati bazu podataka sa tabelama iz db.sql. Evo popisa:

CREATE DATABASE ion; KORISTI ion; # # Struktura tabele za tabelu "kalendar" # ISPUSTI TABLU AKO POSTOJI kalendar; CREATE TABLE `calendar` (` id` int (15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL,` text message, `nexttimeplay` datetime NOT NULL,` expired` datetime NOT NULL, `type` int (1) ZADANO NULL, PRIMARNI KLJUČ (`id`)) ENGINE = MyISAM ZADANI KARSET = latin1; # # Struktura tabele za tabelu "commandslog" # ISPUSTI TABLU AKO POSTOJI commandslog; CREATE TABLE `commandslog` (` id` int (15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL,` cmd` varchar (255) NOT NULL, PRIMARY KEY (`id`)) ENGINE = MyISAM AUTO_INCREMENT CH = 1 DEFAULT = latin1; # # Struktura tabele za tabelu "log" # ISPUSTI TABLU AKO POSTOJI log; CREATE TABLE `log` (` id` int (15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL,` message` varchar (255) NOT NULL, `level` int (1) DEFAULT NULL, PRIMARNI KLJUČ (` id` )) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1;

Preduzmimo potrebne korake:

[email protected]: ~ $ sudo apt-get install mysql-server
[email protected]: ~ $ mysql -uroot -ppassword< db.sql

Izmjena koda

Sada treba da kreiramo foldere lib, html i config(pored foldera podaci). U folder lib stavićemo modul odgovoran za implementaciju web servera i rukovanje našim HTTP zahtjevima.

Moramo malo da doteramo scenario srv.pl... Dodajte u blok inicijalizacije:

Naš% cfg = readCfg ("common.cfg"); naš $ dbh = dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass"));
Dodajmo linije odgovorne za pokretanje HTTP servera ispod bloka inicijalizacije:

## Pokretanje HTTP servera ################################ my $ pid = lib :: HTTP-> new ( $ cfg ("httpPort")) -> background (); print "HTTP PID: $ pid \ n"; logSystem ("HTTP usluga - PID: $ pid, port: $ cfg (" httpPort "), host: $ cfg (" httpHost ")", 0); ################################
Sada dodajmo funkcije koje nedostaju na kraj datoteke:

Sub readCfg (moj $ fajl = shift; moj% cfg; otvori (CFG, " ; foreach my $ line (@cfg) (sljedeće ako $ line = ~ / ^ \ # /; if ($ line = ~ /(.*?) \ = \ "(. *?) \" \; /) (chomp $ 2; $ cfg ($ 1) = $ 2;)) zatvori (CFG); return% cfg; ) ####################################### sub dbConnect (moj ($ db, $ korisnik , $ pass) = @_; return $ dbh = DBI-> connect ("DBI: mysql: $ db", $ korisnik, $ pass) || die "Ne mogu se povezati na bazu podataka: $ DBI :: errstr"; ) ######################################## Sub logSystem (moj ($ tekst, $ nivo ) = @_; my% cfg = readCfg ("common.cfg"); dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass")); $ dbh-> do ("INSERT INTO log (datum, poruka, nivo) VRIJEDNOSTI (SADA ()," $ text ", $ level)");)

Kao što možete vidjeti iz naziva funkcija, dbConnect () je odgovoran za povezivanje s našim DBMS-om, logSystem () je za evidentiranje, readCfg () je za učitavanje konfiguracije. Hajde da se zadržimo na tome detaljnije. Konfiguracija je jednostavna tekstualna datoteka u konfiguracijskom direktoriju. U našem slučaju to se zove common.cfg... To izgleda otprilike ovako:

## Postavke daemonMode = "undef"; logSystem = "1"; logUser = "1"; dbName = "ion"; dbUser = "root"; dbPass = "lozinka"; camBroj = "4"; camMotionDetect = "1"; httpPort = "16100"; httpHost = "localhost"; telnetPort = "16000"; telnetHost = "localhost"; micThreads = "5";

Neki redovi u njemu će se koristiti kasnije. Za sada nas zanimaju samo redovi koji počinju prefiksom db... Kao što vidimo, ovo su postavke za povezivanje sa našom bazom podataka.

Sada ću govoriti o tome kako prevazići ponovljeno izvršavanje naredbe. Uredimo funkciju checkcmd ():

Sub checkcmd (moj $ text = shift; chomp $ text; $ text = ~ s / $ // g; print "+ OK - Dobio sam naredbu \" $ text \ "(Dužina:" .length ($ tekst). ") \ n "; if ($ text = ~ / system /) (################################### ############# my $ sth = $ dbh-> pripremi ("SELECT cmd FROM commandslog WHERE DATE_SUB (SADA (), INTERVAL 4 SECOND)<= date LIMIT 0, 1"); $sth->izvršiti (); moj $ rezultat = $ sth-> fetchrow_hashref (); if ($ rezultat -> (cmd) ne "") (return;) $ dbh-> do ("INSERT INTO commandslog (datum, cmd) VRIJEDNOSTI (SADA ()," $ text ")"); ################################################# if ( $ text = ~ / check /) (moj $ up = `uptime`; $ up = ~ / gore (. *?), /; sayText (" Vrijeme rada servera - $ 1. Glavni broj procesa - $ roditelj. ") ; ) if ($ text = ~ / vrijeme /) (moj $ gore = `vrijeme rada`; $ gore = ~ /(.*?) gore /; reciText (" Sada $ 1 ");) if ($ text = ~ / završi / || $ text = ~ / završi /) (sayText ("Odustajanje. Sve najbolje!"); sistem ("killall motion"); sistem ("rm ./data/*.flac && rm ./data/ * .wav "); sistem (" killall perl "); izlaz (0);) if ($ text = ~ / weather /) (moj ($ addit, $ mod); my% wh = lib :: HTTP :: checkWeather (); $ wh ("stanje") = Kodiranje :: decode_utf8 ($ wh ("stanje"), $ Kodiranje :: FB_DEFAULT); $ wh ("hum") = Kodiranje :: decode_utf8 ($ wh ("hum" "), $ Kodiranje :: FB_DEFAULT); $ wh (" vjetar ") = Kodiranje :: decode_utf8 ($ wh (" vjetar "), $ Kodiranje :: FB_DEFAULT); if ($ wh (" temp ")< 0) { $mod = "ниже нуля"; } if($wh{"temp"} >0) ($ mod = "iznad nule";) $ wh ("vjetar") = ~ s /: V, / istok /; $ wh ("vjetar") = ~ s /: Z, / zapadni /; $ wh ("vjetar") = ~ s /: S, / južno /; $ wh ("vjetar") = ~ s /: S, / sjever /; $ wh ("vjetar") = ~ s /: NE, / sjeveroistok /; $ wh ("vjetar") = ~ s /: NW, / sjeverozapadno /; $ wh ("vjetar") = ~ s /: SE, / jugoistok /; $ wh ("vjetar") = ~ s /: JZ, / jugozapadno /; sayText ("Sada $ wh (" stanje "), $ wh (" temp ") stepeni $ mod. $ wh (" hum "). $ wh (" vjetar ")"); if ($ wh ("temp")<= 18) { $addit = sayText("Одевайтесь теплее, на улице холодно!"); } if ($wh{"temp"} >= 28) ($ addit = sayText ("Prenosivi klima uređaj neće škoditi!");))) #SayText ("Vaša komanda je $text"); povratak; )
Odabiremo posljednju izvršenu naredbu u intervalu od četiri sekunde i ako se poklapa sa trenutnom, izlazimo iz funkcije. Kao što vidite, dodao sam neke komande u odnosu na funkciju opisanu u prošlom članku. Najzanimljivije je vrijeme. Implementacija prijema podataka za to je odmah ispod.

Modul HTTP.pm

Vratimo se implementaciji ugrađenog HTTP servera. Kreirajmo fajl HTTP.pm u imeniku lib... Napišimo tamo sljedeći kod:

Paket lib :: HTTP; koristiti HTTP :: Server :: Simple :: CGI; koristiti LWP :: UserAgent; koristiti URI :: Escape; koristiti bazu qw (HTTP :: Server :: Simple :: CGI); koristiti Template; ######################################## ######### # ############################### naš% dispatch = ("/" => \ & goIndex, "/ index" = > \ & goIndex, "/ camers" => \ & goCamers,); naš $ tt = Template-> new (); ######################################## ######### # ############################### sub handle_request (moj $ self = shift; moj $ cgi = shift; moj $ put = $ cgi-> path_info (); moj $ obrađivač = $ otprema ($ put); if ($ put = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf) ) )) (moj $ url = $ 1; ispisati "HTTP / 1.0 200 OK \ n"; ispisati "Content-Type: text / css \ r \ n \ n" ako je $ url = ~ / css /; ispisati "Content- Tip: image / jpeg \ r \ n \ n "if $ url = ~ / jpg /; print" Content-Type: image / png \ r \ n \ n "if $ url = ~ / png /; print" Content- Tip: image / gif \ r \ n \ n "if $ url = ~ / gif /; print" Content-Type: text / xml \ r \ n \ n "if $ url = ~ / xml /; print" Sadržaj- Tip: aplikacija / x-shockwave-flash \ r \ n \ n "ako $ url = ~ / swf /; otvori (DTA,"<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $ line (@dtast) (print $ line;) close (DTA); povratak; ) if (ref ($ handler) eq "CODE") (ispisati "HTTP / 1.0 200 OK \ r \ n"; $ handler -> ($ cgi);) else (ispisati "HTTP / 1.0 404 Nije pronađeno \ r \ n "; print $ cgi-> header, $ cgi-> start_html (" Nije pronađeno "), $ cgi-> h1 (" Nije pronađeno "), $ cgi-> h2 ($ cgi-> path_info ()); $ cgi-> end_html;)) ## Obrada zahtjeva / ##################################### # # sub goIndex (moj $ cgi = shift; # CGI.pm objekat vraća if! ref $ cgi; my% w = checkWeather (); moj $ cmd; moj $ dbh = iON :: dbConnect ($ iON :: cfg ( " dbName"), $ iON :: cfg ("dbUser"), $ iON :: cfg ("dbPass")); moj $ sth = $ dbh-> pripremi ("SELECT cmd FROM commandslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1 "); $ sth-> izvrši (); moj $ rezultat = $ sth-> fetchrow_hashref (); if ($ rezultat -> (cmd) ne" ") ($ cmd = $ rezultat -> ( cmd );) else ($ cmd = "Nema naredbi...";) print "Tip sadržaja: tekst / html; charset = UTF-8 \ n \ n"; moj $ uptime = `uptime`; $ vrijeme rada = ~ / gore (. *?), /; $ produženje rada = $ 1; moj $ videosys = `ps aux | grep motion`; if ($ videosys = ~ / motion -c /) ($ videosys =" radi";) ostalo ($ videosys =" ne radi";) moj $ micsys =` ps aux | grep mic`; if ($ micsys = ~ / perl mic \ .pl /) ($ micsys = " radi";) ostalo ($ micsys =" ne radi";) moj $ vars = (whIcon => $ w (" ikona "), whCond => $ w (" uslov "), whTemp => $ w (" temp "), whHum => $ w (" hum " ), whWind => $ w ("vjetar"), cmd => $ cmd, uptime => $ vrijeme rada, video => $ videosys, mic => $ micsys, threads => $ iON :: cfg ("micThreads") ,); moj $ output; $ tt-> proces ("html / index", $ vars, $ output) || print $ tt-> error (), "\ n";) ## Obrada zahtjeva / kamera ## ###################################### sub goCamers (moj $ cgi = shift; # CGI. pm object return if! ref $ cgi; my% w = checkWeather (); moj $ cmd; moj $ dbh = iON :: dbConnect ($ iON :: cfg ("dbName"), $ iON :: cfg ("dbUser" ), $ iON :: cfg ("dbPass")); moj $ sth = $ dbh-> pripremiti ("SELECT cmd FROM commandslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1"); $ sth-> execute ( ); moj $ rezultat = $ sth-> fetchrow_hashref (); if ($ rezultat -> (cmd) ne "") ($ cmd = $ rezultat -> (cmd);) else ($ cmd = "Nema naredbi .. . ";) if ($ cgi-> param (" tekst ") ne" ") (moj $ txt = $ cgi-> param (" tekst "); zahtijeva kodiranje; $ txt = Kodiranje :: decode_utf8 ($ txt, $ Encode :: FB_DEFAULT); iON :: sayText ( $ txt); ) print "Tip sadržaja: tekst / html; charset = UTF-8 \ n \ n"; moj $ vars = (camera1 => "video-0 / camera.jpg", camera2 => "video-1 / camera.jpg", camera3 => "video-2 / camera.jpg", camera4 => "video- 3 / camera.jpg ", whIcon => $ w (" ikona "), whCond => $ w (" stanje "), whTemp => $ w (" temp "), whHum => $ w (" hum ") , whWind => $ w ("vjetar"), cmd => $ cmd,); moj $ izlaz; $ tt-> proces ("html / kamera", $ vars, $ izlaz) || print $ tt-> greška (), "\ n"; ) ## Vrijeme ######################################## sub checkWeather (my% wh ; moj $ ua = LWP :: UserAgent-> novi (agent => "Mozilla / 5.0 (Windows NT 5.1; ru-RU) AppleWebKit / 535.2 (KHTML, kao Gecko) Chrome / 15.0.872.0 Safari / 535.2"); moj $ content = $ ua-> get ("http://www.google.com/ig/api?hl=ru&weather=" .uri_escape ("Sankt Peterburg")); $ content-> content = ~ / (.*?)<\/current_conditions>/ g; moj $ cond = $ 1; $ cond = ~ /

Pogledajmo detaljnije sadržaj. U hashu % otpreme određujemo korespondenciju između url-a i pozvane funkcije. Svi ostali URL-ovi koji nisu opisani u ovom hash-u će vratiti stranicu 404 .
Naš predložak će biti moćna i fleksibilna biblioteka. Predložak alata... Inicijaliziramo ga linijom:

Naš $ tt = Template-> new ();
Preopterećenje funkcije handle_request () roditeljska klasa, dobijamo kontrolu obrade zahteva prema HTTP serveru. Za posluživanje statičkog sadržaja pretraživaču (png, gif, jpg, css, xml, swf), koristi se sljedeći blok:

If ($ path = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf)))) (moj $ url = $ 1; ispiši "HTTP / 1.0 200 OK \ n " ; ispiši "Tip sadržaja: text / css \ r \ n \ n" ako je $ url = ~ / css /; ispiši "Tip sadržaja: slika / jpeg \ r \ n \ n" ako je $ url = ~ / jpg / ; ispiši "Tip sadržaja: slika / png \ r \ n \ n" ako je $ url = ~ / png /; ispiši "Tip sadržaja: slika / gif \ r \ n \ n" ako je $ url = ~ / gif / ; ispisati "Content-Type: text / xml \ r \ n \ n" ako je $ url = ~ / xml /; ispisati "Content-Type: application / x-shockwave-flash \ r \ n \ n" ako $ url = ~ / swf /; otvori (DTA, "<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach my $ line (@dtast) (print $ line;) close (DTA); povratak; )
Pošto nisam imao puno MIME tipova, malo sam ih zapisao na hindu;)
Zatim slijede funkcije odgovorne za generiranje sadržaja određenog URL-a. Za sada ih ima samo dva - indeks i stranica sa kamerama.
Na indeksu možemo vidjeti da li podsistemi kao što su video i audio snimanje rade. Poseban red ide:

Moj% w = checkWeather ();
Ova funkcija vraća hash sa trenutnim vremenskim podacima u gradu, koji će biti prikazani na našoj stranici. Tako mala lepa punđa ;)
Na istom mjestu pored nje prikazat ćemo posljednju primljenu i prepoznatu komandu za "pametni dom".

Sljedeća funkcija goCamers () obavlja iste funkcije kao i indeks, samo što umjesto prikaza informacija o stanju podsistema, prikazuje sliku sa naših kamera i moguće je napisati bilo koji tekst koji će sintetizirati i ozvučiti naš "pametni dom".

Sve stranice su napravljene na osnovu šablona u folderu html... Neće biti zgodno objaviti oglas ovdje, pa ću dati link do arhive -

Na Habré-u postoji mnogo članaka o projektima pametnih kuća, ali gotovo svi su bili o domaćoj opremi i kineskim napravama. U svom članku želio sam govoriti o još jednom pristupu koji pokazuje koliko je lakše izvoditi projekte koristeći gotova rješenja svjetskih proizvođača ( i izgleda solidnije), a također pokazuje mogućnost korištenja opreme ne samo u industrijskim objektima, već iu privatnoj sferi. Rezultat je simbioza tehnologija i područja automatizacije. S jedne strane, korištenjem PLC-a, koji je uglavnom dizajniran za potrebe industrije, koji vam omogućava da obavljate zadatke bilo koje složenosti bez ograničenja krutih algoritama gotovih pametnih kućnih uređaja (na primjer, korištenjem KNX tehnologije) sa povezivanje sa html/javascript web tehnologijom daje neograničen let fantazija za proširenje projekata...

Trenutni troškovi - 170 hiljada rubalja (po starom kursu evra).

Počnimo.

Šta imam na umu

Upravljamo rasvjetom i napajanjem
- Uglavnom, kontrola će se vršiti signalom za uključivanje/isključivanje, ne želim i ne želim zatamniti;
- Želim da kontrolišem sa različitih mesta, na primer, ušao sam u spavaću sobu - upalio luster, legao na krevet - pritisnuo da isključim luster. Ako je zaboravio ugasiti svjetlo u hodniku (ili u WC-u...), pritisnuo je dugme „ugasi svjetlo svuda“. Comfortable;
- Prilikom izlaska iz stana pritisnem jedno dugme - ugase se svjetla u cijelom stanu itd.;
- očitati očitanje sa brojila električne energije;
- Neprekidno napajanje stambenih kontrolnih i sigurnosnih sistema;
- Bez izuzetka, sve grupe rasvjete moraju biti kontrolirane od strane PLC-a. U slučaju požara, utičnice moraju biti isključene sa PLC-a u mašini - isključite napajanje u stanu u slučaju nužde;
- Svaka grupa rasvjete mora doći do centrale i proći kroz najbliži prekidač radi mogućnosti prerade upravljanja rasvjetom u uobičajenu šemu (ako prodam stan, uzeću sve);
- Obezbijediti ljudski senzor pokreta u hodniku za kontrolu rasvjete + vezan za protuprovalni alarm;
- Topli pod na balkonu, u toaletu, kupatilu, u hodniku - sa mogućnošću kontrole u zavisnosti od spoljne temperature, prema vremenu.

Kontrolišemo grijanje i ventilaciju
- Regulacija grijanja - na svaku bateriju je ugrađen ventil sa aktuatorom (za regulaciju temperature po prostoriji, za mjerenje sobne temperature potrebno je obezbijediti temperaturne senzore);
- Omogućiti kontrolu klima uređaja preko infracrvenog kanala (trenutno rješenje problema još nije pronađeno, upredenu paricu ću dovesti u unutrašnji blok kondeje pa ću dalje razmišljati);
- Senzori vanjske temperature (sunčana i neosunčana strana);
- Zimi su uobičajena dva problema - hladno je i nema šta da se diše. Rješenje je ugradnja sistema napajanja. Nadalje, osigurati kontrolu sistema napajanja (temperatura u kanalu, senzor vanjske temperature, tri stepena grijanja, ventilator);
- Kontrola izduvnih ventilatora (kupatilo, kupatilo).

Sigurnosni alarm
Signalizacija stanja ulaznih vrata (arhiviranje stanja vrata - vrijeme otvaranja/zatvaranja);
Uključivanje preko web interfejsa ili preko prekidača za kontrolu svetla.

CCTV
Snimanje prednja vrata kamerom, parking mjesto;
Arhiviranje zapisa na udaljenom serveru.

Oprema

Pošto sam već navikao na PLC-ove iz ABB-a, AC500-eco PLC (PM554-ETH CPU sa Ethernet podrškom) je izabran kao mozak za sistem kontrole stana;
- Onda sam počeo da brojim novac i... Morao sam da izaberem okruženje za prikaz informacija, sa mogućnošću prikaza informacija o kući na webu. Postoji mnogo opcija, ali u suštini sve je bazirano na ne-cross-platform rešenjima, što meni ne ide. Sve sa riječima SCADA i WEB imalo je previsoku cijenu. Morao sam se malo uplašiti, kao rezultat toga, odlučeno je da se ne koristi SCADA sistem, već okvir sa odličnom funkcionalnošću za HTML5. Došao u CSWorks. Ovaj okvir vam omogućava da ga koristite besplatno sa ograničenjem od 999 varijabli, 1 klijent. Što mi je u potpunosti odgovaralo.
- JUNG, Serija A je odabrana kao prekidači i utičnice (kontrola svjetla). Od prednosti - mogu nositi do 4 dugmeta za jedan stub dugmeta (prekidač bez zasuna), imaju i indikacione LED diode napona 24V (ovaj napon je standardni industrijski napon za napajanje sistema automatizacije). Ove funkcije nije vidio nijedan proizvođač električnih instalacija (ne računajući Kinu);

Početak rada

1. Način ožičenja rasvjete. Svaka grupa dolazi direktno u ormar za napajanje. Ormar sadrži kontaktore i releje za upravljanje. Namotaji releja i kontaktora su kontrolirani PLC signalima (DC24V). Za redundantnost upravljanja koristim ručne kontaktore. Žica za napajanje je napravljena prolazeći kroz čašu prekidača tako da je bilo moguće ponovo ožičiti ožičenje na uobičajeno kolo.

Sam ručni kontaktor:

Ormar se sastavlja i montira:

Kao što sam gore napisao, izabrao sam prekidače bez zaključavanja sa LED indikatorima. Maksimalno 4 dugmeta, moguće je dodeliti ova dugmad u 8 grupa (pogledajte dokumentaciju za JUNG 4248TSM.



U narednim dijelovima će se detaljnije razmatrati realizacija projekta.

Unapred, pokazujem vam snimke ekrana web interfejsa:



Ovaj unos je autor objavio u Nekategorizirano. Bookmark.