Automatizare Casa Inteligenta

1. Introducere

Internetul este una din cele mai importante și puternice creații ale umanității. Ne-a schimbat modul în care comunicăm, învățăm și ne-a oferit accesul facil la informație.[1]

Se preconizează că în următorii ani tot mai multe obiecte se vor conecta la aceasta rețea de rețele, iar impactul calitativ asupra societății va fi unul benefic. Exemple de aplicații specifice acestei abordări sunt monitorizarea locurilor de parcare dintr-un oraș, iluminatul strazilor care să se adapteze condițiilor meteo, monitorizarea autoturismelor și pietonilor dintr-o zonă pentru a genera dinamic mersul semafoarelor, detecția nivelelor de gaz și scurgeri în medii industrale.

Aplicațiile entunțate mai sus au în comun următoarea caracteristică: sistemul preia date din lumea reală și ne oferă o vizibilitate a unor tipare pe care le putem optimiza sau, în cazul detecției nivelurilor de gaz, care poate duce la salvarea unor vieți.

În acest sens, am construit un sistem automatizat pentru casa inteligentă care preia date precum temperatura, umiditatea, lumina și oferă posibilitatea unei automatizari unei prize telecomandate care poate fi conectată la orice dispozitiv electronic.

Modul de dezvoltare a acestei aplicații a fost asemenea unui aplicații comerciale, ce poate fi livrată la client. Am proiectat sistemul astfel încât să se poată scala și pentru ca fiecare utilizator să aibe acces la datele sale într-un mod securizat.

Piesa centrală din cadrul acestei aplicații este microprocesorul Raspberry Pi; activitatea de preluare de date, transmiterea lor către server și automatizarea se desfășoară prin intermediul aceluiași echipament. Am conceput două arhitecturi bazate pe tehnologii asemănatoare, dar diferite din punct de vedere al încărcăturii exercitate asupra sistemului pe care se află.

Printre cele mai mari provocări ale acestei aplicații a fost proiectarea unei baze de date care să se supună unor standarde ridicate de performanță, care poate fi scalată pentru mai mulți clienți pentru a putea administra o cantitate mare de date.

Aplicația web, serverul web, precum și serverul de baze de date sunt instalate pe o mașină independentă Ansamblul client-Raspberry Pi-senzori, transmițător, priză comandată realizează partea de colectare a datelor, precum și trasmiterea unor comenzi catre priza telecomandată.

Scopul acestul proiect este aplicarea cunoștiințelor practice și teoretice dobândite în cadrul studiilor de licență cu scopul de a crea un sistem care se încadrează în Internetul tuturor lucrurilor.

Obiectivele principale ale acestui proiect sunt analiza sistemelor automatizate pentru casa inteligentă și implementarea unui sistem de această factură. Obiectivele secundare constau în realizarea unei arhitecturi de bază care să suporte un trafic de ordinul milioanelor de înregistrări.

2. Automatizare casă inteligentă

În acest capitol am prezentat conceptul de Internet al lucrurilor și soluțiile existente pe piață în momentul de față. Capitolul continuă cu prezentarea unei structuri de baza pentru a o aplicație care respectă principiile Internetului lucrurilor și aplică această structură pe proiect.

2.1. Internetul lucrurilor

Într-una din conferințele TED ( Technology, Enterntainment, Design ), Dr John Barrett, sef de studii academice la Centrul de cercetare Nimbus, al Institutului Cork de Tehnologie (CIT), a declarat faptul că suntem pe cale să luăm parte la următorul pas al Internet-ului și al Web-ului. Pe deasupra, acesta spune că impatctul asupra societății noastre va fi unul mult mai mare, schimbându-ne felul de a relaționa cu lumea din jurul nostru.

În viziunea sa, suntem pe cale să conectăm lumea fizică la Internet și elemente ale acesteia vor deveni lucruri de pe Internetul lucrurilor (Internet of Things). Dacă avem în vedere această viziune, putem să ne imaginăm cum, în câtiva ani, vom putea, spre exemplu: să ne căutăm cheile pierdute folosind un motor de căutare sau să proiectăm rețeaua de semafoare a unui oraș care să fluidizeze traficul în funcție de aglomerație.

Conceptul de Internet al lucrurilor a fost introdus de către Institutul de Tehnologie din Massachusetts (MIT) în anul 1999 și a fost formal adoptat în anul 2005 la Întrunirea Internaționala a Societății Informaționale.

În altă ordine de idei, John Chambers, CEO-ul corporației Cisco declară că potențialul profit generat de Internetul tutoror lucrurilor (“a doua generație a Internetului”) va fi in jurul valorii de $19.000.000.000.000 ($19 trilioane).

Internetul lucrurilor este construit pe 3 nivele: nivelul corespunzător senzorilor, nivelul rețea și nivelul aplicație. Nivelul senzorilor realizează colectarea datelor și controlul inteligent. Nivelul retea realizează transmisia bidirecțională între nivelul senzorilor și cel aplicație. [2]

În realizarea proiectului am avut în vedere aceste trei nivele, iar în continuare voi prezenta modul în care este reprezentat fiecare nivel:

Nivelul corespunzător senzorilor este reprezentat de senzorii de temperatură, de umiditate și de lumină, senzori care preiau date din lumea reală și le transmit echipamentului Raspberry Pi.

Nivelul rețea în aplicația aceasta îl reprezintă Internetul. Utilizatorul trimite date de autentificare pentru a putea avea acces la datele de pe senzorii proprii. Aceste cereri se trimit prin protocolul HTTP.

Nivelul aplicație este reprezentat de aplicația web prin care se pot vizualiza datele provenite de la senzori.

Lucrarea de fată își propune să facă o contribuție spre acest Internet al lucrurilor, prin conectarea casei la internet. Folosind orice dispozitiv cu conexiune la internet putem să verificam anumiți parametri ai casei, precum temperatura, umiditatea, nivelul de lumină, și să îi modificăm într-un mod securizat.

2.2. Soluții existente

Lucrarea își propune sa aduca o soluție ieftină, ușor configurabilă pentru acest domeniu, al automatizarii unei case.

Nest este unul dintre cei mai mari jucători pe piața de automatizare a caselor. Compania a fost înființată de doi fosti ingineri de la Apple, Tony Fadell și Matt Rogers. Cel mai cunoscut produs al acestora îl reprezintă un termostat care detectează nivelul de fum sau monoxid de carbon.

Samsung a debutat în anul 2014 la conferința CES cu propriul sistem de automatizare a unei case numit Samsung Smart Home.

După cum se poate observa, piața automatizării de casă inteligentă este una tânără care, din punctul meu de vedere, se va dezvolta exponențial în anii care urmează.

3. Tehnologii folosite

Începutul acestui capitol conturează cerințele unei aplicații pentru automatizarea unei case inteligente, atât din punct de vedere hardware, cât și software.

În cea de-a doua parte am prezentat microprocesorul Raspberry Pi, am făcut o comparație a acestuia cu sistemul Arduino Uno, prezentând avantajele și dezavantajele pe care acestea le oferă.

În continuare am prezentat limbajele de programare și softurile folosite, modul în care se diferențiază de soluțiile similare și motviul pentru care le-am ales.

3.1. Cerințe tehnologii

Pentru construirea unei aplicații web de automatizare a unei case trebuie alese tehnologiile potrivite. Există foarte multe alternative, însă factorii pe care i-am considerat cei mai importanți au fost stabilitatea și comunitatea care le sprijină tehnologiile analizate. Nu în ultimul rând, am ales și o serie de tehnologii care sunt actuale și căutate pe piața muncii.

În realizarea aplicației am folosit tehnologii open-source, care pot fi folosite de către orice dezvoltator în realizarea aplicațiilor.

Pe lânga limbajele folosite, un factor important de decizie a fost alegerea kitului de dezvoltare. În subcapitolul următor am prezentat motivul alegerii Raspberry Pi-ului și felul în care acesta se diferențiază de celelalte microcontrollere.

Pentru colectarea datelor de la senzori am ales limbajul Python datorită numeroaselor biblioteci, iar pentru stocarea datelor sistemul de bază de date MySQL.

PHP este limbajul ales pentru scripting pe partea de server, datorită popularității sale și a comunității puternice care îl sprijină. Laravel este un framework de PHP relativ tânăr, 2011, dar care câstigă mult în popularitate în ultimii ani.

3.2. Raspberry Pi

Fundația Raspberry Pi a fost fondată în anul 2009 în Regatul Unit al Marii Britanii cu scopul de a sprijini studierea în școli a informaticii.

Pentru această cauza au scos pe piață un kit care câstigă în popularitate pe zi ce trece și consider că aceasta creștere va fi una exponențială în perioada următoaredatorită apariției Internetului lucrurilor.

Pasionați de toate vârstele, din toată lumea, găsesc noi și noi întrebuințări pentru această placuță pe zi ce trece și își împart descoperirile cu întreagă comunitate open-source.

Controlul irigării unei sere, minatul de Bitcoin, cameră de supraveghere HD.

Acestea sunt doar câteva dintre aplicațiile care pot fi create cu ajutorul acestui microprocesor; în realitate, datorită faptului că poate fi folosit pentru muzică, jocuri, editare foto și procesare de text, precum și datorită numeroasele periferice ce se pot conecta la el, aplicațiile sunt nenumărate.

Acest fapt mă face să cred în potențialul acestui kit și în cele ce urmează voi face o comparație între Raspberry Pi și Arduino Uno.

Principala diferentă între Arduino și Raspberry Pi este dată de faptul că Arduino este un microcontroller, pe când Raspberry Pi-ul este un microprocesor.

În tabelul 1 avem o comparație între Modelul B+ Raspberry Pi utilizat în lucrare și Arduino Uno.[3][4]

Tabelul 1. Analiza comparativă a Raspberry Pi și Arduino Uno

Facând o analiză a configuratiilor celor două plăci de dezvoltare putem deduce urmatoarele:

Raspberry Pi-ul se aseamană cu calculatorul personal mai mult decât kit-ul Arduino, având în vedere specificațiile sale.

Raspberry Pi-ul este mai potrivit aplicaților cu interacțiune hardware limitată, dar complexă pe partea de software. Conectarea facilă la internet și faptul că poate fi programat cu o varietate mare de limbaje de programare, fac că Raspberry-ul să fie de preferat când creem aplicații care folosesc conectivitatea cu Internetul.

Pe de altă parte, după cum se poate vedea din tabelul de mai sus, Raspberry Pi nu are convertor ADC; din acest motiv se pot conecta doar senzori digital; kit-ul Arduino Uno are 6 pini analogici și 14 digitali. Arduino Uno este o soluție potrivită pentru o aplicație care are necesitatea unei conectivități hardware sporite.

În lucrarea de față, am considerat Raspberry Pi-ul ca fiind o soluție mai potrivită datorită necesitații găzduirii unui server web pe acesta, precum și realizarea aplicației într-un mod securizat utilizând limbajul PHP. În ceea ce privește intrările analogice ale kit-ului Raspberry Pi, acest neajuns l-am rezolvat prin SensorShield V3 care realizează o interfațare între kit-ul de bază și orice fel de senzor analogic, putând astfel sa le conectăm.

3.3. Python

Python este un limbaj de nivel înalt, portabil, înterpretat, orientat pe obiecte, extensibil și ușor incorporabil. Nu în ultimul rând, este un limbaj open-source apărut la începutul anilor 90, în jurul căruia s-a creat una dintre cele mai mari comunitați de pe web.

Este un limbaj simplu, de nivel înalt care face ca citirea unui program scris în Python să fie aproape ca citirea limbii engleze.

Faptul că Python este un limbaj interpretat, pe când C sau C++ sunt limbaje compilate, face ca acesta sa nu fie atât de rapid ca și codul C++, însa fiind un limbaj de nivel înalt face ca învatarea sa să fie ușoară și crearea de prototipuri să fie rapidă.

Pachetul standard Python conține un numar mare de module utile, parte din instalarea standard. Printre cele mai importante module se numără: modulul sys (funcționalitate specifică sistemului), modulul de logging (pentru a avea mesaje pentru debugg stocate).[7]

În această aplicație am folosit biblioteca strandard și am importat modulul spidev care permite interfațarea cu dispozitive SPI. Interfața SPI permite comunicarea serială, sincrona pe distanțe scurte.

Pachetul RPi.GPIO asigură o clasă de control a pinilor de intrare-ieșire pe un Raspberry Pi.

Pentru a scrie datele primite de la senzori în baza de date, am importat libraria sqlite3 care permite rularea de comenzi SQL pe tabelele bazei de date, pe baza datelor primite.

3.4. MySQL

Datele au devenit o resursă strategică foarte importantă pentru multe organizații nu doar din industrie, ci și din guvern și mediul academic. În mod tradițional, resursele de date au fost gestionate de către un sistem de prelucrare de fișiere care nu necesită tehnici speciale de gestionare a datelor.

Alternativ, datele sunt depozitate și manipulate de către un sistem de management al bazelor de date, iar nevoia de prelucrare a datelor a devenit explozivă.

Sistemele de baze de date sunt folosite pentru a descrie și organiza datele în sistemele informatice, acestea permițând organizarea unei cantitați mari de date aflate în interdependentă.

În cazul în care o bază de date este bine proiectată, informația se poate stoca, actualiza și accesa într-un mod facil.

Modelul de date relațional este un concept propus de către Edgar Frank Codd în anul 1970; acest concept reprezintă baza sistemelor de baze de date relaționale. MySQL este cel mai populular exponent al sistemelor relaționale și este open-source.

IBM poate fi creditat nu doar pentru inventarea bazelor de date relaționale ci si pentru dezvoltarea limbajului folosit pentru interacțiunea cu acestea SQL Structured Query Language. [8]

3.5. PHP

PHP provine de la Hypertext PreProcessor și este un limbaj de scripting pe partea de server, folosit pentru a genera conținut dinamic.

Acesta este un limbaj care a fost proiectat să fie ușor de încorporat în pagini HTML. Cele mai multe pagini PHP au cod PHP și cod HTML intrețesut.

În această aplicație am folosit framework-ul PHP Laravel pentru a realiza autentificarea utilizatorilor și pentru a gestiona datele primite de la senzori.

Deși înca tânăr, acest framework câștigă foarte mult teren în ultimii ani datorită modelulul MVC (Model, View, Controller) folosit pentru separarea codului, funcții pentru facilitarea rulării de interogări pe baza de date, autentificare, criptare de șiruri de caractere. [9]

3.6. Concluzii și contribuții

Munca depusă pentru redactarea acestui capitol a fost una de analiză a diferitelor tehnologii folosite în momentul de față și punerea în balanță a performaneței, a comunitășii și nu în ultimul rând a faptului că acestea sunt open-source.
Contribuția mea este atât comparația intre Raspberry Pi și Arduino Uno, cât și propunerea tehnologiilor care urmează a fi foloșite în realizarea sistemului.

4. Descrierea proiectului

Acest capitol conține descrierea proiectului în detaliu, prezentarea arhitecturilor generale, avantajele și dezavantajele fiecarei arhitecturi și oferă o imagine clară asupra cerințelor fiecărei tehnologii folosite, dar și a motivului abordării unei arhitecturi mai complexe.

În continuare voi prezenta instalarea și configurarea mediului de dezvoltare. Voi pleca de la conectarea la distanță prin SSH și prin VNCViewer, apoi voi parcurge pas cu pas instalarea aplicațiilor necesare pe server și pe Raspberry Pi, și voi prezenta configurația hardware necesara funcționării.

Următorul subcapitol oferă o imagine de ansamblu a modului de realizare a aplicației. Am avut în vedere subiecte precum proiectarea bazei de date, structura de directoare și fișiere a aplicației web și paradigma de codare pe care aceasta se bazează, modul de autentificare al utilizatorilor, culegerea datelor de la senzori, inserarea lor în baza de date și transmiterea datelor din baza de date a Raspberry Pi-ului pe cea a serverului.

4.1. Arhitectura generală

4.1.1. Propunere arhitecturi

În construierea aplicației am avut în vedere două arhitecturi bazate pe numărul de ansambluri ce se pot conecta . În figura următoare Fig. 1. este prezentată arhitectura pentru un singur set de senzori, iar în Fig. 2. cea pentru mai multe seturi de senzori.

Arhitectura pentru un singur set de senzori

Fig. 1. Arhitectura pentru un singur set de senzori

Aplicația pentru automatizarea unei case inteligente are la bază kit-ul Raspberry Pi. La acesta am conectat un număr de senzori analogici. Acești senzori sunt accesați printr-un script Python culege datele de la senzori printr-o buclă infinită de tip while. După executarea script-ului, acesta va ramăne în buclă infinită până la oprirea sistemului.

Deoarece pe echipamentul Raspberry Pi avem instalat un web-server, prin simpla accesare a IP-ului de pe orice dispozitiv, putem avea acces la datele furnizate de senzori.

Avantajul acestei arhitecturi în constituie simplitatea. Doarece avem serverul web, baza de date și aplicația web in aceeași locație, este facilă transmiterea datelor între acestea. Printr-un script scris în Python putem realiza întregul proces de colectare a datelor și inserția lor in baza de date, care este interogată pentru afișarea datelor.

Dezavantajul acestui tip de sistem este dat de faptul că întreaga aplicație se află pe Raspberry Pi;

Dacă acesta ar fi un mediu de producție, orice modificare adusă serverului sau aplicației, precum actualizarea de pachete, instalarea de versiuni noi ș.a.m.d, trebuie facute de către deținatorul Raspberry Pi-ului. Dacă utilizatorul întampină probleme, acesta va trebui să modifice singur, sau să apeleze la o echipa de suport care să se conecteze de la disțanță și să rezolve problema.

Acest dezavantaj a fost rezolvat parțial prin arhitectura din figura 2.

2. Arhitectura pentru mai multe seturi de senzori

Fig. 2. Arhitectura pentru mai multe seturi de senzori

Raspberry Pi-ul este un microprocesor și se aseamana mai mult cu calculatorul personal decât cu un microcontroller. Datorită spațiului mult mai mic pe care îl ocupa, performantele îi sunt limitate.

Urmatoarea arhitectură preia din încărcătura de pe Raspberry Pi și o pune pe un server care are o configurație mult mai bună. Serverul web, serverul de baze de date și aplicația Laravel se vor găsi pe acestă mașină, pe Raspberry Pi rămânând doar baza de date SQLite care preia datele de la senzori și care, la anumite intervale de timp, le trimite server-ului.

Pe lângă avantajul preluării sarcinii Raspberry Pi, arhitectura din figura 2 ne permite adăugarea a mai multor ansambluri, cu condiția ca in baza de date acestea sa fie unic identificate. Această problemă a fost soluționată prin proiectarea bazei de date într-un mod care permite identificarea măsurătorilor senzorilor unui utilizator în parte, și va fi prezentată în subcapitolul Stocare date.

4.1.2. Alegere arhitectură

Deși prima arhitectură este mai ușor de implementat, pentru realizarea practică a aplicației am ales să folosesc cea de-a doua arhitectură, cea pentru mai multe seturi de senzori.

Posibilitatea adăugării mai multor ansambluri în aplicație și provocarea proiectării unei baze de date care să permită identificarea datelor pentru fiecare utilizator, m-au făcut să aleg această arhitectură. O altă provocare ce apare odată cu alegerea acestei arhitecturi este transmiterea datelor pe serverul unde se găsește aplicația web.

4.2. Instalare și configurare mediu

4.2.1. Conectarea la distanță

Conectarea prin SSH

SSH provine de la Secure Shell și este un protocol criptat care inițiază sesiuni cu mașini virtuale aflate la distanță.

Acest tip de conectare este favorabil deoarece nu implică instalarea unui nou software, ci implică doar rularea unei comenzi care ne introduce în modul de lucru SSH.

Avem nevoie de adresa IP a serverului pentru a ne putea conecta; această adresă o putem afla prin rularea comenzii hostname -i de pe server:

Odată ce știm adresa IP, ne putem conecta rulând urmatoarea comandă:

unde danvidoni este numele de utilizator. Va urma o interogare de securitate yes/no urmată, în caz afirmativ, de cererea parolei.

Această metodă este una rapidă și nu necesită niciun fel de instalare de software adițional, însă avem acces doar la linia de comandă.

Conectarea prin VNC Viewer

VNC provine de la Virtual Network Computing, iar acest tip de conectare are avantajul vizualizării întregii interfațe grafice și nu doar a liniei de comandă, ca și în cazul SSH.

Primul pas este reprezentat de instalarea programului VNC Viewer (pe server). [10]

După instalare, la prima pornire setăm parolă care o vom folosi pentru conectarea prin VNCServer.

Având configurat server-ul putem începe o sesiune VNC pe afișajul :1, având rezoluția de 1024×728..

Pornim aplicația VNC Viewer de pe client și introducem adresa IP a mașinii aflate la distanța, urmată de afișajul pe care am pornit sesiunea VNC: <ip_server>:1

Astfel, avem acces și la interfata grafică de unde putem lansa în execuție și alte programe, spre exemplu de editare de imagini.

În cazul sistemelor Mac OSX, VNC Serverul vine în pachetul de bază și nu mai este nevoie să fie instalat.

4.2.2. Instalare server

SERVERUL WEB

Configurația serverului este următoarea:

Procesor Intel(R) Xeon(R) CPU ES-265a@ 2.60GHz

Memorie RAM 4GB

Memorie Hard Disk 20GB

Sistemul de operare Debian GNU/Linux versiunea 8

În realizarea aplicației am ales să folosesc suita LAMP, fiind cea mai răspandită suita open-source in momentul de față. Această suita a fost prezentată în capitolul 2.

Am utilizat ultima versiune stabila a fiecarei tehnologii necesare realizării aplicației server:

Server web: Apache 2.4.10

Server baze de date MySQL 5.5.43

Limbaj pentru PHP 5.6.7

scripting pe partea de server

În continuare voi prezenta instalarea server-ului web Apache 2.4.10 cu ajutorul utilitarului APT.

Folosind Debian GNU/Linux versiunea 8 avem acces la pachetele de bază care sunt disponibile la instalarea sistemului de operare. Aceste pachete le putem vizualiza folosind comanda dpkg -l:

Astfel putem observa că avem instalat pachetul APT (Advanced Packaging Tool), un pachet care

ne simplifică instalarea și ștergerea software-ului.

Înainte de instalarea Apache, am rulat comanda sudo apt-get update & sudo apt-get upgrade.

Prima parte a comenzii actualizează lista de pachete disponibile, dar nu instalează versiuni noi. Cea de-a doua parte a comenzii instalează versiuni mai noi ale pachetelor disponibile. Comanda se rulează în ordinea de mai sus, pentru ca actualizarea listei de pachete să se faca initial; În acest fel, instalarea de noi versiuni va lua în considerare și pachetele nou instalate.

În continuare pentru instalarea serverului web Apache este suficientă rularea comenzii:

La finalizarea instalării, modulul apache2 se inițializează singur, însă acesta poate fi inițializat prin comanda:

Această metodă de instalare, folosind sistemul de împachetare oferit de către sistemul de operare, este cea mai ușoara.

Putem verifica dacă serverul functionează introducând adresa IP a echipamentului într-un browser we. Aceasta ar trebui să afișeze o pagină goală cu următorul text: “It Works!”. Această pagină este una în format html și se găseste în urmatoarea locație /var/www/html/index.html.

Când introducem adresa IP a serverului într-un browser, acesta ne va trimite înapoi conținutul folderului /var/www/html. Dacă salvăm în fișierul nostru de hosts adresa IP a serverului putem să îi asociem un nume precum: 81.181.101.126 homeauto. Astfel putem accesa aplicația doar scriind homeauto în browser. De menționat este faptul că această schimbare rămâne salvată doar local, pentru ca oricine să poată accesa apicația server folosind numele “homeauto” avem nevoie ca acesta să fie înregistrat într-un server DNS (Domain Name System).

SERVERUL DE BAZE DE DATE

Asemănător serverului web, instalarea MySQL se poate face prin utilizarea APT sau prin descarcarea surselor de la adresa http://www.mysql.com/downloads/ .

Alături de instalarea serverului de baze de date, prin această comandă, se instalează pachetul php5-mysql care conține module pentru conectarea la baza de date direct din scriptul mysql.

Al treilea pachet libapache2-mod-auth-mysql este folosit pentru autentificarea HTTP pe baza unei informații stocate într-o baza de date MySQL.

Aceste două module sunt importante deoarece ne oferă conectivitatea între PHP și MySQL și oferă securitatea necesară unui asemenea sistem.

Pentru a porni serverul de baze de date este necesară următoarea comandă.

APLICAȚIA PHP

Pentru a instala framework-ul Laravel nu este suficientă rularea unei singure comenzi ca și în cazurile precedente. Acesta are nevoie de un instrument adițional care să administreze dependențele proiectului nostru.[11]

În documentația de instalare Laravel este recomandat managerul de dependențe Composer; acesta ne permite declararea și instalarea pachetelor de care depinde proiectul nostru, aceste pachete fiind instalate într-un director din proiectul nostru și nu global.

Pentru instalarea acestui instrument folosim comenzile:

Cea de-a doua comandă mută arhiva composer.phar în locația /usr/local/bin/composer .

Dupa instalarea Composer, pentru a crea un proiect nou Laravel mergem în locația dorită și rulăm comanda:

Pentru ca acest proiect să fie vizibil când accesam IP-ul serverului dintr-un browser, el trebuie să fie localizat în folderul /var/www/html; doar conținutul acestui folder poate fi accesat din browser, asigurând astfel securitatea datelor aflate pe server.

4.2.3 Hardware

Piesa centrală în această aplicație este Raspberry Pi-ul; acesta preia datele de la senzori, transmite comenzi către transmițătorul radio și către priza comandată, face sincronizarea cu baza de date de pe aplicația server.

În acest capitol voi prezenta în detaliu modul prin care Raspberry Pi-ul se conectează la internet și senzorii folosiți, felul în care senzorii sunt alimentați și legați la pinii de intrare/ieșire a Raspberry Pi-ului, și modul de culegere a datelor din mediul înconjurător.

Raspberry Pi

Așa cum a fost prezentat în capitolul Tehnologii folosite, Raspberry Pi-ul nu este un microcontroller ci un microrocessor. Modelul B+ prezintă un port Ethernet pentru conectarea la internet, însă acest mod de conectare vine o limitare a mobilitații acestuia. Astfel, pentru realizarea conexiunii la internet am folosit unul dintre cele patru porturi USB pe care le prezintă Raspberry Pi-ul. La acesta am conectat un adaptor WiFi CanaKit WiFi Dongle.

Pentru adaugarea informațiilor legate de rețea am modificat fișierul de configurare wpa_supplicant.conf prin comanda:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Aici am adăugat rețeaua Wi-Fi:

network = {

ssid=”<nume_retea>”

psk=”<parola_retea>”

}

Senzori

În această aplicație am folosit trei tipuri de senzori analogici: de temperatură, de lumină și de umiditate. Acesti senzori sunt interfațați cu Raspberry Pi prin intermediul SensorShield.

Senzorii folosiți în aplicație fiind analogici, SensorShield-ul este indispensabil, acesta realizează interfațarea senzorilor analogici cu Raspberry Pi-ul. Motivul pentru care SensorShield-ul folosește doar douazeci și șase de pini din cei patruzeci ai Raspberry Pi-ului este acela că el a fost conceput pentru modelul B. Modelul B+ aduce, printre altele, sporirea numarului de pini de intrare-ieșire, astfel încât rămân pini nefolosiți însă care se pot conecta la senzori digitali și folosi in paralel cu cei analogici. Configurația pinilor este prezentată în figura 3.

Fig. 3. Configurație pini

Fiecare senzor este conectat prin trei fire: unul de alimentare, al doilea la masă și al treilea la o intrare de pe SensorShield. Pentru senzorul de lumina și cel de umiditate, alimentarea se face la 3.3V pe când pentru cel de temperatură alimentarea se face la 5V.

Transmițătorul radio și priza telecomandată

În capitolele precedente am vorbit doar de nivelul corespunzător senzorilor care preiau datele din mediul înconjurator, însa fără a putea să avem vreun impact asupra lor.

În acest subcapitol voi prezenta modul ân care se realizează partea de automatizare a aplicației, prin care putem schimba mediul înconjurător și efectele pe care le putem observa prin intermediul datelor primite de la senzori.

Am ales să folosesc o priză telecomandată, deoarece acest tip de priză îți permite să pornești sau să oprești, de la distanță, nenumarați consumatori precum: aparat de climă, calorifer electric, lampă, ventilator și altele.

Transmițătorul radio

Transmițătorul se conectează ca și în cazul senzorilor analogici: alimentare, masa și ultimul la o intrare de pe SensorShield. Acest transmitator funcționează la aceeași frecvență cu priza și anume 434 MHz.[6]

Priza telecomandată

O problemă inițiala care se ridică când vorbim de prizele telecomandate în reprezintă îl reprezintă, într-un sistem cu mai multe prize, modul în care identificam priza pe care vrem să o comandăm.

Aceasta problemă își găsește soluția prin atribuirea unei adrese unice fiecăreia dintre ele. Aceasta adresa se poate configura folosind cele zece microswich-uri pe care le prezintă fiecare priză. Astfel se pot comanda = 1024 prize unice, utilizând un singur emitator.

Am configurat priza telecomandata astfel: swich-urile marcate cu 1, 2, 3, 4, 5, A vor fi pe ON, iar cele marcate cu B, C, D, E vor fi pe OFF. În figura 4 se poate observa această configurație:

Fig. 4. Configurația microswich-urilor

Pentru a porni priza executăm următoarea comandă:

./send 1111 1 1

iar pentru a o opri:

./send 11111 1 0

Astfel, se trasmit shell script-ului, în ambele cazuri, trei parametrii de tip numeric:

Starea microswich-urilor 1-5 reprezentată de grupul “11111” deoarece toate sunt ON

Starea microswich-urilor A-E reprezentată de cifra “1” deoarece doar A este ON

Starea prizei, “1” pentru ON iar “0” pentru OFF.

Astfel primii doi patrametrii sunt folosiți pentru a identifica priza careia se doreste sa i se schimbe starea iar al treila parametru reprezintă starea dorită. În cazul în care două prize au aceeași configurație a microswich-urilor, ambele vor primi comanda de pornire sau stingere.

4.3. Aplicația de gestionare a datelor primite de la senzori

In acest capitol voi prezenta etapele realizării aplicației, pornind de la proiectarea bazei de date, structura aplicatiei web si scripturile folosite.

4.3.1. Stocarea datelor

Datele provenite de la senzori le-am stocat într-o baza de date relatională. În proiectarea acestei baze de date am folosit principiile normalizării.

Nevoia normalizării se simte odată cu scalarea aplicației. Dacă pentru o aplicație de nivel redus nu simțim o diferentă notabilă asupra performanțelor, pentru o aplicație la scara larga necesitatea ei devine cruciala. Când am gândit baza de date pentru automatizarea de casă, m-am gândit și la scalarea ei la sute de utilizatori, fiecare având un numar variabil de senzori.

Dacă proiectarea bazei de date nu este foarte bine făcută pot aparea așa numitele anomalii precum:

Anomalii de inserție: are loc atunci când anuimite atribute nu pot fi inserate în baza de date fară prezența altor atribute

Anomalii de ștergere: are loc atunci când unele atribute sunt pierdute din cauza ștergerii altor atribute:

Anomalii de actualizare: apare atunci când una sau mai multe instanțe de date duplicate sunt actualizate dar nu toate sau când actualizarea unei înregistrări devine complicată inutil din cauza duplicării datelor.

Problema punerii relațiilor în forme normalee a fost investigată de mulți cercetatori de când E.F. Codd a inițiat subiectul in anul 1970. Categoriile incluse sunt:

Prima formă normala 1NF: dacă fiecare atribut al relatiei ia o singura valoare din domeniul sau de definitie.

A doua formă normală 2NF: dacă respectă 1NF și orice atribut care nu aparține cheii primare este total dependent funcțional de cheia primară.

A treia formă normală 3NF; aceasta forma este respectata în cazul în care relațiile respectă forma normală 2NF și nu exista dependențe tranzitive între atributele unei relații.

În mod tipic, pentru a fi respectată o formă de ordin superior, relațiile trebuie să respecte relațiile de ordin inferior. În practica comună se normalizează bazele de date până la forma 3NF. [13]

In normalizarea bazei de date am avut în vedere trei factori importanți:

Eliminarea anomaliilor

Necesitațiile de stocare

Timpul de răspuns

Metoda arborelui de decizie

Un arbore de decizie este o metodă de expresie a acțiunilor alternative, într-un mod cronologic. Nodurile reprezintă punctele de decizie pe când crengile reprezintă opțiunile posibile.

Modelul de cost și beneficii

Folosind modelul arborescent plecăm de la premise că normalizarea este întotdeauna benefica deoarece normalizarea duce de multe ori la reducerea anomaliilor și a necesitatilor de stocare. Însă, având în vedere al treilea factor anume, timpul de răspuns, normalizarea poate duce la degradarea acestuia pentru că, desparting în mai multe tabele, intrucțiunile de selecție se vor aplica pe mai multe tabele cu ajutorul unei operatii de tip Join. Astfel, trebuie avute în vedere atât aspectele positive cât și cele negative a unui proces de normalizare.[12]

Pentru normalizarea bazei de date am folosit metoda arborelui de decizie iar principiile pe baza cărora a fost proiectată baza de date sunt următoarele: un utilizator poate avea mai multi senzori, însă un sensor nu poate aparține de mai mult de un utilizator.

Pașii de normalizare:

1NF

Rolul primei forme normale este de a elemina grupurile repetitive prezente în relația noastra inițială, astfel plecând de la relația inițială R

Se poate observa faptul că măsuratorile formează un grup repetitiv, astfel rezultă următoarele relații:

2NF

Cea de+a doua formă normală are rolul de a elimina dependențele funcționale partiale însă acestea își au sensul doar în cazul în care există chei compuse. Astfel 2NF este satisfăcută fară a aduce vreo modificare.

3NF

Rolul ultimei forme normale este cel de a elimina dependențele tranzitive prezente în relațiile noastre. Astfel în tabelul măsurători putem observa prezența dependenței tranzitive numeSenzor și idMăsuratoare. Ducând astfel la următoarea structură tabelară:

Rolul normalizării în realizarea unei baze de date a unei aplicații este acela de a elimina anumite anomalii ce pot aparea. Exista trei tipuri de anomalii: anomalii de inserare, anomalii de ștergere și anomalii de actualizare. Folosind cele trei forme de normalizare 1NF, 2NF și 3NF, relațiile noastre inițiale vor fi optimizate permițând astfel scalarea aplicației fără riscul de a pierde date.

Tabelul utilizatori reține informațiile legate de fiecare utilizator înregistrat al aplicației, iar tabelul senzori conține informații legate de fiecare senzor. Prin această structură, fiecare senzor are o cheie primară unică idSenzor astfel nu se poate face confuzia între doi senzori de același tip apartinând a doi utilizatori diferiți.

Nu ne putem gândi la Internetul lucrurilor fără a ne gândi la o cantitate masiva de date. Astfel, am realizat o bază de date simpla la prima vedere, însa care se poate scala foarte mult. Un utilizator nu este limitat la un numar maxim de senzori. Contribuția mea este crearea unei structuri de baza, optimizată, care se poate scala la nivelul cerut de Internetul Lucrurilor.

4.3.2 Aplicația web

Din figura urmatoare se poate observa structura de directoare și fișiere a aplicației web responsabilă de autentificarea utilizatorilor și afișarea datelor.

Cele mai importante directoare sunt directorul app și directorul public. În directorul app se găsește codul pentru generarea view-urilor, controlerele, modelele, fișierul de rutare și fișierele de configurare pentru baza de date.

În folderul public se gasește fișierul index.php care este încărcat automat la accesarea aplicației, acest fișier conține doar date de rutare către alte fișiere și nu conține elemente care să genereze interfața grafică. Alături de fișierul index.php se gasește fișierul .htaccess; în acest fișier se gășeste motorul de rescriere a link-urilor sub forma unei navigări în directoare “/account/create”, “/account/changepassword”, “/account/signin”.

În interiorul fișierului database.php se pot crea conexiunile cu baza de date. În cadrul acestei aplicații deoarece avem și un server MySQL instalat pe aceeași mașina, pentru “host” vom introduce localhost și nu IP-ul mașinii.

'mysql' => array(

'driver' => 'mysql',

'host' => 'localhost',

'database' => ‘homeauto’,

'username' => ‘root’,

'password' => 'root',

'prefix' => '',

)

În figura 5 este prezentată structura de directoare și fișiere a aplicației Laravel.

Fig. 5. Structura de directoare și fișiere

Laravel folosește arhitectura MVC pentru separarea codului; aceasta duce la un cod foarte bine structurat. Structura codului este simplificată folosind acesta arhitectură, codul poate fi refolosit și în cazul unei modificări ulterioare este necesară o singura modificare într-o metoda.

În continuare voi prezenta principiile MVC și felul în care le-am aplicat în aplicația web.

Model-ul reprezinta datele, acesta nu este dependent de codul din controller sau din view. În aplicația mea codul model poate fi privit ca reprezentarea printr-un obiect a tabelului utilizatori. Folosind metode de tip getter putem accesa datele din tabel folosind acest model.

View-ul sau Vizualizarea reprezintă codul responsabil de afișarea datelor; acesta se ocupa strict cu afișarea, el nu realizează procesarea datelor. După cum se poate observa din structura de foldere, am introdus următoare vizualizare: home.blade.php, care afișează pagina de start cu mesajul “Vă rugăm să vă logați”.

Controller-ul înglobează codul responsabil de operațiile care pot fi realizate asupra datelor. Acesta preia datele din Model și acționeaza asupra lor. Câteva exemple de acțiuni: cripteaza un câmp, autentifica un utilizator pe baza parolei intrduse și pe baza datelor din baza de date.

Un alt fișier important este fișierul routes.php, așa cum îi sugerează și numele, acesta este responsabil de rutarea cererilor de utilizator. Luăm urmatoarea bucata de cod spre analiză:

Route::get('/account/sign-out', array(

'as' => 'account-sign-out',

'uses' => 'AccountController@getSignOut'

));

În fișierul routes.php definim ce acțiune să se facă atunci când utilizatorul trimite o cerere către server. În acest exemplu, dacă utilizatorul trimite o cerere de tip GET pentru pagina /account/sign-out, fișierul routes.php va redirecționa rularea codului către controller-ul responsabil pentru procesarea cererii de sign out. Astfel, următorul cod va intra în execuție:

public function getSignOut(){

Auth::logout();

return Redirect::route('first');

}

După procesarea cererii de log out, funcția getSignOut() redirecționeaza utilizatorul către prima pagina. Se poate spune că fișierul routes.php este fișierul care face legătura între vizualizări și controllere.

4.3.3. Autentificarea

De la apariția sa Internetul a schimbat felul în care comunicăm și în care vedem lumea împrejurul nostru. Prezența noastră pe internet crește pe zi ce trece, și conectarea casei la aceasta rețea ne duce cu un pas mai departe spre viziunea unor cercetători John Barrett sau John Chambers.

Datele capătă o importanță tot mai mare în aceasta lume nouă, securitatea lor devenind din ce în ce mai importantă. În cazul acestei aplicații, este nevoie de un nivel de securitate sporit, pe care l-am implementat printr-un modul de autentificare care să permită doar utilizatorului care posedă datele de autentificare, să-și acceseze datele corespunzatoare senzorilor proprii.

Autentificarea funcționează trimitând o interogare la baza de date unde parola este stocată, criptată sub forma unui șir de caractere. Pentru criptarea datelor am folosit o funcție Laravel, și anume: Hash.

Aceasta criptează datele folosind o funcție de criptare de tipul BCrypt. Astfel, trecând un parametru prin această funcție, rezultă un șir de 60 de caractere, indescifrabil chiar și pentru administrator.

$parola = Hash::make('parola');

Pentru a verifică autenticitatea parolei odată criptate, se folosește metoda check astfel:

if (Hash::check('parola', $ParolaCriptata))
{
// Parolele se potrivesc
}

Metoda check a obiectului Hash are doi parametrii, parola stocată ca și un șir de caractere și parola criptată BCrypt pe care o putem accesa din baza de date.

4.3.4. Culegerea datelor de la senzori

Următorul script Python este folosit pentru colectarea datelor de la senzori[5]:

import spidev

import time

import sqlite3

conn=sqlite3.connect(‘homeauto.sqlite’)

c=conn.cursor()
spi = spidev.SpiDev()

spi.open(0,0)

def readadc(adcnum):

if ((adcnum > 7) or (adcnum < 0)):

return -1

r=spi.xfer2([1,(8+adcnum)<<4,0])

adcout = ((r[1]&3) << 8) + r[2]

return adcout

whileTrue:
for-adcInput-in-range(0,8):
if adcInput!=2:

if adcInput=0:

value = readadc(adcInput)

c.execute(“instructiune insert lumina”)

else:

if adcInput=1:

value = readadc(adcInput)

c.execute(“instructiune insert umiditate”)

else:

value = readadc(adcInput)

c.execute(“instructiune insert temperatura”)

conn.commit()

time.sleep(10)

conn.close()

Bucla while primește argumentul True și astfel se formează o buclă infinită care culege datele prin funcția adcRead( ), face inserția în baza de date și așteaptă 10 secunde prin instrucțiunea time.sleep(10) până la următoarea iterație. Astfel, putem seta o perioadă de așteptare între citiri, pentru a nu încarca inutil baza de date.

Tabelul măsuratori din baza de date, conține un idenfitificator al măsurătorii, un identificator al senzorului, o valoare a măsurătorii și o coloana de tip timestamp care reține timpul în milisecunde la care s-a făcut inserarea.

5. Contribuții

5.1. Contribuții teoretice

Cea mai importantă contribuție teoretică a acestui proiect este munca de cercetare depusă pentru a analiza și a înțelege informațiile din literatura de specialitate. Acest sistem vine ca o soluție alternativă, la un preț mai redus, cu performanțe comparabile cu cele aflate pe piață în momentul de față.

O altă contribuție o reprezintă propunerea a două arhitecturi, diferite din punct de vedere al complexității de implementare, însă care sunt complementare în ceea ce privește avantajele și dezavantajele oferite. Dacă prima arhitectură propusă presupune utilizarea unui singur set de senzori, cea de-a doua crește complexitatea, însă poate fi comparată cu o aplicație comercială de sine stătătoare. Aceste arhitecturi reprezintă partea de inovație, de noutate, adusă în realizarea acestui sistem.

Prin această aplicație am atins doar vârful ghețarului în ceea ce privește posibilitatiile de automatizare ale unei case inteligente.

În viziunea mea, viitorul acestei aplicații este unul în care casa inteligentă recunoaște tipare în comportament și se adaptează nevoilor personale. De la pornirea automată a aparatului de cafea când ne trezim, păstrarea unei evidențe a alimentelor din frigider și generarea unui raport al acestuia, până la pornirea automată a climei când temperatura crește peste o valoare preferată, aceste aplicații ne vor încerca imaginția spre a crea o lume mai bună pentru noi și generațiile viitoare.

5.2. Contribuții practice

Contribuția practica adusă este implementarea întregului sistem. Acest sistem a fost proiectat asemenea unei aplicații comerciale și este comparabilă din punct de vedere al funcționalității cu soluțiile comerciale găsite pe piață, însa la un preț mult mai redus.

Daca sistemul termostat al celor de la Nest începe de la 249$, aplicația aceasta poate fi construita cu aproximativ 120$, reducând astfel costurile la mai puțin de jumătate.

Folosirea tehnologiilor open-source a dus la această scadere drastică de costuri, iar comunitatea din spatele fiecărei tehnologii folosite face ca soluția sa fie una eficientă și ușor de întreținut.

Din experiența proprie, dobândită lucrand în mediul IT, am observat problemele care apar dacă proiectarea unei baze de date nu este facută în conformitate cu principiile normalizării. Dacă aceste probleme nu se resimt la o încărcare scăzută, acestea apar ulterios, iar normalizarea devine un proces complex datorită dependențelor aparute ulterior. Astfel, consider că cea mai importanta contribuție practica a acestui proiect este proiectarea eficientă a unei baze de date care să suporte, o scalare eficientă și pentru un număr de utilizatori si senzori, limitat doar de performanțele server-ului.

În final, datele culese prin rularea sistemului reprezintă o resursă valoroasă pentru generarea unor statistici, care, odată interpretate vor rezulta în anumite tipare pe baza cărora se poate genera un comportament preferential în funcție de individ, devenind un sistem adaptiv.

6. Concluzii

Construirea unui sistem automatizat pentru casa inteligentă reprezintă o provocare atât de proiectare cât și de implementare. În realizarea acestui proiect am folosit atât cunoștiințele acumulate în anii de studiu precum și capacitatea de de înțelegere independentă a informațiilor acumulate din literatura de specialitate.

Principalele obiective ale acestei aplicații au fost analiza sistemelor automatizate pentru casa inteligentă, precum și implementarea sistemului. Obiectivele secundare constau în realizarea unei arhitecturi de bază care să suporte scalarea aplicației pentru mai mulți utilizatori.

Atât obiectivele principale cât și cele secundare au fost atinse. Realizarea sistemului a fost cea mai mare provocare, însă datorită vastelor comunități care sprijină fiecare tehnologie folosită am găsit soluții pentru toate problemele apărute.

Obiectivele personale pentru viitorul acestui proiect le reprezintă comandarea directă a unui dispozitiv, precum și îmbogățirea interfeței grafice pentru a oferi mai multe informații pe baza datelor culese de la senzori.

Pe termen lung, acest proiect poate oferi baza necesară urmatorilor studenți, dezvoltatori sau simplii entuziaști, care vor patrunde în aceasta zonă, a Internetului lucrurilor.

7. Bibliografie

[1] Dave Evans, The Internet of Things – How the Next Evolution of the Internet Is Changing Everything, Cisco, 2011

[2] Tong Li, Liping Chen, Internet of Things: Principle, Framework and Application, Tianjin University of Technology, China, 2011

[3] Adafruit Learning System, Raspberry Pi Model B+, foaie de catalog

[4] Arduino Uno, foaie de catalog

[5] Robofun, Rasperry Pi – SensorShield V3.pdf, http://www.robofun.ro/raspberry-pi-si-componente/sensor-shield-raspberry-pi-v3 06.06.2015

[6] Robofun, Rasperry Pi – Priza Telecomandata.pdf, http://www.robofun.ro/raspberry-pi-si-componente/telecomanda-prize-434MHz-daisypi-raspberry-pi 06.06.2015

[7] C. H. Swaroop, Python: A Byte of Python, 2003

[8] Seyed M.M. “Saied” Tahaghoghi, Hugh E. Williams, Learning MySQL, 2006

[9] Cristopher Cosentino, Advanced PHP For Web Professionals, 2003

[10] Raspberry Pi Foundation, Remote Access Raspberry Pi

https://www.raspberrypi.org/documentation/remote-access/vnc/ 08.06.2015

[11] Laravel Installation, The PHP Framework for Web Artisans

http://laravel.com/docs/4.2 25.05.2015

[12] Heeseok Lee, Justifying Database Normalization: A Cost/Benefit Model, 1994

[13] Shuguang Hong, A Method for Analyzing and Reducing Data Redundancy in Object-Oriented Databases, 1994

Similar Posts