Smart home interface ontwerp en integratie. Mobiele bediening

Het is een scripted home control-systeem. Hiermee kun je willekeurige logica (scripts) aan verschillende gebeurtenissen in huis hangen (sensoren activeren, knoppen indrukken, gebeurtenissen van externe diensten, bijvoorbeeld het ontvangen van e-mail of berichten op twitter). Het systeem heeft een modulaire architectuur, alle functionaliteit zit in plug-ins. Als je een nieuw gebeurtenistype of nieuwe "home API"-opdrachten moet toevoegen, hoef je daar alleen maar een plug-in voor toe te voegen.

In februari hadden we onze eerste release. De eerste versie bevatte een raamwerk voor domotica: een systeem van plug-ins en infrastructuur voor hen (zodat plug-ins hun API en evenementen kunnen beschrijven, de API kunnen gebruiken en zich kunnen abonneren op elkaars evenementen). Nu komt de release van de tweede versie, met als belangrijkste kenmerk een nieuwe webinterface.

UI is nu een modulaire toepassing met één pagina. Plug-ins kunnen hun gebruikersinterface beschrijven als html / js / css-bestanden die zich in DLL-bronnen bevinden. De gebruikersinterface aan de clientzijde is gebaseerd op backbone.js en marionette.js, modules worden geladen via required.js. Over het algemeen bleek het best handig voor plug-in-auteurs - zelfs zonder diepgaande kennis van java-script, kun je, door naar voorbeelden te kijken, een volwaardige gebruikersinterface beschrijven die automatisch wordt verbonden met de home control-interface.


De interface voor huisbediening bestaat uit "secties", elke plug-in kan meerdere secties bevatten (en kan er slechts één bevatten of helemaal geen interface hebben). Secties zijn onderverdeeld in 2 groepen: systeem ( verschillende instellingen, bijvoorbeeld de sectie homescripts) en door de gebruiker gedefinieerde (de secties waar gebruikers mee werken in Alledaagse leven bijv. "weersvoorspelling" en "alarmen").

Er is ook een speciale pagina - "desktop" (ook wel "startpagina" genoemd). Er zijn "elementen van de startpagina" - kleine panelen die worden weergegeven bruikbare informatie, en wanneer u erop klikt, wordt een pagina geopend of wordt een actie uitgevoerd.

startpagina

sectie met alarmen (in de juiste tijd speelt muziek af of start scriptuitvoering)

sectie met weersvoorspelling (gedownload van internet)

scripteditor (in de schermafbeelding een script dat foto's maakt van bezoekers die op de deurbelknop drukken)

gebeurtenisabonnementspagina: de eerste vervolgkeuzelijst - gebeurtenissen in het systeem (ze worden beschreven in plug-ins), de tweede lijst - scripts

De interface past zich aan kleine schermen van mobiele apparaten aan.

startpagina op klein scherm

weerpagina op klein scherm

Nu, zoals ik al schreef, nadert het systeem snel de release van de 2e versie, de broncode staat op github. Er is nog een mogelijkheid om iets te veranderen. Ik zou heel graag opbouwende kritiek en suggesties voor verbetering ontvangen (en als iemand een pull-verzoek stuurt, ben ik gewoon blij).

Als iemand live wil proberen hoe alles werkt, schrijf me dan een privébericht - ik zal een nieuwe distributie voor je samenstellen.

ps.
Trouwens, ik heb elke dag geprobeerd aan dit project te werken en het gaf verbluffende resultaten. Nu is het de 8e werkweek in deze modus (langste reeks 49 dagen). Gedurende deze tijd is het project meer gevorderd dan in de voorgaande zes maanden. Ik ben zeer tevreden met het resultaat en ben van plan om zoveel mogelijk in deze modus te blijven werken.

Toen ik opnieuw op internet rondzwierf op zoek naar een webinterface voor het aansturen van elektrische apparaten met het X10-protocol, kwam ik natuurlijk op de site van het bedrijf Melloware terecht. Ter ondersteuning van hun X10-hardware biedt het bedrijf (gratis) een softwareproduct aan genaamd X10 commandant ... Dit is een server die is geïnstalleerd op een Windows-computer waarop een USB X10-controller zoals CM15 of iets dergelijks is aangesloten. Alle apparaten die beschikbaar zijn in het X10-huis, hun adressen en typen, worden geregistreerd op de server. Met X10 Commander kunt u de beschreven apparaten rechtstreeks bedienen vanaf de computer waarop het is geïnstalleerd of op afstand, via HTTP (GET)-verzoeken zoals(dit is met name de opdracht om het apparaat aan te zetten op A1) Daarnaast biedt hetzelfde bedrijf (al voor weinig geld) programma's aan die op een iOS / Android-tablet of -telefoon zijn geïnstalleerd, die via dezelfde server werken en u in staat stellen om X10-apparaten zeer comfortabel te bedienen.

Mijn idee was als volgt. Op de computer die ik thuis heb, fungeert het als een thuismediaserver, een rockende torrent, Skype, enz. enzovoort. Ik installeer web- en FTP-servers, X10-commandant en sluit de CM15-controller aan. We tekenen een website en publiceren deze via een webserver in LAN, en sturen deze desgewenst door naar het wereldwijde netwerk voor volledige bediening op afstand. (Trouwens, later installeerde ik de HomeSapiens-server op deze computer, en als resultaat kreeg ik ook spraakbesturing.

Om dit idee te implementeren, moest ik een beetje google lezen en met mijn hoofd en pennen werken. In het kader van dit artikel zal ik niet beschrijven hoe de webserver is geïnstalleerd en hoe deze werkt (Google en smart books helpen je daarbij). Ik zal delen dat ik rechtstreeks heb gegoogeld om de X10 te besturen via de CM15-controller en de X10 Commander te gebruiken.
U kunt meer leren over de X10commander-syntaxis. Het downloaden van het ActiveHomePro SDK-pakket van de x10-website van de fabrikant is ook niet overbodig, er is een gedetailleerde beschrijving van het uitwisselingsprotocol met CM15, hoewel de belangrijkste fragmenten hier zijn (een deel van de beschrijving vertaald door Google):

Laten we eens kijken naar de syntaxis .... http: // localhost: 8086 = server en poort waar draait X10 Commander? x10command = = signaleringsparameter welk commando je wilt uitvoeren DEVICE ~ ~ sendplc "A1 OFF" gescheiden door tilde in eerst altijd device en dan sendplc / sendrf afhankelijk van of je hoogspanningslijnen of radio wilt(RS werkt nog steeds met de opdracht queryplc - statusquery)en vervolgens "A1 UIT" tussen aanhalingstekens, apparaat- en huiscode en commando. een paar voorbeelden....

// Zet A1 AAN
http: // localhost: 8086 /?x10command = DEVICE ~ sendplc ~ "A1 ON"
// Verhoog de helderheid van A1 met 50%
http: // localhost: 8086 /?x10command = DEVICE ~ sendplc ~ "A1 BRIGHT 50"
// Dim A1 tot 30%

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

Op de Melloware-forums in de sectie Web Interface To X10 Commander vond ik een heel merkwaardig voorbeeld in Javascript waarmee u een handig veld met knoppen op de pagina kunt maken, door erop te klikken waarmee u uw apparaten kunt bedienen via het X10-protocol via de X10commander-server. Hier is iets dat niet lang zou zoeken. Degenen die het willen herhalen, passen het aan de parameters van uw huis aan door de juiste namen van het adres en de opdrachten te registreren, met vermelding van het serveradres, de login en het wachtwoord die zijn ingesteld op de X10 Commander. Voeg vervolgens dit script toe aan uw HTML-pagina ... en dat is alles! Je wordt er blij van :-)

Ik besloot ook om te proberen mijn eigen pagina te maken met behulp van dit script. Aangezien ik geen programmeur ben en bekend ben met HTML op het niveau van een theepot, heb ik me ertoe verbonden een pagina te maken met behulp van een soort websitebouwer. Ik kwam een ​​programma tegen voor snelle creatie sites WebSite X5, een sjabloon gekozen voor het uiterlijk van de site, het menu geconfigureerd, een afbeelding ingevoegd en een script aangepast aan mijn instellingen. en het bleek ongeveer zo te zijn:

Toen wilde ik interactieve besturing organiseren, zodat de site kon zien wat ik bedien en in welke staat de lampen in de kamer zijn nu. Duiken in de syntaxis van uitwisseling met de serverX10 Commander en HTML-taal, in hetzelfde programma heb ik niet de pagina's gemaakt die ik nodig had met de bijbehorende verschijning en voegde er een kleine code in met pennen om verzoeken aan de server te doenX10 commandant. (Er wordt echt gezegd - Gezegend zijn moeilijkheden! We groeien door hen!)

Dit is wat er is gebeurd als resultaat:




Door op de afbeelding te klikken, verandert de staat van de lampen in de kamer en dienovereenkomstig in de afbeelding.

Zo werd het doel letterlijk bereikt in 3-4 avonden intensief achter de computer zitten.

Hoewel het vermeldenswaard is dat ondanks het feit dat de bedieningsinterface op de webpagina heel eenvoudig en intuïtief is, ik de enige ben die deze gebruikt. Huishoudens geven er uit gewoonte de voorkeur aan om schakelaars om te zetten. Het lijkt erop dat deze service veelgevraagd zou zijn in de plaats van de schakelaars, in welke draad een tablet zou moeten hangen met een geladen bedieningspagina voor deze specifieke kamer. Maar ook deze dienst is niet nutteloos te noemen! Ik zit achter mijn computer, zoals ze zeggen, zonder het steunpunt op te tillen met comfortabele stoel, zet mijn bovenlicht aan/uit als dat nodig is. En natuurlijk kan ik mijn elektrische apparaten via internet bedienen wanneer dat nodig is. (als het zich voordoet natuurlijk :-))

Het B-Tune®-systeem wordt bestuurd door de BT-4000/6000-controller, een mini-WEB-server die via een browser wordt bestuurd mobiele telefoon, computer, tablet zoals iPad of netbook. BT-4000/6000 kan in verschillende modificaties werken in netwerken: Ethernet, GSM, ADSL en WiMax (via USB-modems), waarmee u de communicatiekosten kunt optimaliseren.

BT-4000/6000 kan worden aangesloten op energiemeters, bedraad en draadloze sensoren, airconditioners, Huishoudelijke apparaten..., controleren en beheren.

De controller draait onder Linux, waardoor je een enorm aantal programma's en protocollen kunt gebruiken. In het bijzonder is het mogelijk om de communicatie te organiseren zonder dat elke abonnee een vast IP-adres moet worden toegewezen. Er is ook de mogelijkheid om deze beslissing voor: home accounting of resources (ASKUE), boekhouding van de werktijd van medewerkers, het monitoren van het weer, etc.

Oplossingen op basis van de BT-4000/6000 zijn volledig uitgeruste Smart Home-systemen waarmee u alle parameters van het eigenwoningbezit kunt regelen en beheren met behulp van een handige en intuïtieve grafische interface. Het beheer kan zowel van binnenuit (meestal via een interne) WiFi-netwerk), en van buitenaf - via internet, via de server van de telecomoperator. Tegelijkertijd zal de prijs van de basisabonneeset van het systeem de kosten niet overschrijden budget gsm alarm.

Lokale huisbediening (van binnenuit)

In afb. 1 toont een plattegrond van een typisch appartement met een B-Tune® systeem geïnstalleerd. Om veiligheidsfuncties te garanderen: op sommige deuren zijn openingssensoren geïnstalleerd, evenals infraroodsensoren die de beweging in de gang en de woonkamer regelen. Ter bescherming tegen lekkage worden in de badkamer en het toilet waterleksensoren geïnstalleerd. In de keuken is een rookmelder geïnstalleerd. Voor afstandsbediening achter het appartement in de gang en in de kinderkamer zijn videocamera's geïnstalleerd, waarvan de "foto" kan worden verzonden naar de computer of PDA van de eigenaar van het appartement, op enigerlei wijze verbonden met internet. Temperatuursensoren worden gebruikt om de binnen- en buitentemperatuur te bewaken.

In het elektrische paneel zijn een alarmsirene, een blok gestuurde relais voor het op afstand in- en uitschakelen van belastingen en een elektriciteitsmeter geïnstalleerd. Deze apparaten zijn verbonden met de systeemcontroller. De eigenaar van het appartement kan continu het totale en actuele energieverbruik monitoren. Zo kan de eigenaar van het appartement eenvoudig controleren of hij het strijkijzer aan heeft laten staan strijkplank: dit is het geval als het verbruik (gegevens van de elektriciteitsmeter) 1-2 kW is. Als de overeenkomstige groep stopcontacten echter is aangesloten op een gestuurd relais, kan het linker strijkijzer spanningsloos worden gemaakt door het relais uit te schakelen. In het gebied voordeur uit het zicht is ook een iButton® bedieningspaneel geïnstalleerd voor het in- en uitschakelen van het appartement.

Het systeem geïnstalleerd in typisch appartement

Binnenshuis kan de abonnee vanaf zijn computer, PDA, laptop of tablet, met behulp van de WEB-browser:

  • Bedien het licht
  • Regel het openen van gordijnen en jaloezieën
  • Bewaak de status van sensoren (temperatuur, vochtigheid, rook, wisselspanning, beweging, enz.)
  • Beheer airconditioners, tv- en audioapparatuur
  • Bekijk "foto's" van videocamera's
  • Maak gebruik van de telegeneeskundediensten van een medisch centrum op afstand (als er extra apparatuur beschikbaar is)

Voordat de abonnee lokaal (vanuit het appartement) wordt gebruikt, moet het systeem worden geconfigureerd via het Ethernet-netwerk met behulp van de WEB-browser. Werken via een grafische en eenvoudige interface lijkt op een spel met moderne "gadgets", en om het in te stellen hoeft u de beschrijving niet te lezen en "gecodeerde sms" te verzenden. Om te configureren, moet u uw computer rechtstreeks of via een Ethernet-hub op de controller aansluiten. In aanwezigheid van een externe Wifi router de controller kan worden geconfigureerd vanaf een mobiele telefoon, PDA, tablet of laptop. (Voor een correcte werking moet op het bedieningsapparaat een moderne browser zijn geïnstalleerd die WEB 2.0-technologie ondersteunt).

De configuratie bestaat uit de volgende stappen die de abonnee zelfstandig kan uitvoeren:

  • Teken en upload een huisplan (optioneel)
  • Sensoren aansluiten (het type van sommige sensoren wordt automatisch bepaald door de controller)
  • Sensoren op de plattegrond plaatsen
  • Stel de parameters in waarmee de controller alarmmeldingen moet verzenden (sms, oproep ...) of bepaalde acties moet uitvoeren (licht aandoen, gordijnen sluiten ...)

Afstandsbediening vanaf elk punt op internet via het "Persoonlijke account" van de operator

Voor toegang op afstand tot de controller wordt een speciale internetserver (hierna de Server genoemd) aan de kant van de operator gebruikt, die een symbolische naam en een statisch IP-adres heeft.

De controller, die op enigerlei wijze verbinding heeft gemaakt met internet, opent automatisch een beveiligde VPN-verbinding met de server. De server controleert periodiek de beschikbaarheid van de controller en informeert de abonnee in geval van verlies van communicatie met hem (e-mail, sms, oproep).

Om met de controller te communiceren, moet een met internet verbonden abonnee verbinding maken met de server en zijn gegevens invoeren om het "persoonlijke account" van de operator in te voeren. De Server authenticeert de Abonnee en controleert of het communicatiekanaal met zijn Controller open is. Als het communicatiekanaal open is, verzendt de Server gegevens tussen de abonnee en de Controller. Via de interface " persoonlijk account»De abonnee heeft toegang tot:

  • WEB-interface voor het beheer van de "Smart Home", vergelijkbaar met de lokale interface
  • Het gebeurtenislogboek
  • Grafieken van veranderingen in temperatuur, vochtigheid, enz.
  • Gebeurtenissen programmeren wanneer de server SMS / Mail / Skype / ICQ-berichten moet verzenden
  • Foto's of video's gemaakt door de controller en geüpload naar de server

In geval van nood stuurt de Verwerkingsverantwoordelijke een sms naar de abonnee. Om de belangrijkste functies te bedienen, kan het nodig zijn om de verwerking van ontvangen commando's in SMS-berichten te implementeren.

Bewaking en groepsbesturing via de "groepenkast" van de aandrijving

Apart moet worden opgemerkt dat de Server kan worden gebruikt om monitoringsystemen te organiseren voor: cottage nederzettingen en appartementsgebouwen... In dit geval heeft de coördinator / operator van de groep een "groepenkast" nodig waarmee het volgende beschikbaar is:

  • Database met uitlezingen van waarden van energiemeters.
  • Database van specifieke gebeurtenissen aan de kant van de abonnee (bijvoorbeeld teller openen of deur openen in gewapende modus)
  • Grafische kaart - met de binding van controllers aan de geografische locatie van objecten ( werkplek verzender).
  • Groepssoftware wijzigen op apparaten
  • Extra functies... Bijvoorbeeld de functie van live-monitoring van elektriciteitsverbruik: elke 15 minuten, de som van de metingen van alle appartement meters wordt vergeleken met de aflezing van de brownie (totaal)teller. Wanneer een discrepantie groter dan een vooraf bepaalde drempel wordt gedetecteerd, wordt een signaal afgegeven om de locatie te onderzoeken op ongeautoriseerde selectie van elektriciteit.

De server biedt ook een integratiefunctie (API-interface) met services van derden. Bijvoorbeeld aanbieders van telegeneeskunde, veiligheidsdiensten, enz.

We hebben ons slimme huissysteem kunnen leren herkennen wat we zeiden en stemreacties synthetiseren met Google.
Vandaag wil ik u vertellen hoe u de toegang tot ons systeem kunt organiseren via de webinterface.

Technologieën

Zoals u zich herinnert, is de software voor het beheer van onze " slimme woning»Wij schrijven in de taal perl... Modern Informatie Systeem praktisch ondenkbaar zonder database. Ook wij zullen niet aan de kant blijven staan ​​en zullen een DBMS gebruiken om onze gegevens op te slaan. MySQL... Om een ​​webserver te implementeren, heb ik besloten om geen software van derden te gebruiken, maar een module voor perl - HTTP :: Server :: Eenvoudig, vooral - HTTP :: Server :: Eenvoudig :: CGI... Waarom deed ik het? Voor het grootste deel, voor de lol ;) Maar in theorie kun je toegang krijgen tot low-level verwerking van HTTP-verzoeken / antwoorden zonder het Apache / mod_perl-complex te vervuilen. Over het algemeen weerhoudt niets u ervan om het project over te dragen naar Apache-rails, als u de wens en voldoende tijd heeft.

Database

Allereerst zullen we het MySQL DBMS installeren en een database maken met tabellen van db.sql. Hier is de lijst:

MAAK DATABASE ion; GEBRUIK ion; # # Tabelstructuur voor tabel "kalender" # DROP TABLE ALS BESTAAT kalender; CREATE TABLE `calendar` (` id` int (15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL,` message` text, `nexttimeplay` datetime NOT NULL,` expired` datetime NOT NULL, `type` int (1) STANDAARD NULL, PRIMAIRE SLEUTEL (`id`)) MOTOR = MyISAM STANDAARD CHARSET = latin1; # # Tabelstructuur voor tabel "commandslog" # DROP TABLE IF EXISTS 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 = 1 STANDAARD CHARSET = latijn1; # # Tabelstructuur voor tabel "log" # DROP TABLE IF EXISTS log; CREATE TABLE `log` (` id` int (15) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL,` message` varchar (255) NOT NULL, `level` int (1) STANDAARD NULL, PRIMAIRE SLEUTEL (` id` )) MOTOR = MyISAM AUTO_INCREMENT = 1 STANDAARD CHARSET = latin1;

Laten we de nodige stappen ondernemen:

[e-mail beveiligd]: ~ $ sudo apt-get install mysql-server
[e-mail beveiligd]: ~ $ mysql -uroot -ppassword< db.sql

De code wijzigen

Nu moeten we mappen maken lib, html en configuratie(naast de map gegevens). In de map lib we zullen een module plaatsen die verantwoordelijk is voor het implementeren van de webserver en het afhandelen van onze HTTP-verzoeken.

We moeten het script een beetje aanpassen srv.pl... Voeg toe aan het initialisatieblok:

Onze% cfg = readCfg ("common.cfg"); onze $ dbh = dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass"));
Laten we de regels toevoegen die verantwoordelijk zijn voor het starten van de HTTP-server onder het initialisatieblok:

## De HTTP-server starten ################################ mijn $ pid = lib :: HTTP-> nieuw ( $ cfg ("httpPort")) -> achtergrond (); print "HTTP PID: $ pid \ n"; logSystem ("HTTP-service - PID: $ pid, poort: $ cfg (" httpPort "), host: $ cfg (" httpHost ")", 0); ################################
Laten we nu de ontbrekende functies toevoegen aan het einde van het bestand:

Sub readCfg (mijn $ bestand = shift; mijn% cfg; open (CFG, " ; foreach mijn $ lijn (@cfg) (volgende if $ lijn = ~ / ^ \ # /; if ($ lijn = ~ /(.*?) \ = \ "(. *?) \" \; /) (chomp $ 2; $ cfg ($ 1) = $ 2;)) sluiten (CFG); rendement% cfg; ) ####################################### sub dbConnect (mijn ($ db, $ gebruiker) , $ pass) = @_; return $ dbh = DBI-> connect ("DBI: mysql: $ db", $ gebruiker, $ pass) || die "Kon geen verbinding maken met database: $ DBI :: errstr"; ) ######################################## sub logSystem (mijn ($ tekst, $ niveau) ) = @_; my% cfg = readCfg ("common.cfg"); dbConnect ($ cfg ("dbName"), $ cfg ("dbUser"), $ cfg ("dbPass")); $ dbh-> do ("INSERT INTO log (datum, bericht, niveau) WAARDEN (NU ()," $ tekst ", $ niveau)");)

Zoals je kunt zien aan de namen van de functies, is dbConnect () verantwoordelijk voor het verbinden met ons DBMS, logSystem () is voor het loggen, readCfg () is voor het laden van de configuratie. Laten we er dieper op ingaan. De configuratie is een eenvoudig tekstbestand in de config-directory. In ons geval heet het common.cfg... Het ziet er ongeveer zo uit:

## Instellingen daemonMode = "undef"; logSysteem = "1"; logGebruiker = "1"; dbName = "ion"; dbUser = "root"; dbPass = "wachtwoord"; camNumber = "4"; camMotionDetect = "1"; httpPoort = "16100"; httpHost = "lokale host"; telnetPort = "16000"; telnetHost = "lokale host"; micThreads = "5";

Sommige regels erin zullen later worden gebruikt. Tot nu toe zijn we alleen geïnteresseerd in regels die beginnen met het voorvoegsel db... Zoals we kunnen zien, zijn dit de instellingen om verbinding te maken met onze database.

Nu ga ik het hebben over hoe de herhaalde uitvoering van het commando te overwinnen. Laten we de functie bewerken checkcmd ():

Sub checkcmd (mijn $ text = shift; chomp $ text; $ text = ~ s / $ // g; print "+ OK - Got command \" $ text \ "(Length:" .length ($ text). ") \ n "; if ($ tekst = ~ / systeem /) (################################## # ############# my $ sth = $ dbh-> prepare ("SELECT cmd FROM commandslog WHERE DATE_SUB (NOW (), INTERVAL 4 SECOND)<= date LIMIT 0, 1"); $sth->uitvoeren (); mijn $ resultaat = $ sth-> fetchrow_hashref (); if ($ result -> (cmd) ne "") (return;) $ dbh-> do ("INSERT INTO commandslog (datum, cmd) VALUES (NOW ()," $ text ")"); ################################################ als ( $ text = ~ / check /) (mijn $ up = `uptime`; $ up = ~ / up (. *?), /; sayText ("Server uptime - $ 1. Hoofdprocesnummer - $ ouder. ") ; ) if ($ text = ~ / time /) (my $ up = `uptime`; $ up = ~ /(.*?) up /; sayText (" Now $ 1 ");) if ($ text = ~ / finish / || $ text = ~ / finish /) (sayText ("Quitting. All the best!"); system ("killall motion"); system ("rm ./data/*.flac && rm ./data/ * .wav "); systeem ("killall perl "); exit (0);) if ($ text = ~ / weather /) (my ($ addit, $ mod); my% wh = lib :: HTTP :: checkWeather (); $ wh ("conditie") = Encode :: decode_utf8 ($ wh ("conditie"), $ Encode :: FB_DEFAULT); $ wh ("hum") = Encode :: decode_utf8 ($ wh ("hum") "), $ Encode :: FB_DEFAULT); $ wh (" wind ") = Encode :: decode_utf8 ($ wh (" wind "), $ Encode :: FB_DEFAULT); if ($ wh (" temp ")< 0) { $mod = "ниже нуля"; } if($wh{"temp"} >0) ($ mod = "boven nul";) $ wh ("wind") = ~ s /: В, / oost /; $ wh ("wind") = ~ s /: З, / western /; $ wh ("wind") = ~ s /: S, / zuid /; $ wh ("wind") = ~ s /: С, / noord /; $ wh ("wind") = ~ s /: NE, / noordoosten /; $ wh ("wind") = ~ s /: NW, / noordwesten /; $ wh ("wind") = ~ s /: ZO, / zuidoosten /; $ wh ("wind") = ~ s /: SW, / zuidwesten /; sayText ("Now $ wh (" condition"), $ wh (" temp ") graden $ mod. $ wh (" hum "). $ wh (" wind ")"); als ($ wh ("tijd")<= 18) { $addit = sayText("Одевайтесь теплее, на улице холодно!"); } if ($wh{"temp"} >= 28) ($ addit = sayText ("Draagbare airconditioner kan geen kwaad!");))) #SayText ("Uw commando is $ text"); opbrengst; )
We selecteren de laatst uitgevoerde opdracht met een interval van vier seconden en als deze overeenkomt met de huidige, verlaten we de functie. Zoals je kunt zien, heb ik enkele commando's toegevoegd in vergelijking met de functie die in het laatste artikel is beschreven. Het meest interessante is het weer. De implementatie van het ontvangen van gegevens ervoor is net hieronder.

module HTTP.pm

Laten we teruggaan naar de implementatie van de ingebouwde HTTP-server. Laten we een bestand maken HTTP.pm in de map lib... Laten we daar de volgende code schrijven:

Pakketbibliotheek :: HTTP; gebruik HTTP :: Server :: Eenvoudig :: CGI; gebruik LWP :: UserAgent; gebruik URI :: Escape; gebruik base qw (HTTP :: Server :: Simple :: CGI); gebruik sjabloon; ######################################## ######### # ############################### our% dispatch = ("/" => \ & goIndex, "/ index" = > \ & goIndex, "/ camers" => \ & goCamers,); onze $ tt = Sjabloon-> nieuw (); ######################################## ######### # ############################### sub handle_request (mijn $ zelf = shift; mijn $ cgi = shift; mijn $ pad = $ cgi-> path_info (); mijn $ handler = $ verzending ($ pad); if ($ pad = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf) ) )) (mijn $ url = $ 1; print "HTTP / 1.0 200 OK \ n"; print "Content-Type: text / css \ r \ n \ n" als $ url = ~ / css /; print "Content- Type: afbeelding / jpeg \ r \ n \ n "if $ url = ~ / jpg /; print" Inhoudstype: afbeelding / png \ r \ n \ n "if $ url = ~ / png /; print" Inhoud- Type: afbeelding / gif \ r \ n \ n "if $ url = ~ / gif /; print" Inhoudstype: tekst / xml \ r \ n \ n "if $ url = ~ / xml /; print" Inhoud- Type: application / x-shockwave-flash \ r \ n \ n "if $ url = ~ / swf /; open (DTA,"<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach mijn $ lijn (@dtast) (print $ lijn;) sluiten (DTA); opbrengst; ) if (ref ($ handler) eq "CODE") (print "HTTP / 1.0 200 OK \ r \ n"; $ handler -> ($ cgi);) else (print "HTTP / 1.0 404 Niet gevonden \ r \ n "; print $ cgi-> header, $ cgi-> start_html (" Niet gevonden "), $ cgi-> h1 (" Niet gevonden "), $ cgi-> h2 ($ cgi-> path_info ()); $ cgi-> end_html ;)) ## Verwerkingsverzoek / ##################################### # # sub goIndex (mijn $ cgi = shift; # CGI.pm object return if! ref $ cgi; my% w = checkWeather (); mijn $ cmd; mijn $ dbh = iON :: dbConnect ($ iON :: cfg ( " dbName"), $ iON :: cfg ("dbUser"), $ iON :: cfg ("dbPass")); my $ sth = $ dbh-> prepare ("SELECT cmd FROM commandslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1 "); $ sth-> execute (); mijn $ resultaat = $ sth-> fetchrow_hashref (); if ($ resultaat -> (cmd) ne" ") ($ cmd = $ resultaat -> ( cmd );) else ($ cmd = "Geen commando's ...";) print "Content-Type: text / html; charset = UTF-8 \ n \ n"; mijn $ uptime = `uptime`; $ uptime = ~ / up (. *?), /; $ uptime = $ 1; mijn $ videosys = `ps aux | grep motion`; if ($ videosys = ~ / motion -c /) ($ videosys =" werken";) anders ($ videosys =" werkt niet";) mijn $ micsys =` ps aux | grep mic`; if ($ micsys = ~ / perl mic \ .pl /) ($ micsys = " werken";) anders ($ micsys =" werkt niet";) mijn $ vars = (whIcon => $ w ("pictogram"), whCond => $ w ("voorwaarde"), whTemp => $ w ("temp"), whHum => $ w (" hum " ), whWind => $ w ("wind"), cmd => $ cmd, uptime => $ uptime, video => $ videosys, mic => $ micsys, threads => $ iON :: cfg ("micThreads") ,); mijn $ output; $ tt-> proces ("html / index", $ vars, $ output) || print $ tt-> error (), "\ n";) ## Verwerkingsverzoek / camers ## ###################################### sub goCamers (mijn $ cgi = shift; # CGI. pm object return if! ref $ cgi; mijn% w = checkWeather (); mijn $ cmd; mijn $ dbh = iON :: dbConnect ($ iON :: cfg ("dbName"), $ iON :: cfg ("dbUser" ), $ iON :: cfg ("dbPass")); my $ sth = $ dbh-> prepare ("SELECT cmd FROM commandslog WHERE id> 0 ORDER BY id DESC LIMIT 0, 1"); $ sth-> execute ( ); mijn $ resultaat = $ sth-> fetchrow_hashref (); if ($ resultaat -> (cmd) ne "") ($ cmd = $ resultaat -> (cmd);) else ($ cmd = "Geen commando's .. . ";) if ($ cgi-> param (" text ") ne" ") (mijn $ txt = $ cgi-> param (" text "); vereisen Encode; $ txt = Encode :: decode_utf8 ($ txt, $ Codeer :: FB_DEFAULT); iON :: sayText ( $txt); ) print "Inhoudstype: tekst / html; charset = UTF-8 \ n \ n"; mijn $ vars = (camera1 => "video-0 / camera.jpg", camera2 => "video-1 / camera.jpg", camera3 => "video-2 / camera.jpg", camera4 => "video- 3 / camera.jpg ", whIcon => $ w ("pictogram"), whCond => $ w ("voorwaarde"), whTemp => $ w ("temp"), whHum => $ w ("hum") , whWind => $ w ("wind"), cmd => $ cmd,); mijn $ uitvoer; $ tt-> proces ("html / camers", $ vars, $ output) || print $ tt-> fout (), "\ n"; ) ## Weer ####################################### sub checkWeather (mijn% wh ; mijn $ ua = LWP :: UserAgent-> nieuw (agent => "Mozilla / 5.0 (Windows NT 5.1; ru-RU) AppleWebKit / 535.2 (KHTML, zoals Gecko) Chrome / 15.0.872.0 Safari / 535.2"); mijn $ inhoud = $ ua-> get ("http://www.google.com/ig/api?hl=ru&weather=" .uri_escape ("St. Petersburg")); $ inhoud-> inhoud = ~ / (.*?)<\/current_conditions>/ G; mijn $ cond = $ 1; $ voorwaarde = ~ /

Laten we de inhoud eens nader bekijken. in hasj % verzenden we bepalen de overeenkomst tussen de url en de aangeroepen functie. Alle andere URL's die niet in deze hash worden beschreven, retourneren de pagina 404 .
Onze template engine wordt een krachtige en flexibele bibliotheek. Sjabloon toolkit... We initialiseren het met de regel:

Onze $ tt = Sjabloon-> nieuw ();
Overbelasting van de functie handvat_verzoek () parent-klasse, krijgen we controle over de verwerkingsverzoeken naar de HTTP-server. Om statische inhoud naar de browser te sturen (png, gif, jpg, css, xml, swf), wordt het volgende blok gebruikt:

If ($ pad = ~ qr (^ / (. * \. (?: png | gif | jpg | css | xml | swf)))) (mijn $ url = $ 1; print "HTTP / 1.0 200 OK \ n " ; print "Content-Type: text / css \ r \ n \ n" if $ url = ~ / css /; print "Content-Type: image / jpeg \ r \ n \ n" if $ url = ~ / jpg / ; print "Content-Type: image / png \ r \ n \ n" als $ url = ~ / png /; print "Content-Type: image / gif \ r \ n \ n" als $ url = ~ / gif / ; print "Content-Type: text / xml \ r \ n \ n" if $ url = ~ / xml /; print "Content-Type: application / x-shockwave-flash \ r \ n \ n" if $ url = ~ / swf /; openen (DTA, "<$url") || die "ERROR: $! - $url"; binmode DTA if $url =~ /jpg|gif|png|swf/; my @dtast = ; foreach mijn $ lijn (@dtast) (print $ lijn;) sluiten (DTA); opbrengst; )
Omdat ik niet veel MIME-types had, heb ik ze een beetje in het hindoeïstisch opgeschreven;)
Vervolgens komen de functies die verantwoordelijk zijn voor het genereren van de inhoud van een specifieke URL. Tot nu toe zijn er slechts twee - een index en een pagina met camera's.
Op de index kunnen we zien of subsystemen zoals video- en audio-opname werken. Een aparte regel gaat:

Mijn% w = checkWeather ();
Deze functie retourneert een hash met de huidige weergegevens in de stad, die op onze pagina worden weergegeven. Zo'n klein leuk broodje ;)
Op dezelfde plaats ernaast zullen we het laatst ontvangen en herkende commando voor de "smart home" weergeven.

Volgende functie goCamers () voert dezelfde functies uit als de index, alleen in plaats van informatie over de status van subsystemen weer te geven, toont het het beeld van onze camera's en is het mogelijk om elke tekst te schrijven die wordt gesynthetiseerd en ingesproken door ons "slimme huis".

Alle pagina's zijn opgebouwd op basis van sjablonen in de map html... Het is niet handig om hier een vermelding te plaatsen, dus ik zal een link naar het archief geven -

Er zijn veel artikelen op Habré over slimme thuisprojecten, maar bijna allemaal gingen ze over zelfgemaakte apparatuur en Chinese gadgets. In mijn artikel wilde ik het hebben over een andere benadering die laat zien hoeveel gemakkelijker het is om projecten uit te voeren met kant-en-klare oplossingen van wereldwijde fabrikanten ( en ziet er steviger uit), en demonstreert ook de mogelijkheid om de apparatuur niet alleen in industriële faciliteiten, maar ook in de privésfeer te gebruiken. Het resultaat is een symbiose van technologieën en automatiseringsgebieden. Enerzijds met behulp van een PLC, die voornamelijk is ontworpen voor de behoeften van de industrie, waarmee u taken van elke complexiteit kunt uitvoeren zonder de beperkingen van rigide algoritmen van kant-en-klare smart home-apparaten (bijvoorbeeld met behulp van KNX-technologie) met koppelen met html / javascript webtechnologie geeft een onbeperkte vlucht van fantasieën voor het uitbreiden van projecten ...

Huidige kosten - 170 duizend roebel (tegen de oude wisselkoers van de euro).

Laten we beginnen.

Wat ik in gedachten heb

Wij beheren verlichting en stroomvoorziening
- In principe wordt de besturing uitgevoerd door een aan/uit signaal, ik wil en wil niet dimmen;
- Ik wil vanaf verschillende plaatsen bedienen, bijvoorbeeld naar de slaapkamer gegaan - de kroonluchter aangezet, op het bed gaan liggen - ingedrukt om de kroonluchter uit te zetten. Als hij vergat het licht in de hal (of in het toilet ...) uit te doen, drukte hij op de knop "doe overal het licht". Comfortabel;
- Bij het verlaten van het appartement druk ik op één knop - de lichten in het hele appartement zijn uitgeschakeld, enz.;
- Lees de aflezing van de elektriciteitsmeter af;
- Ononderbroken stroomvoorziening van controle- en beveiligingssystemen van het appartement;
- Zonder uitzondering moeten alle lichtgroepen worden aangestuurd door een PLC. In geval van brand moeten de stopcontactgroepen worden losgekoppeld van de PLC in de machine - schakel in geval van nood de stroomtoevoer in het appartement uit;
- Elke lichtgroep moet naar het schakelbord komen en door de dichtstbijzijnde schakelaar gaan om de lichtregeling opnieuw te kunnen ontwerpen in het gebruikelijke schema (als ik een appartement verkoop, neem ik alles);
- Zorg voor een menselijke bewegingssensor in de gang om de verlichting aan te sturen + gekoppeld aan een inbraakalarm;
- Warme vloer op het balkon, in het toilet, badkamer, in de gang - met de mogelijkheid om te regelen afhankelijk van de buitentemperatuur, op tijd.

Wij regelen verwarming en ventilatie
- Verwarmingsregeling - op elke batterij is een klep met een actuator geïnstalleerd (om de temperatuur per kamer te regelen, om de kamertemperatuur te meten, is het noodzakelijk om temperatuursensoren te voorzien);
- Zorg voor de besturing van airconditioners via het infraroodkanaal (de huidige oplossing voor het probleem is nog niet gevonden, we zullen het twisted pair naar het interne blok van de kondeya brengen, ik zal er verder over nadenken);
- Buitentemperatuursensoren (zon en niet-zonzijde);
- In de winter komen twee problemen vrij vaak voor: het is koud en er is niets om te ademen. De oplossing is het installeren van een toevoersysteem. Zorg verder voor de regeling van het toevoersysteem (temperatuur in het kanaal, buitentemperatuursensor, drie verwarmingstrappen, ventilator);
- Regeling afzuigventilatoren (badkamer, badkamer).

Beveiligings alarm
Signalering van de toestand van de toegangsdeur (archivering van de toestand van de deur - openings- / sluitingstijd);
Inschakelen via de webinterface of via de lichtschakelaar.

CCTV
Voordeur camera opname, straat parkeerplaats;
Records archiveren op een externe server.

Apparatuur

Aangezien ik al gewend ben aan PLC's van ABB, werd de AC500-eco PLC (PM554-ETH CPU met Ethernet-ondersteuning) gekozen als het brein voor het appartementbesturingssysteem;
- Toen begon ik geld te tellen en ... ik moest een informatieweergave-omgeving kiezen met de mogelijkheid om informatie over het huis op internet weer te geven. Er zijn veel opties, maar eigenlijk is alles gebaseerd op niet-platformonafhankelijke oplossingen, wat voor mij niet werkt. Alles met de woorden SCADA en WEB had een exorbitant prijskaartje. Ik moest een beetje schrikken, met als gevolg dat er werd besloten om geen SCADA-systeem te gebruiken, maar een framework met geweldige functionaliteit voor HTML5. Kwam naar CSWorks. Met dit framework kun je het gratis gebruiken met een limiet van 999 variabelen, 1 client. Wat helemaal bij mij paste.
- JUNG, Serie A werd geselecteerd als schakelaars en stopcontacten (lichtregeling). Van de voordelen - ze kunnen tot 4 knoppen dragen voor één drukknoppost (schakelaar zonder vergrendeling), ze hebben ook indicatie-LED's met een spanning van 24V (deze spanning is de standaard industriële spanning voor de voeding van automatiseringssystemen). Deze functies zijn door geen van de fabrikanten van elektrische installaties gezien (China niet meegerekend);

Begin van het werk

1. Een manier om verlichting te bedraden. Elke groep komt rechtstreeks naar de voedingskast. De kast bevat magneetschakelaars en relais voor de besturing. Relais- en contactorspoelen worden aangestuurd door PLC-signalen (DC24V). Voor redundantie van de besturing gebruik ik handmatige magneetschakelaars. De voedingsdraad werd door de schakelbeker geleid, zodat het mogelijk was om de bedrading opnieuw te bedraden naar het gebruikelijke circuit.

Handmatige schakelaar zelf:

De kast wordt gemonteerd en gemonteerd:

Zoals ik hierboven schreef, koos ik de schakelaars zonder te vergrendelen met led-indicatoren. Maximaal 4 knoppen, het is mogelijk om deze knoppen toe te wijzen aan 8 groepen (zie de documentatie bij de JUNG 4248TSM.



In de volgende delen wordt dieper ingegaan op de uitvoering van het project.

Vooruitlopend op mezelf, laat ik je screenshots van de webinterface zien:



Dit bericht is geplaatst in Uncategorized door de auteur. Bladwijzer.