Sunteți pe pagina 1din 56

UNIVERSITATEA ALEXANDRU IOAN CUZA IAŞI

FACULTATEA DE INFORMATICĂ

LUCRARE DE LICENȚĂ

SMART HOME SOLUTION

propusă de

Matei Andrei Mădălin

Coordonator științific

Adrian Iftene

Iulie 2019
UNIVERSITATEA ALEXANDRU IOAN CUZA IAŞI

FACULTATEA DE INFORMATICĂ

LUCRARE DE LICENŢĂ

SMART HOME SOLUTION

propusă de

Matei Andrei Mădălin

Coordonator științific

Adrian Iftene

Iulie 2019

2
DECLARAȚIE PRIVIND ORIGINALITATEA ȘI RESPECTAREA
DREPTURILOR DE AUTOR

Prin prezenta declar că Lucrarea de Licență cu titlul “​Smart home solution​” este scrisă de
mine și nu a fost prezentată niciodată la o altă facultate sau instituție de învățământ superior
din țară sau din străinătate. De asemenea, declar că toate sursele utilizate, inclusiv cele
preluate de pe Internet, sunt indicate în lucrare, cu respectarea regulilor de evitare a
plagiatului:

● toate fragmentele de text reproduse exact, chiar și în traducere proprie din altă limbă,
sunt scrise intre ghilimele și dețin referință precisă a sursei;
● reformularea în cuvinte proprii a textelor scrise de către alți autori deține referință
precisă;
● codul sursa, imagini etc. preluate din proiecte open-source sau alte surse sunt utilizate
cu respectarea drepturilor de autor și dețin referințe precise;
● rezumarea ideilor altor autori precizează referință precisă la textul original.

Iași,

Absolvent Matei Andrei Mădălin

3
DECLARAȚIE DE CONSIMȚĂMÂNT

Prin prezenta declar că sunt de acord ca Lucrarea de licența cu titlul “​Smart home
solution​”, codul sursă al programelor și celelalte conținuturi (grafice, multimedia, date de
test, etc) care însoțesc această lucrare sa fie utilizate în cadrul ​Facultății de Informatică​.
De asemenea, sunt de acord ca ​Facultatea de Informatică din cadrul Universității
Alexandru Ioan Cuza ​Iași ​să utilizeze, modifice, reproducă și să distribuie în scopuri
necomerciale programele-calculator, format executabil și sursă, realizate de mine în cadrul
prezentei lucrări de licență.

Iași,

Absolvent Matei Andrei Mădălin

4
Cuprins

1 ​Introducere 7
2 ​Contribuții 8
3​ Internet of things 9
3.1 Introducere 9
3.2 Istoric 10
3.3 Amazon Echo 10
3.4 Dispozitive de tip home-assistant asemănătoare 11
3.5 Raspberry Pi 12
3.6 Arduino 13
3.7 Dispozitive asemănătoare cu Raspberry Pi 14
3.7.1 Orange Pi 14
3.7.2 LattePanda 14
3.8 Concluzii 15
4 ​Aplicații similare 16
4.1 Ring Alarm 16
4.2 Smart Life 17
4.3 Smart TV Remote 18
4.4 Concluzii 18
5. ​Tehnologii utilizate 20
5.1 Introducere în Serverless 20
5.2 Azure functions 22
5.3 AWS Lambda 23
5.4 Amazon Alexa 24
5.4.1 Alexa Skill Service 25
5.4.2 Alexa Voice Service 26
5.4 Cosmos DB 28
5.5 Python Flask 29
5.6 .NET Core 30
5.7 Pushing Box 30
5.8 Concluzii 31

5
6. ​Dezvoltarea aplicației 32
6.1 Introducere 32
6.2 Voice Service 33
6.2.1 Definirea Intent-urilor 34
6.2.2 Definirea Solt-urilor 34
6.2.3 Definirea Utterances 35
6.3 Skill Service 35
6.3.1 Configurare Aws Lambda 36
6.3.2 Configurare Azure Function 37
6.3.4 Integrarea cu Cosmos DB 39
6.4 Raspberry Pi și Arduino 40
6.5 Pushing box 46
6.6 Testarea aplicației 48
6.6.1 Rularea locală 48
6.6.2 Teste de integrare 49
6.6.3 Alte metode de testare 50
6.7. Versionarea 50
6.8 Concluzii 51
7. ​Conferințe internaționale 52
8. ​Concluzii finale 53
8.1 Concluzii 53
8.2 Direcții de viitor 53
9. ​Bibliografie 54

6
1 Introducere
Lucrarea de licență, avându-și fundamentele în unul dintre cele mai bine dezvoltate
domenii IT din ultimii ani: IoT (“​internet of things1”), prezintă cum prin integrarea unor
sisteme bine cunoscute, ca ​Amazon Alexa2, ​Raspberry Pi3 și ​Arduino4, ajung să se
automatizeze câteva lucruri pe care un om normal le face în casă [2], [3]. Amintim aici:
interacțiunea cu televizorul, interacțiunea cu un dispozitiv electronic, în exemplul de fața: o
lampă, irigarea plantelor, dar și aflarea informațiilor ca temperatura și umiditatea din cameră,
totul prin interacțiune vocală.
Ideea pentru acest proiect a venit din dorința de a-mi automatiza unele procese pe care le
fac în casă, dar și din curiozitatea de a îmbină niște tehnologii care nu prea sunt folosite în
această combinație (​Microsoft Azure5 cu Amazon Alexa, lucru ce va fi dezbătut, mai amplu,
într-un ​capitol separat​) .
Inițial proiectul a fost gândit doar ca un mod eficient de a controla televizorul cu ajutorul
vocii, folosind tehnologia standard, cea de la Amazon. Cu timpul am realizat că potențialul de
extindere era foarte mare, așa că am mai adăugat noi senzori și un Arduino. În ultimă fază s-a
născut curiozitatea de a vedea potențialul aplicației dacă ​back-end​-ul acesteia este creat și
menținut pe altă platformă decât cea standard, în cazul de fața Azure.

1
​https://www.wired.co.uk/article/internet-of-things-what-is-explained-iot
2
​https://www.digitaltrends.com/home/what-is-amazons-alexa-and-what-can-it-do/
3
​https://www.raspberrypi.org/documentation/faqs/#introduction
4
​https://www.arduino.cc/en/Guide/HomePage
5
​https://azure.microsoft.com/en-us/overview/what-is-azure/
7
2 Contribuții
Ideea de a automatiza unele procese prin casă, nefiind una nouă, am ales să o fac într-un
mod cât mai unic alegându-mi singur tehnologiile, microcontrolerele împreună cu senzorii
dar și limbajele de programare, motivând riguros orice alegere.
Arhitectura aplicației, fără un grad foarte mare de complexitate, este făcută în totalitate
de mine, având ca reper design patern-urile studiate în facultate.
Toate librăriile pe care le-am folosit în aplicație, inclusiv cele pentru senzori sunt open
source, iar codul-sursa, în unele locuri, dacă este cazul, a fost împrumutat din documentația
oficială.
Aș dori să mulțumesc în special ​domnului coordonator de licență Adrian Iftene​,
pentru toată implicarea de care a dat dovadă pe parcursul pregătirii mele pentru examenul
de licență.

8
3 Internet of things

3.1 Introducere
Domeniul IT mai sus amintit, ​IoT ​(“internet of things”) a cunoscut o creștere masivă în
ultimii ani datorită creșterii numărului de dispozitive conectate la internet [4], [5], [6]. Nu sunt
de ignorat nici investițiile care s-au făcut în acest sector, după cum putem vedea în Figura 1 .

Figura 1. Investițiile făcute în sectorul “smart home”


https://www.bcg.com/publications/2018/mapping-smart-home-market.aspx

Evoluția domeniului poate fi văzută și în Figura 2, unde se observă că în anul 1992 deja
1,000,000 de dispozitive foloseau tehnologiile IoT6, în 2003 ajungându-se la jumătate de
miliard. Numărul dispozitivelor a crescut exponențial, în anul 2013 s-a ajuns la 28.4 miliarde
și se estimează că în anul 2020 acesta să crească la 50 de miliarde.

6
prescurtare pentru Internet of things
9
Figura 2. Internet of things expansion
https://www.mesh-net.co.uk/what-is-the-internet-of-things-iot/

3.2 Istoric
Ideea de dispozitive conectate apare încă de pe la începutul secolului 20, când omul de
știința ​Nikola Tesla​, într-un interviu, visează la “o lume conectată”, el aseamănă toate
conexiunile invizibile făcute intre dispozitive, referindu-se la telefonia mobilă, cu creierul
uman. Termenul însuși apare pentru prima dată în anul 1999, în cartea sa. ​Kevin Ashton
vorbește de internet of things în contextul introducerii cartelelor cu frecventa radio (​RFID7)
și eliminarea încuietorilor clasice [4], [7], [8]. În același an ​Gershenfeld ​prevestește evoluția
internetului (referindu-se la ​World Wide Web​) spunând că “​lucrurile încep să folosească
internetul iar oamenii nu mai au de ce să o facă​”.
Primele dispozitive inteligente interconectate au fost ​ATM​-urile, acestea erau conectate
printr-o rețea deja din anul 1974. Au fost urmate de aparate care distribuie mâncarea și
băutura la începutul anilor 1980.

3.3 Amazon Echo


Echo Do​t8 este răspunsul celor de la Amazon pe această piață, acesta folosește asistentul
vocal ​Alexa​, care printr-o interfață pusă la dispoziție de către Amazon se pot crea ​skill​-uri,
adică se poate învăța dispozitivul să răspundă la întrebări, să spună ghicitori, toată „memoria”

7
​https://www.abr.com/what-is-rfid-how-does-rfid-work/
8
​https://www.lifewire.com/amazon-dot-4149509
10
acestuia ținându-se în ​cloud9. În Figura 3 este prezentată varietatea dispozitivelor concepute
de Amazon.

Figura 3. Dispozitive de tip home-assistant produse de Amazon10

3.4 Dispozitive de tip home-assistant asemănătoare


Importante companii ale lumi, pe lângă Amazon, au început să dezvolte o serie de
dispozitive asemănătoare, cum ar fi ​Google Home11, ​Apple HomePod12, împreună cu
asistenții vocali proprii: ​Google Assistant13 și ​Siri14. Asistentul vocal al celor de la Amazon,
Alexa, se regăsește în majoritatea topurilor, după cum ne arată Figura 4.

Figura 4. Popularitatea asistenților vocali pentru găsirea și cumpărarea produselor


https://voicebot.ai/amazon-echo-alexa-stats/

9
​https://azure.microsoft.com/en-in/overview/what-is-cloud-computing/
10

https://medium.com/@onix_systems/adding-to-the-amazon-echo-family-echo-dot-and-amazon-tap-63
e218a17a5f
11
​https://store.google.com/gb/product/google_home
12
​https://www.apple.com/homepod/
13
​https://assistant.google.com/
14
​https://www.apple.com/siri/
11
3.5 Raspberry Pi

Raspberry Pi este un produs creat de o fundație bazată pe caritate, din Marea Britanie [2].
Acesta se aseamănă foarte mult cu calculatoarele convenționale (personal-computers) , cu o
mică mențiune, este de mărimea unui telefon, ceea ce îl face ultra portabil și ușor de instalat.
Este de remarcat faptul că acesta dispune de o putere computațională rezonabilă având un
procesor Quad-Core de 1,2 Ghz, 1 GB RAM și un accelerator grafic performant, specificațiile
fiind pentru modelul Raspberry Pi Model 3 B15. Pe partea de conectivitate el dispune de
Wireless LAN, Ethernet, Bluetooth, 1 port HDMI, 4 porturi USB și slot Micro SD. Sistemul
de operare oficial, pentru acest computer, este ​Raspbian16, o distribuție de ​Linux​.
Un aspect de remarcat la acest dispozitiv este prezența celor 40 de pini de tip ​GPIO17
(General-purpose input/output). Aceștia sunt folosiți, în principal, pentru a conecta noi senzori
și dispozitive, așa cum am demonstrat în partea practică a licenței.
De la lansarea sa din anul 2012, când a apărut Raspberry Pi Model 1, până acum, au apărut
multe varietăți ale acestuia, din punct de vedere al specificațiilor tehnice. Figura 5 prezintă
forma și amplasarea pinilor pentru Model 3 B.

Figura 5. Raspberry Pi Pinout Diagram


https://www.jameco.com/Jameco/workshop/circuitnotes/raspberry-pi-circuit-note.html

15
​https://www.raspberrypi.org/products/raspberry-pi-3-model-b/
16
​https://www.raspberrypi.org/downloads/raspbian/
17
​https://www.raspberrypi.org/documentation/usage/gpio/
12
3.6 Arduino
Arduino ​poate fi privit ca fratele mai mic a lui Raspberry Pi deoarece din punct de vedere
tehnic este mult mai limitat: 2 KB SRAM și procesor de 16 Mhz, pentru modelul UNO.
Acesta este un circuit integrat, open-source, care citește și trimite semnale prin intermediul
celor ​14 pini pe care ii are. Arduino vine cu foarte multe avantaje din punct de vedere al
costului, dar și al ușurinței cu care programatorul își configurează mediul de lucru, deoarece
nu are un sistem de operare propriu, acesta comunică cu calculatorul-gazdă prin intermediul
portului USB și al soft-ului pus la dispoziție, în documentația oficială: ​Arduino IDE18.
Un dezavantaj pentru Arduino ar fi lipsa varietății limbajelor de programare, acesta
rezumându-se doar la C++ și Java, ceea ce nu îl face accesibil pentru toți programatorii.
Figura 6 ilustrează poziționarea pinilor pentru Arduino, modelul UNO.

Figura 6. Arduino Uno Pin Diagram


https://components101.com/microcontrollers/arduino-uno

18
​https://www.arduino.cc/en/Main/Software
13
3.7 Dispozitive asemănătoare cu Raspberry Pi

3.7.1 Orange Pi
Orange Pi19 este foarte asemănător cu Raspberry Pi, având aproape aceleași dimensiuni,
cu mici variații. Diferența constă în faptul că Orange Pi are specificații tehnice considerabil
mai mari, printre care: un port SATA, un senzor de infraroșu și chiar capabilitate video 4K.
În Figura 7 este descrisă placa Orange Pi.

3.7.2 LattePanda
LattePanda20 face parte din gama de top al computerelor de dimensiuni reduse, cu un preț
considerabil mai mare decât a altor placi, aceasta devine o alegere potrivită când este nevoie
de mai multă putere computațională. Ca și specificații, se numără: sistemul de operare, care
este Windows 10 nativ, HD-ready, gesturi 3D, modelare 3D în timp real, 4G și chiar 8 GB de
RAM pentru modelul ​Alpha​. Figura 8 descrie o placă de tipul LattePanda.

Figura 7. Orange Pi Overview Figura 8. LattePanda Computer


https://www.aliexpress.com/item/Orange-Pi-PC-linux​ ​ https://www.lattepanda.com/
-and-android-mini-PC-Beyond-Raspberry-Pi-2/32448079125.html

19
​http://www.orangepi.org/
20
​https://www.lattepanda.com/
14
3.8 Concluzii
În această parte am încercat să subliniez unele elemente care au dus la dezvoltarea,
domeniului IoT, punctând inovațiile cu care marile companii au venit pe piață în acest
segment, împreună cu câteva soluții hardware ultra portabile folosite des în acest domeniu​.

15
4 Aplicații similare
Potențialul de dezvoltare este uriaș și foarte variat, astfel că există aplicații în majoritatea
domeniilor, spre exemplu: medical, social și logistic. Aplicațiile se clasifica în 3 mari
categorii și anume: cele de ​orașe inteligente​, cele pentru ​industrie​, și cele folosite de
utilizatorii obișnuiți: din ​domeniul sănătății și pentru ​casele inteligente​. În măriile orașe sunt
implementate sisteme inteligente care ajută cetățenii, astfel că nivelul de confort crește.
Câteva exemple de astfel de aplicații: sisteme inteligente de plați ale taxelor, sisteme
inteligente pentru parcare (care pot găsi și gestiona locurile de parcare libere), sisteme pentru
plata biletelor în mijloacele de transport. De asemenea, domeniul medical folosește intens
tehnologii pentru: urmărirea echipamentului medical, securizarea saloanelor din cadrul
spitalelor, urmărirea de la distanță a persoanelor cu dizabilități sau a diagnosticelor acestora.
În continuare vor fi prezentate câteva aplicații pentru îmbunătățirea traiului de zi cu zi, cele
folosite de utilizatorii obișnuiți.

4.1 Ring Alarm


Ring21 este o companie care comercializează diferite soluții de securitate pentru interiorul
și exteriorul locuințelor. Aceștia vând o gamă foarte largă de senzori cum ar fi: senzori de
mișcare, senzori de inundație, senzori de contact și pentru o mare varietate de camere, totul
pentru a asigura securitatea locuitorilor.
În magazinul de skill-uri ai celor de a Amazon se regăsește și aplicația Ring, care prin
adăugarea acesteia în contul utilizatorului, poate controla dispozitivele inteligente mai sus
menționate (Figura 9).
Prin Alexa se pot efectua o serie de comenzi către dispozitivele Ring cum ar fi: se pot
bloca / debloca uși și se pot cere informații despre senzorii aflați în funcțiune.

21
​https://eu.ring.com/
16
Figura 9. Aplicația Ring, Amazon Marketplace
https://www.amazon.com/Ring/dp/B01JTL2PYE/ref=lp_14284863011_1_1?s=digital-skills&ie=UTF8&qid=
1553686366&sr=1-1

4.2 Smart Life

O altă aplicație foarte populară în magazinul celor de la Amazon, fiind des utilizată de
persoanele care doresc sa își interconecteze dispozitivele inteligente din casă, este și ​Smart
Life22 (Figura 10). Aplicația presupune achiziționarea de pe web site-ul producătorului de
dispozitive inteligente, cum ar fi prize și întrerupătoare. Acestea se conectează la rețeaua de
internet prin wireless. Pe lângă produsele aflate pe site, alte firme din industrie, cum ar fi
Koolertron23 și ​Oittm24, produc multe dispozitive care se împerechează cu cele de la Smart
Life, printre care: camere și becuri inteligente. Skill-ul dezvoltat pentru această aplicație are
suport pentru majoritatea dispozitivelor, acestea fiind foarte ușor de controlat prin interacțiune
vocală.

Figura 10. Smart Life, Amazon Marketplace


https://www.amazon.com/Tuya-Inc-Smart-Life/dp/B01N1ZVI7M/ref=lp_14284863011_1_2?s=digital-skills&ie
=UTF8&qid=1553686366&sr=1-2

22
​https://www.smartlifeapp.net/
23
​https://www.koolertron.com/
24
​https://www.oittm.com/
17
4.3 Smart TV Remote

Smart TV Remote25 funcționează împreună cu telefonul utilizatorului, transformându-l


într-o telecomandă inteligentă pentru televizor. Pentru a putea utiliza skill-ul trebuie
descărcată aplicația cu același nume din magazinul ​Android ​(Figura 11). Aplicația are câteva
limitări, printre care: funcționează doar cu dispozitivele de la Android, și cel mai important
lucru: dispozitivul trebuie să aibă un senzor de ​infraroșu​, iar din păcate noile dispozitive nu
mai vin echipate cu un asemenea senzor.

Figura 11. Smart TV Remote, Amazon Marketplace


https://www.amazon.com/adiroid-Smart-TV-Remote/dp/B072NZRSMH/ref=lp_14284863011_1_6?s=digital
-skills&ie=UTF8&qid=1553686366&sr=1-6

4.4 Concluzii
În această parte am arătat cât de intens se face dezvoltarea pe acest segment, deoarece
magazinul Amazon e plin de astfel de aplicații care mai de care mai inovatoare. Punându-le
cap la cap aceste soluții sunt destul de scumpe dacă se achiziționează senzorii și camerele de
la producătorii aplicației. Am arătat că ideea mea, nefiind una noua, reușește să treacă peste
unele limitări pe care anumite aplicații le au în momentul de față: de exemplu aplicația Smart
TV Remote are probleme cu dependența de senzorul infraroșu și cu dependența de sistemul de
operare. O altă problemă pe care am dorit să o arăt este dependența de produsele
producătorului, deoarece în mare parte doar produsele lor (de exemplu becurile smart) se
potrivesc pe acele skill-uri.

25
​https://www.amazon.com/adiroid-Smart-TV-Remote/dp/B072NZRSMH
18
În continuare voi intra mai amănunțit în tehnologiile pe care le-am folosit, urmând ca în
secțiunile următoare să vorbesc și despre problemele cu care m-am întâlnit.

19
5. Tehnologii utilizate

5.1 Introducere în Serverless


Termenul de ​serverless26 a început să fie din în ce mai folosit în vocabularul
programatorilor web și nu numai, deoarece deschide ușa către noi arhitecturi în cloud.
Într-o aplicație web, în majoritatea cazurilor, cererile sunt rezolvate de către un server pe
care programatorul sau un angajat al firmei (de obicei ​DevOps27) trebuie să îl gestioneze și
configureze. Problemele în aplicațiile convenționale sunt numeroase deoarece fac
programatorul indirect responsabil de politicile de securitate pe care le impune serverul, de
gestionarea resurselor serverului, pe lângă acestea, se adaugă costurile de a ține server-ul
deschis chiar și atunci când acesta nu primește cereri de la utilizatori. Bineînțeles, cu o echipă
numeroasă și cu o finanțare suficientă aceste aspecte nu reprezintă o problemă reală, dar
pentru companiile mici acestea pot aduce probleme foarte mari. Companii mari ca: Microsoft,
Amazon și chiar Google oferă servicii care să scutească utilizatorii de a-și crea singuri
infrastructura.
Programarea serverless presupune executarea unei bucăți de cod prin alocarea dinamică a
resurselor. De obicei aceste porțiuni de cod sunt urcate și stocate în ​cloud ​în diferite
containere28. Aceste “​cloud-functions29” pot fi declanșate de diferiți factori în funcție de
necesitate. Câteva exemple de astfel de factori ar putea fi: o cerere ​HTTP​, diferite evenimente
în baza de date sau evenimente ce se pot executa periodic la un interval de timp. Figura 12
evidențiază timpul de viață al unei funcții în cloud.
Un alt aspect important care trebuie luat în considerare când vorbim despre arhitecturi în
cloud este cel legat de ​costuri​. Microsoft, spre exemplu, pentru serviciul său numit “Azure
functions” oferă două tipuri de planuri de plată care pot influența foarte mult o aplicație, în
funcție de necesitați.

26
​https://martinfowler.com/articles/serverless.html
27
​https://theagileadmin.com/what-is-devops/
28
​https://searchcloudsecurity.techtarget.com/feature/Cloud-containers-what-they-are-and-how-they-
work
29
​https://cloud.google.com/functions/
20
Figura 12. Azure-function Overview Diagram
https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale

Primul și cel mai folosit este ​consumption plan30, care așa cum îi spune și numele, taxează
clientul pentru câte resurse folosește funcția, această opțiune este foarte bună atunci când nu
se vrea ca funcția să fie tot timpul deschisă la cereri, ci să se poată porni doar când este nevoie
și să își aloce resursele în funcție de volumul cererilor.
Pe de altă parte, ​dedicated plan31, fiind unul mai scump, implică și folosirea unei mașini
virtuale care poate fi folosită oricând. Acest plan tarifar este o opțiune atunci când funcția
trebuie să servească tot timpul. Cele două planuri mai aduc în discuție un nou concept pentru
aceste funcții și anume acela de “​cold-start32”. Acesta presupune că atunci când o funcție nu
este folosită un anumit timp, de exemplu 15 minute, se oprește singură, conservând-și
resursele. Efectul de cold start apare la repornirea acesteia creându-se o întârziere de câteva
secunde, care poate influența negativ aplicația.
Este de notat faptul că în modul tarifar dedicat, cold start-ul nu există, deoarece aplicația nu
încearcă să își conserve resursele. Figura 13 prezintă deosebirile între cele două planuri.

30
​https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale
31
mai este numit și App Service Plan
32
​https://azure.microsoft.com/en-us/blog/understanding-serverless-cold-start/
21
Figura 13. Consumption Plan vs App Service Plan
https://www.slideshare.net/WinWire/azure-serverless-with-functions-logic-apps-and-event-grid

5.2 Azure functions

Microsoft a fost printre primii promotori ai arhitecturilor de tip “serverless”, astfel că


soluția lor în acest segment, denumită “​Azure Functions33” este o opțiune viabilă când se
pune problema unei arhitecturi de acest gen. Acest serviciu întrunește toate caracteristicile
mai sus prezentate, printre altele, Azure preia o serie din responsabilitățile programatorului:
pregătirea infrastructurii, probleme legate de “​deploy34” sau cele legate de scalabilitate.
Avantajele folosirii acestui serviciu sunt multiple. Azure, inițial a avut suport doar pentru
limbajele bine cunoscute din ecosistemul Microsoft: ​C#​, ​F#​. Ulterior au fost introduse o gamă
largă de limbaje, printre care : Java, Python, JavaScript, TypeScript, Php dar și PowerShell și
Bash. Alte avantaje pentru acest serviciu pot fi: posibilitatea de a plăti doar atunci când
funcția rulează, în conformitate cu planurile tarifare expuse în capitolul anterior, suportul
pentru manageri de pachete ca ​NPM35 și ​NuGet36, prin acestea se minimizează problema
dependințelor.
O metodă bună de comparare intre funcțiile “in cloud” o constituie tipurile de evenimente
care duc la declanșarea acestora. Pe lângă evenimentul obișnuit pe care marea majoritatea a
utilizatorilor îl vor folosi, ​HTTP Trigger​, Azure Functions aduce multe integrări cu celelalte

33
​https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview
34
​https://whatis.techtarget.com/definition/deploy
35
​https://www.npmjs.com/
36
​https://www.nuget.org/
22
servicii de la Azure, cum ar fi: Cosmos DB37, ​Event Hubs38, ​Event Grid39, Notification
Hubs40, ​Service Bu​s41, ​Storage42, ​Twilio 43(SMS messages).

5.3 AWS Lambda

Serviciul cel de la Amazon este foarte asemănător cu ceea ce s-a prezentat în capitolul
anterior. Singurele diferențe apar atunci când se dorește integrarea cu serviciile externe. AWS
Lambda se integrează cu majoritatea serviciilor de la Amazon, cum ar fi: ​S3 bucket44,
Dynamo DB45 sau ​Kinesis46 [1]. Serviciul are suport pentru ceva mai puține limbaje de
programare, printre acestea se numără: Python, Node.js, Ruby, Java, Go, .NET Core.
Aws Lambda și-a câștigat popularitatea în rândul dezvoltatorilor de aplicații, acesta fiind
cea mai folosită soluție de acest gen, așa cum arată Figura 14.

Figura 14. Platforms used for serverless applications


https://medium.freecodecamp.org/what-we-learned-by-serving-machine-learning-models-using-aws-lambda-
c70b303404a1

37
​https://docs.microsoft.com/en-us/azure/cosmos-db/introduction
38
​https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-about
39
​https://azure.microsoft.com/en-gb/services/event-grid/
40
​https://azure.microsoft.com/en-us/services/notification-hubs/
41
​https://azure.microsoft.com/en-gb/services/service-bus/
42
​https://azure.microsoft.com/en-us/services/storage/
43
​https://www.twilio.com/
44
​https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html
45
​https://aws.amazon.com/dynamodb/
46
​https://aws.amazon.com/kinesis/
23
5.4 Amazon Alexa
Alexa este asistentul virtual dezvoltat de către compania Amazon. Acesta se află printre cei
mai folosiți asistenți virtuali, alăturându-se lui Google Assistant​, ​Siri ​sau ​Cortana​. Aceasta
își trage numele de la vechea librărie din Alexandria, Amazon dorind să sublinieze cât de vast
este spațiul cloud din care aceasta își extrage skill-urile. Pentru a porni dispozitivul trebuie
rostită o fraza care se poate pre-configura în aplicație, cele mai folosita fiind: “​Hey Alexa​”,
“​Echo​”, “​Amazon​” sau “​Computer​”. Prin aplicația mobilă, în Figura 15, pusă la dispoziție
de Amazon, se poate configura dispozitivul fizic (Echo), se pot gestiona și vizualiza celelalte
dispozitive dar se pot trimite și comenzi către Alexa în cazul în care nu există acces la
dispozitivul fizic.

Figura 15.
Aplicația Amazon Alexa, telefon personal
Versiune 2.2
iPhone X
iOS 12.2

24
De-a lungul timpului Amazon, prin dispozitivele sale home assistant, a fost implicat în
numeroase scandaluri deoarece s-ar presupune că ar colecta date chiar și atunci când nu este
folosit de către utilizatori. În mod normal Alexa ascultă mereu pentru fraza care va trezi
dispozitivul, deci poate asculta și alte conversații. În acest moment singurul mod pentru a-l
opri să nu mai asculte ceea ce spun utilizatorii este apăsarea butonului fizic de “mute”. Există
chiar și un caz celebru în SUA, apărut în publicația ​The Guardian47, ​știrea spune cum o
persoană care a instalat becuri inteligente și dispozitive de la Amazon în toată casa, pentru a le
controla, a fost înregistrată de către acestea iar înregistrarea a fost trimisă spre un număr
necunoscut. Incidentul a fost confirmat și de serviciul clienți Amazon.

5.4.1 Alexa Skill Service

Privit din punct de vedere arhitectural, ​Skill Service48 reprezintă partea de ​back-end a
aplicației, locul unde este ținuta toată logica.Pentru a crea această componentă este nevoie de
un server ​HTTPS​, care să expună funcția. Privită din punct de vedere al implementării,
această componentă poate fi scrisă în orice limbaj de programare atât timp cât serverul sau un
subdomeniu al acestuia suportă protocolul de securitate ​Secure Sockets Layer49. În mod
implicit este selectat serviciul de la Amazon amintit anterior, AWS Lambda, deoarece
integrarea cu acesta se face foarte ușor [1].
Pentru a veni în ajutorul programatorului există și șabloane predefinite care au făcute
configurările necesare în ceea ce privește integrarea cu alte servicii. Există câteva șabloane de
acest gen, printre care: ​Video Skill50, ​Music Skill51 sau ​Flash Briefing Skill52. De exemplu
dacă se dorește creerea unui skill în care utilizatorul dorește să asculte muzică se poate folosi
Music Skill care va comunica deja cu un serviciu de cloud ales.

47
​https://www.theguardian.com/us
48
​https://developer.amazon.com/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html
49
​https://www.websecurity.symantec.com/security-topics/what-is-ssl-tls-https
50
​https://developer.amazon.com/docs/video/understand-the-video-skill-api.html
51
​https://developer.amazon.com/docs/music-skills/understand-the-music-skill-api.html
52
​https://developer.amazon.com/docs/flashbriefing/understand-the-flash-briefing-skill-api.html
25
5.4.2 Alexa Voice Service

Alexa Voice Service53 este un serviciul de la Amazon în care cererile, înainte să fie
procesate, sunt transformate în comenzi pentru Skill Service. Pentru a se efectua conversia
după ce cererea a fost servită, se folosește un limbaj asemănător cu ​HTML​.
Speech Synthesis Markup Language54 (SSML) este limbajul care face conversia cererii
într-un discurs. Acesta transformă mesajul după ce a fost procesat de către Skill Service
pentru a fi interpretat de dispozitivele fizice. Pentru a expune o caracteristică a discursului, de
exemplu: o pauză în vorbire, limbajul folosește etichete în partea din discurs care se dorește a
fi evidențiată. În Figura 16 este descris un obiect de tip răspuns returnat de Skill Service în
care există o pauză de vorbire de 3 secunde.

<speak>
There is a three second pause here <break time="3s"/>
then the speech continues.
</speak>

Figura 16. SSML Language, break tag Example.


https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#break

De asemenea, limbajul are suport pentru foarte multe etichete, de exemplu: “​audio”
poate reda un fișier MP3, “​emphasis” ​schimbă tonalitatea sau ridică tonul vorbirii în funcție
de atributele adăugate sau “​lang” ​prin care se specifică limba în care este discursul astfel
reproducerea acestuia se va face cu accentul din limba respectivă. Pe lângă acestea există și
etichete de tip efect cum este cel “​amazon:effect whispered”​, care va șopti mesajul, acesta
este evidențiat în Figura 17.

<speak>
I want to tell you a secret.
<amazon:effect name="whispered">I am not a real human.</amazon:effect>.
</speak>

Figura 17. SSML Language, amazon:effect tag Example.


https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html

53
​https://developer.amazon.com/alexa-voice-service
54
​https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-
reference.html
26
Pentru a antrena acest serviciu, programatorul, trebuie să furnizeze legături intre acțiuni și
propoziții pentru a se crea o comandă, aceste legături numindu-se “​intents”. ​Privit semantic,
un ​intent ​reprezintă o comandă venită de la utilizator în scopul de a fi procesată, din punct de
vedere al implementării, aceasta poate fi văzută ca o funcție care poate primi, opțional, un
slot. ​Pe lângă acestea, programatorul trebuie să mai furnizeze și modurile în care utilizatorul
aplicației poate reproduce comanda. Acest lucru este denumit ​utterances ​și reprezintă
mulțimea de fraze prin care utilizatorul folosește comanda. De exemplu pentru deschiderea
unei uși, un intent, poate fi ​OpenIntent, ​iar utternaces pot fi: “ open the dor​”, “ I’m home,
open up !​”, avantajul fiind ca putem refolosi acest intent și în alte contexte.
Slot-urile ​reprezintă cuvinte sau fraze cu informație variabilă. Un intent va primi ca
paramentu acest slot, și astfel poate procesa mai multe valori ale acestuia. În exemplul
anterior am folosit comanda “ open the dor”, pentru a mai adăuga un obiect fizic cu scopul de
a fi deschis, de exemplu un geam, intuiția naivă este creerea unei alte comenzi denumite
“open the window”, ceea ce este greșit deoarece codul se duplică și implicit mentenanța
devine mai dificilă. Pentru a rezolva aceasta problemă se creează un slot cu numele “​Obiect​”,
iar acesta va înregistra o listă cu obiectele care se doresc a fi deschise, în acest caz: geam și
ușă. Astfel, comandă se reduce doar la următoarea frază “ open the {Obiect}​”, și va fi
acționată pentru ambele obiecte.
Aceste două componente sunt vitale în cadrul funcționarii unui skill. Dacă pentru partea de
logică, ecosistemul Amazon este mai permisiv în ceea ce privește folosirea altor servicii decât
AWS Lamba, pe partea de Voice Service nu există atat de multă libertate. Pentru ca un skill să
funcționeze la capacitați maxime trebuiesc eforturi din ambele parții de dezvoltare, atât pe
partea de logică a aplicației cât și pe cea de procesare a vocii. Frazele care vor trezi aplicația
trebuie sa fie cât mai multe și mai variate, anticipând felul cum utilizatorul va folosi aplicația.
În Figura 18 este descris drumul cererii pornind de la dispozitivul fizic pana la server-ul
care o va procesa. Inițial, utilizatorul trimite o comandă către Amazon Echo, acesta este
procesat din limbaj natural într-o comandă prin Service Voice, cererea urmând să declanșeze
funcția de pe server, în cazul de față prin serviciul AWS Lambda [1].

27
Figura 18 Alexa Skill and Alexa Voice Interaction
https://developer.amazon.com/blogs/post/Tx27NAUCY0KQ34D/Rapidly-Create-Your-Alexa-Skill-Backend-
with-AWS-CloudFormation

5.4 Cosmos DB
Azure Cosmos DB55 ​este un serviciu oferit de Microsoft care oferă suport pentru lucrul cu
bazele de date. Pentru ca o aplicație să răspundă într-un timp cât mai bun, instanțe ale acesteia
trebuie să se afle în mai multe parți ale lumii. Acest serviciu garantează distribuirea globală și
replicarea bazelor de date dintr-o aplicație. Din punct de vedere al ​scalabilități ​Cosmos DB
lasă utilizatorul să își scaleze aplicația pe ​mai multe regiuni puse la dispozitive de Microsoft.
În momentul de fața există suport API pentru următoarele tipuri de baze de date: SQL, Mongo
DB56 , Cassandra57, Gremlin58. Ca și benefici notabile, se pot regăsi: timpul de ​uptime ​este de
99,999%, posibilitatea de a adaugă noi regiuni pentru replicarea bazei de date doar prin
apăsarea unui buton în portalul Azure, toate datele ținute sunt encriptate și există autorizare la
nivel de rând (​row-level authorization​). Figura 19 descrie o vedere de ansamblu asupra
acestui serviciu.

55
​https://docs.microsoft.com/en-us/azure/cosmos-db/introduction
56
​https://www.mongodb.com/
57
​http://cassandra.apache.org/
58
​http://tinkerpop.apache.org/docs/current/reference/
28
Figura 19. Cosmos DB Overview
https://docs.microsoft.com/en-us/azure/cosmos-db/introduction

5.5 Python Flask


Flask este un ​microframework ​folosit în special pentru dezvoltare web pe partea de
59

back-end. Acesta vine cu o varietate de librarii și utilitare care au rolul de a ajuta


programatorul.
Un microframework este acea structură dedicată pentru construirea aplicațiilor care nu are
dependințe fața librăriile externe. Un avantaj considerabil este acela că astfel de structuri nu
necesită actualizări periodice și astfel scade posibiltatea de introducere a unor ​bug​-uri. Un
dezavantaj de luat în calcul este acela că pentru unele operații mai complexe, programatorul
va trebui sa depună mai mult efort deoarece nu există utilitare pentru orice. Acest lucru se
poate rezolva prin adăugarea manuală de module care va duce la creșterea dependințelor.
Figura 20 descrie o porțiune de cod care va expune pe mașina locală un ​API ​care va servi
cererile printr-un ​endpoint​.

59
​https://pymbook.readthedocs.io/en/latest/flask.html
29
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run(debug=True)

Figura 20. Flask Python “Hello World” Web API.


https://medium.com/python-pandemonium/build-simple-restful-api-with-python-and-flask-part-1-fae9ff66a706

5.6 .NET Core


.Net Core60 este o platformă de dezvoltare creată și menținută de Microsoft cu scopul de a
crea aplicații care să ruleze pe mai multe sisteme de operare. Este o platformă ce folosește ca
și limbaj de programare oficial ​C# iar calitatea de cross-platform ajuta aplicațiile să ruleze pe
Windows, Linux și macOS.
Această platformă a apărut din necesitatea programatorilor de a se detașa de sistemul de
operare Windows. În anul 2004 un inginer, ​Miguez de Icaza​, a început proiectul ​Mono​.
Acesta avea ca scop rularea de aplicații scrise pe platforma .NET pe alte sisteme de operare
decât Windows. Prin acest proiect o echipă relativ mică a reușit să rescrie .NET Framework,
cel suportat oficial de către Windows, în C++ pentru Linux. Ulterior a fost portat și pe
macOS.

5.7 Pushing Box


Pushing Box61 este un serviciu bazat pe cloud care are rolul de a trimite notificări pe
diferite dispozitive. Acest serviciu este gratuit în limita a 1000 de cereri pe zi. Configurarea e
foarte facilă, totul făcându-se dintr-o aplicație web. Pushing Box oferă servicii de notificare
pentru următoarele: notificări direct pe dispozitivul mobil printr-o aplicație nativă,
PushBullet ​(pentru iOS, Android, Windwos Mobile), notificări pe ​Twitter ​și prin ​email​.

60
​https://docs.microsoft.com/en-us/dotnet/core/
61
​https://www.pushingbox.com/
30
5.8 Concluzii

Capitolele mai sus prezentate au rolul de a face o scurtă introducere în tehnologiile pe care
am ales să le folosesc, motivația riguroasă existând în capitolul dedicat dezvoltării aplicației.
Noțiunile prezentate întrunesc abilitățile pe care le am dezvoltat lucrând la lucrarea de licență.
În continuare am ales să intru treptat printre pașii care au dus la dezvoltarea aplicației de la
partea practică.

31
6. Dezvoltarea aplicației

6.1 Introducere
Acest capitol este dedicat întregii arhitecturi a aplicației împreună cu componentele și
interacțiunea dintre acestea. În continuare am ales să mă concentrez asupra serviciilor pe care
le am utilizat, cazurile de folosire ale aplicației, modul de testare dar și motivarea alegerilor
făcute, din punct de vedere tehnic.
Câteva puncte cheie care vor fi acoperite aici sunt următoarele:
● modul de configurare al serviciului Voice Service
● modul de interacțiune cu partea de business a aplicației folosind cele două soluții de
tip serverless: Aws Lambda și Azure Functions
● cum se face colectarea de date pentru fiecare acțiune a unui utilizator
● cum se realizează comunicarea cu Raspberry Pi și Arduino
● utilitatea și necesitatea senzorilor prezenți în proiect
● modul prin care un utilizator este notificat de o acțiune care se petrece în casa acestuia
● alte puncte sensibile ca de pildă: ​NFR 62 ​(non-functional requirements)

În Figura 20 este prezentată o viziune de ansamblu asupra arhitecturii aplicației subliniind


elementele cheie care au dus la realizarea acesteia.

62
​https://www.scaledagileframework.com/nonfunctional-requirements/
32
Figura 20. Arhitectura aplicației

6.2 Voice Service


Așa cum am menționat anterior, această parte se ocupă cu prelucrarea limbajului natural și
transformarea acestuia în comenzi pe care partea de ​business ​a aplicației le înțelege. Inițial, în
cazul în care s-a achiziționat un dispozitiv fizic: de exemplu Echo Dot, utilizatorul este
îndrumat spre pagina de unde poate începe sa creeze noi abilitați pentru Alexa:
https://developer.amazon.com/alexa/​. După introducerea numelui abilității și a
limbii, utilizatorul are opțiunea de a selecta un șablon predefinit cu configurări pentru diferite
domenii de interes: Music, Video dar și o versiune mai simplificată pentru Smart Home. La
alegerea variantei ​Custom ​se creează un skill fără nicio facilitate predefinita de aplicație.
Numele aplicației servește drept mod prin care aceasta poate fi invocată în cadrul aplicației,

33
astfel că utilizatorul va trebuie să rostească comenzi de genul: “open smart home”, “ask smart
home” iar aplicația va fi lansată.

6.2.1 Definirea Intent-urilor


Intent-urile definesc acțiunile pe care aplicația în cauză le poate executa. În Figura 21 este
afișată o captură din portal cu acțiunile pe care le poate executa aplicația.

Figura 21. Captură de ecran cu intent-urile aferente aplicației din portalul


https://developer.amazon.com/

După cum se poate observa aplicația, în mod implicit, creează câteva asemenea acțiuni
care vor fi tratate în partea a două a aplicației. Printre acestea se numără cele de oprire a
aplicației (AMAZON.StopIntent) cea pentru a opri o acțiune în derulare
(AMAZON.CancelIntent) dar și cea pentru a cere ajutor (AMAZON.HelpIntent). Pe lângă
acestea, am avut nevoie de următoarele, pentru a-mi construi aplicația: ​TurnOnIntent ​și
TurnOffIntent​, folosite în cazul televizorului dar și în cazul becului, ​CustomCommand​,
folosită pentru a executa comenzile diferite de pornire/oprire pentru televizor,
GetInformations ​(pentru a cere informații cu privire la temperatură și umiditatea ambientală)
iar ultima, ​WaterFlower​, este cea care va fi folosită pentru acționarea pompei de apa.

6.2.2 Definirea Solt-urilor


Pentru a-mi ușura munca și a nu duplica codul, cat și alte intent-uri, am folosit facilitatea
oferită de portal numită ​slot​. Prin acestea am definit o serie de dispozitive pe care acțiunile

34
mele le primesc ca paramentu, astfel am reușit să câștig timp și să îmi structurez mai bine
codul. În Figura 22 sunt cele două slot-uri pe care le am creat.

Figura 22. Captură de ecran cu slot-urile utilizate

Cele două conțin câte o listă cu dispozitive, în cazul lui ​Device ​și cu comenzi în cazul
lui ​Command​. Pentru a putea refolosi TurnOnIntent și TurnOffIntent am ales să ii trimit ca
și paramentu un Device care tine o listă cu următoarele: ​tv ​și ​light​, astfel am profitat la
maximum de acesta și nu am adus complexitate inutilă. Următorul slot conține o listă de
comenzi, pe care utilizatorul le poate da televizorului, pe lângă cele ce pornire/oprire, acestea
ar fi: volume up, volume down, channel up, channel down, mute si unmute. În cadrul acestor
slot-uri se poate defini și un dicționar pentru sinonime pentru a acoperi o gamă mai largă de
fraze.

6.2.3 Definirea Utterances


Acestea sunt frazele pe care efectiv, utlizatorul, le va rosti pentru a putea trezi o acțiune,
mai sus definită. Este de precizat că acestea să fie cât mai diversificate și să accepte cât mai
multe variații de la invocația de bază, de exemplu: “​Turn on the tv”​ (tv are asociat un
dicționar de sinonime), “​Turn on the television”​ , astfel utilizatorul nu trebuie să memoreze
frazele, iar acestea vor veni natural. Este de remarcat faptul că în funcție de versiunea
limbajului de programare, felul cum trebuie spuse aceste fraze și cum trebuiesc legate de
numele aplicație pot ușor varia, astfel că o paralelă de acest gen va fi discutată în sub
capitolele următoare.

6.3 Skill Service

În această parte este tratată logica aplicației și modul de interacțiune cu serviciul de voce.
Ca și limbaj de programare am folosit .NET Core datorită cunoștințelor acumulate în cadrul
facultății, dar și a faptului că e o tehnologie în care Microsoft investește masiv, deci
dezvoltarea se face intens. Inițial, când am început lucrul pentru aplicație nu exista suport
pentru .NET Core 2.0, asa că am optat pentru varianta 1.0. Aceasta a fost oficial marcată de

35
catre Amazon ca fiind ​deprecated63 ​în aprilie 2019, așa că am trecut pe noua versiune. Ca și
diferențe notabile, strict în cadrul aplicației mele, este modul cum trebuie spusă invocarea
aplicației urmată de comandă. Un exemplu este acesta: în versiunea .NET Core 1.0 trebuia
repetat de fiecare dată numele aplicației când se dorea ca aceasta să execute o comandă: “​ask
smart home turn on the light”, “​ask smart home turn on the tv”. Comparativ, în versiunea
.NET Core 2.0 acest lucru a fost rezolvat astfel că acum totul se reduce la deschidea aplicației,
rostindu-i numele, iar apoi doar numele comenzii. În cazul meu, scenariul este următorul:
“​open smart home​”, “turn on the light”, “turn on the tv”.

6.3.1 Configurare Aws Lambda

Pentru a putea crea o astfel de funcție, utilizatorul, are nevoie de un cont pe pagina
dedicată Amazon Aws: ​https://aws.amazon.com/​. Aici trebuie introdus numele
funcției, limbajul de programare, și unele permisiuni pentru aceasta. Figura 23 prezintă o
captură de ecran cu funcțiile mele în acest moment de pe portalul Aws Lambda, cele două cu
versiunile aferente.

Figura 23. Captură de ecran din portalul Aws Lambda.

Pentru a putea face ​deploy ​la cod în cadrul aplicației, este foarte important să creăm
un cont cu drepturi din serviciul ​IAM​. Pentru a face acest lucru trebuie să creăm un grup care
va avea toate permisiunile de care utilizatorul are nevoie, în cazul acesta, tipul este
AdministratorAcces​. După creerea grupului, contul creat inițial trebuie asignat la acest grup
iar apoi se vor genera un ​Access Key Id și un ​Secret Access key​. În Figura 24 am arătat cum
arată ultima pagină din această configurare.

63
​https://techterms.com/definition/deprecated
36
Figura 24. Configurare de user și roluri în IAM

Pentru a lucra și a face efectiv deploy, eu am ales să folosesc cel mai puternic ​IDE ​pe
care Microsoft îl pune la dispoziția utilizatorilor: ​Microsoft Visual Studio​. Pentru partea de
deploy, după ce se instalează o extensie din magazinul Microsoft, trebuiesc introduse cele
două coduri generate anterior. Acum deploy-ul se poate realiza doar cu apăsarea butonului
“​Publish on Aws Lamda​”. În Figura 25 este fereastra care apare când se dorește publicarea
funcției.

Figura 25. Modul cum se face deploy în Aws Lambda folosind Visual Studio

6.3.2 Configurare Azure Function

Pentru această parte este necesar un cont pe ​https://portal.azure.com. ​Odată


ajuns aici este necesar să creăm un resource group​, asemănător celui de la Aws Lambda. Cea
mai importantă parte este cea legată de planul de consum pe care îl selectăm, în funcție de
avantajele și dezavantajele discutate în capitolul legat de tehnologii. Din nou, și pentru această

37
parte am ales să folosesc Visual Studio pentru a face deploy-ul efectiv către Azure. Integrarea
cu acesta este garantată de IDE, fără alte utilitare ​spre deosebire de cazul precedent​. În
Figura 26 este o captură de ecran cu fereastra din care se face publicarea aplicației.

Figura 26. Modul cum se face deploy din Visual Studio către Azure

Odată publicată o astfel de funcție, utilizatorul are opțiunea de a intra pe portalul Azure la
secțiunea ​Function Apps​. Acolo poate găsi, pe lângă metrici legate de funcție (consum,
tariful), și legătura (link-ul) către aceasta. În Figura 27 este o captură de ecran din portal.

Figura 27. Captură de ecran din portalul Azure, secțiunea Function Apps

6.3.3 Integrarea cu Voice Service


Pentru ca funcțiile descrise mai sus să comunice cu serviciul de voce, acestea trebuie să
știe să capteze și să trateze diferit cererile în funcție de niște parametri: tipul de cerere, tipul
de intent dar și tipul de slot. Răspunsul oferit de funcție este o combinație a acestora.
În .Net Core, pachetul Alexa.Net, cererile venit de la Alexa pot fi de doua feluri:
LaunchRequest, ​aceasta va fi cererea care întâmpină utilizatorul când aplicația este deschisă
și oferă câteva informații despre ce e capabilă să facă aplicația. Prin ​IntentRequest ​putem

38
diferenția cererile, și astfel aplicația va știi că am primit o cerere diferită de cea de prezentare,
iar prin urmare aceasta trebuie să o trateze corect. Obiectul de tip ​IntentRequest ​conține
atributul de tip ​Intent, ​astfel că în funcție de atributul ​Name ​al acestuia putem diferenția ce
tip de intent primește aplicația. În cazul ​slot-urilor​, lucrurile stau asemănător. Obiectul Intent
descris mai sus are ca și atribut un dicționar (​nume​, ​valoare​), iar prin acesta putem accesa
valoarea unui intent prin numele acestuia. În Figura 28 este descrisă o porțiune dintr-un ​JSON
64
​din cererea servită de către funcție, mai exact modul cum se pornește aplicația.

"request": {
"type": "LaunchRequest",
"requestId":
"amzn1.echo-api.request.5beccfb8-aaa0-41b7-b57e-17153cab798d",
"timestamp": "2019-05-06T05:24:56Z",
"locale": "en-US",
"shouldLinkResultBeReturned": false
}
Figura 28. Porțiune dintr-o cerere

6.3.4 Integrarea cu Cosmos DB


Am ales să loghez toate cererile într-o bază de date deoarece, pe viitor, ca și posibilitate de
a continua aplicația, se pot rula algoritmi de învățare automată pe aceste date cu scopul de a
învață unele tendințe ale utilizatorului: postul preferat, ora când dorește sa deschidă
televizorul sau lumina în cameră. Integrarea cu Cosmos DB este una facilă, datele de
autentificare se iau dintr-un fișier local (când se testează aplicația local), iar când aplicația este
trimisă către serviciul Azure datele se vor lua dintr-un registru de variabile asemănător cu cel
de pe Windows (​environment variables​). Fiecare funcție are un asemena registru care e
izolat de celelalte funcții, iar aici se pot stoca date sensibile: de la parole la coduri de
conectare pentru baze de date (​connection strings​). Ca și ​design patern am ales să folosesc
Repository65. ​Acesta este folosit pentru a face abstracție de partea de aplicație în care se
tratează efectiv cererile venite de la serviciul de voce și se concentrează strict pe conectarea și
efectuarea de operații ​CRUD66 ​pe baza de date. În Figura 29 este o captură de ecran din
portalul Azure, secțiunea Cosmos DB. Prin interogarea bazei de date se observa datele
colectate de acestea: data, tipul de intent (ceea ce a dorit să facă utilizatorul) și dispozitivul.
Aceste date sunt foarte folositoare în eventualitatea utilizării unui algoritm de învățare
automată.

64
JavaScript Object Notation
65
​https://medium.com/@pererikbergman/repository-design-pattern-e28c0f3e4a30
66
​https://fiware-tutorials.readthedocs.io/en/latest/crud-operations/index.html
39
Figura 29. Captură de ecran din portalul Azure, secțiunea Cosmos DB

6.4 Raspberry Pi și Arduino

Inițial, când am început aplicația de licență placa integrată Raspberry Pi nu făcea parte din
arhitectura sau din planurile de viitor pentru aceasta. O problemă cu care m-am confruntat a
fost: să conectez placa Arduino la internet, deoarece acesta nu vine cu un modul de rețea
atașat. O altă problema a fost ca după conectarea acestuia la internet, exista o oarecare
dificultate în efectuarea cererilor și în primirea răspunsurile HTTP, deoarece biblioteca nu are
foarte multa documentație și nici suport pentru programare orientată obiect. Această problemă
a fost rezolvată de Raspberry Pi. Prin el problema cererilor și a răspunsurilor a fost rezolvată
prin mai multe moduri: ​în primul rând, există opțiunea de a-l conecta la o rețea fie prin
Wi-Fi​, fie cu cablu, prin ​Ethernet​. ​În al doilea rând, ​varietatea limbajelor de programare
este mult mai mare în comparație cu Arduino care suporta doar C. Pentru aceasta, am ales să
folosesc limbajul de programare Python, versiunea 3.7 deoarece este indicat pentru aplicații
de această dimensiune, dar și datorită framework-ului ​Flask ​(despre care am discutat mai
sus). O altă metodă de comparație intre cele două micro controlere o reprezintă și viteaza cu
care poți efectiv crea o aplicație/serviciu prin acestea. La acest capitol, cu Arduino mi-a fost
mult mai ușor, deoarece se conectează doar cu cablul USB la computer-ul personal, iar prin
aplicația dedicată se trimit datele la el. În contrast, la Raspberry Pi, avem nevoie de o imagine
a unui sistem de operare, Raspbian, iar în esență trebuie efectuați pașii asemănătorii instalării
oricărui altui sistem de operare. Din aceste doua idei rezultă faptul că timpul efectiv pentru

40
instala una dintre cele două este considerabil mai mare la Raspberry, date fiind și specificațiile
tehnicile ale acestuia. Comunicarea cu el s-a făcut facil prin aplicația ​VNC Viewer67 prin
introducerea adresei acestuia cat și a contului creat pe mașină. În figura 30 este prezentată o
captură de ecran din aplicație. După cum se poate observa, interfața sistemului de operare se
aseamănă cu Linux, dat fiind faptul că este o distribuție a acestuia. O altă metodă de
comunicare mai eficientă atunci când nu dorește interacțiunea cu ecranul plăcii, ci doar
trimiterea de comenzi de tip ​bash, ​la linia de comanda, este și ​PuTTY68, care se conectează
prin protocolul ​SSH69, la portul 22. În figura 31 este o captură de ecran cu acestă aplicație.

Figura 30. Captură de ecran din aplicația VNC Viewer

67
​https://www.realvnc.com/en/connect/features/
68
​https://www.chiark.greenend.org.uk/~sgtatham/putty/
69
​https://searchsecurity.techtarget.com/definition/Secure-Shell
41
Figura 31. Captură de ecran din aplicația PuTTY

Tot pentru a-mi ușura comunicarea cu dispozitivul chiar și atunci când nu sunt pe aceiași
rețea cu acesta, mi-am deschis în router-ul de acasă, la care este conectat Raspberry, mai
multe porturi, astfel că prin adresa IP de acasă pot accesa mai multe servicii ale acestuia.
Portul 22 amintit mai sus deservește la conectarea de la distanță și la efectuarea de comenzi
prin SSH, portul 5900 pentru VNC astfel aplicația poate fi folosită de oriunde și partajat
ecranul, iar în cele din urmă portul care este deschis pentru aplicație, unde skill-ul de Alexa
trimite cererile, în cazul de față alegerea nu a avut motive întemeiate, doar sa nu fie un port
folosit de către alte aplicații. În acest caz am ales portul 5000. Pentru deschiderea acestor
porturi am folosit reguli de tipul “​forward rules​” pe care le-am configurat în aplicația
router-ului. În figura 32 este o captură de ecran din aplicația acestuia unde sunt regulile de
forward.

42
Figura 32. Captură de ecran din browser cu interfața router-ului

Pentru a rezolva problema IP-ului dinamic, am apelat la un host provider gratuit ​No-Ip70,
astfel că prin serviciul ​Dynamic DNS71, odată ce IP-ul dispozitivului Raspberry Pi se schimbă
acesta va fi reasignat automat unei adrese unice, în cazul de față ​http://licenta.zapto.org​. În
figura 33 este o captură de ecran din aplicația web cu care am interacționat.

Figura 33. Captură de ecran din aplicația Dynamic DNS, ​https://my.noip.com/

70
​https://my.noip.com/
71
https://www.cloudflare.com/learning/dns/what-is-dns
43
Un real avantaj pe care îl oferă oricare dintre cele două plăci prezentate este: conectarea
fizică a acestora la senzori și la celelalte module auxiliare. Pentru alimentarea acestora s-a
folosit pin-ul care transferă curent cu voltajul de ​5V ​(plusul) la pin-ul ​GND ​(minusul). Acești
pini de pe placă sunt folosiți strict pentru alimentarea cu curent a senzorilor. Pentru a avea un
comportament programabil al acestora m-am folosit de pinii programabili, astfel se poate
porni releul care trimite curent de 220V în lampa de birou. În Figura 34 este reprezentată o
porțiune de cod relevantă pentru modul cum, în urma unei cereri venite pe Raspberry, se
acționează acest releu.

​ if device.light_state == 'on' and req == 'on':


return 'already opened'
if req == 'on':
"""TURN ON THE RELAY"""
GPIO.output(RELAY_PIN,GPIO.HIGH)
device.light_state = req
msg = "Succes toggle light"
elif req == 'off':
"""TURN OFF RELAY"""
GPIO.output(RELAY_PIN,GPIO.LOW)
device.light_state = req
msg = "Succes toggle light"

Figura 34. Porțiune de cod din metoda care pornește releul electric

Din ideea de a proteja placa Raspberry de fluctuațiile de curent, care o pot deteriora foarte
ușor, dar și din ideea de a extinde în viitor aplicația am ales să folosesc o arhitectura de tipul
master-slave ​intre Raspberry Pi și Arduino. În acest context, cererile vor ajunge în prima
placă după care vor fi redirecționate spre alte placi Arduino, în cazul de fața doar una, în
funcție de disponibilitatea acestora. Pentru acest lucru, singura metoda de lucru în care am
putut conecta cele doua placi a fost: prin cablul USB. Această comunicare se numește “​Serial
Communication”, ​și se aseamănă foarte mult cu comunicarea prin ​socket-uri​. Pentru ca
acesta comunicare să funcționeze trebuie deschisă o conexiune din ambele capete, iar o placă
să joace rol de transmițător și alta de receptor. În cazul de față, placa Raspberry identifică
placa Arduino printr-un număr de identificare când aceasta se conexitatea cu cablul USB, iar
placa Arduino ascultă, asemena unui server la cererile venit de la ea. Pentru eficiența, dar și
din cauza că metoda de trimitere a informației are un parametru de vector de biți, am ales ca
fiecare comandă trimisă să fie un caracter ASCII, iar mapările intre caracter și comanda să se
afle la nivelul ambelor placi. Astfel pentru trimiterea comenzii de deschidere a televizorului,

44
care este mapat caracterului A, va fi trimisa plăcii Arduino care va interpreta mesajul și va
acționa senzorul de infraroșu.
Modul de interacțiune cu televizorul se realizează prin senzorul de infraroșu. Senzorul este
conectat prin doi pini cu Arduino: unul de 3.3 V programabil, iar altul de tip GND. Pentru
pinul GND, cel prin care se realizează împământarea deservește ca o scurgere de curent, am
montat o rezistență de 330 ​Ω (ohm). Pentru acest lucru a fost nevoie de concluziile rezultate
din legea lui Ohm, și anume: Într-un sistem electric rezistența este egală cu raportul dintre
tensiune și intesitatea curentului electric. Valoarea de 330 Ω a fost cea mai apropiată de
rezistențele deținute la acel moment, fiind una potrivita pentru sistem.
Pentru trimiterea efectivă de comenzi de la senzor spre televizor am apelat la o librărie
externă denumită ​IRemote​, aceasta mi a simplificat foarte mult munca, totul rezumându-se la
aflarea comenzilor necesare pentru trimis, care sunt în format hexazecimal. Pentru a afla
fiecare comandă la care televizorul meu reacționează, am montat pe placa Arduino, un
receptor infraroșu și am trimis comenzi de la telecomanda televizorului spre aceasta, astfel în
consola de la Arduino, la apăsarea butoanelor de pe telecomandă, apăreau comenzile aferente,
în hexazecimal. În Figura 35 este o porțiune relevantă de cod pentru modul de receptare a
comenzilor de la telecomandă.

const int RECV_PIN = 7;


IRrecv irrecv(RECV_PIN);
decode_results results;

void loop(){
if (irrecv.decode(&results)){
Serial.println(results.value, HEX);
irrecv.resume();
}

Figura 35. Porțiune de cod pentru modul în care se preiau comenzile de la telecomandă.

Odată captate aceste informații am ales să le mapez la niște nume, pentru simplificare. De
exemplu pentru a deschide televizorul, Arduino execută comanda de forma ​0xE0E040BF​,
care în cazul nostru corespunde cu numele POWER_SIGNAL. Modul de lucru pentru restul
comenzilor: de volum și de schimbat canalele a fost similar. În Figura 36 este prezentată o
poză cu sistemul, având atașat senzorul de temperatură și cel de infraroșu.

45
Figura 36. Poză cu sistemul în stare nefinală

6.5 Pushing box

Pentru ca utilizatorul să aibă o interacțiune cât mai bună cu aplicația, dar și pentru a știi în
timp real ceea ce se întâmplă în locuința acestuia, am ales să folosesc un centru de notificări
pentru a-i trimite mesaje când un eveniment este declanșat. Pentru aceasta parte am ales să
folosesc serviciul PushingBox, un serviciu web, prin care se pot trimite mesaje doar prin
apelarea unui API. Este de remarcat și suportul pentru foarte multe platforme, acesta reușind
cu succes să trimită mesajele pe iOS, Android, Windows Mobile dar și email.
În cazul de față am configurat acest serviciu să trimită notificări pe email-ul personal dar și
pe dispozitivul mobil, bazat pe iOS. Pentru a configura acest serviciu este nevoie de un cont
pe pagina ​https://www.pushingbox.com​. În prima instanță se va configura rubrica de
Services​. Acesta este locul în care selectăm mediile în care mesajele noastre vor ajunge. În
Figura 37 se observă un număr foarte mare de platforme și aplicații cu care se integrează acest
serviciu.

46
Figura 37. Serviciul PushingBox, secțiunea Services

Odată configurată această secțiune este nevoie sa ne creăm un scenariu. Acesta va fi


locul în care vor fi introduse serviciile de la pasul anterior, aici purtând denumirea de ​Action​.
După această parte se generează un ​DeviceID​. Acesta este dat ca parametru într-un link
pentru a notifica utilizatorul. În Figura 38 se poate identifica scenariul creat cu numele
“Notification System”, împreună cu cele doua acțiuni.

Figura 38. Serviciul PushingBox, secțiunea “Scenarios”

Este de notat faptul că pentru a primi notificările pe dispozitivul mobil este necesară
descărcarea unei aplicații, PushBullet. După logarea cu contul creat anterior se vor genera

47
codurile care vor fi introduse în PushingBox. În Figura 39 este prezentată o captură de ecran
din aplicația mobilă cu notificările aferente.

Figura 39. Captura de ecran din aplicația PushBullet

6.6 Testarea aplicației

Partea de testare reprezintă o parte foarte importantă din această aplicație. În acestă parte se
poate observa cum se pot executa niște procedee în scopul testării aplicației, mai intuitiv
pentru aplicația în Azure Function ​decât ​în cea Lambda. Metodele de testare au fost variate.
De la rularea locală a aplicației și introducerea manuala a cererilor în format JSON până la
scrierea de teste de integrare și folosirea efectivă a dispozitivului Echo Dot.

6.6.1 Rularea locală

Pentru a realiza acest tip de testare este nevoie ca aplicația, cea în Azure Function, să fie
rulată. Odată pornită aceasta va rula la adresa ​http://localhost:7071/api/Alexa​. Adăugarea
acestui link în secțiunea ​Endpoints ​a aplicației Alexa nu ne va ajuta deoarece Alexa acceptă
doar domenii cu suport pentru SSL/TLS. Așadar este nevoie de o translatare a link-ului de pe
mașina locală în unul cu suport ​HTTPS​. Pentru acest lucru este nevoie de un soft de tunelare,
adică care ne poate crea un domeniu care va avea ca și ruta de întoarcere adresa noastră
locală. Pentru asta am ales să folosesc ​LocalTunnel72, flexibil, un soft ușor de configurat, iar

72
​https://localtunnel.github.io/www/
48
care doar prin rularea unei comenzi ne va genera cu link. Odată generat acest link, se poate
introduce în secțiunea Endpoints a aplicației noastre și asa toate cererile se vor întoarce pe
mașina locală unde se poate face debug pe aplicație. În Figura 40 este prezentat modul cum
rulăm comanda pentru LocalTunnel si cum acesta ne generează o adresa cu suport pentru
protocolul mai sus amintit., iar în Figura 41 este prezentată o captură de ecran cu aplicația în
Azure Function, rulată local.

Figura 40. Aplicația LocalTunnel rulată la linia de comandă

Figura 41. Aplicația în Azure Function rulată la linia de comandă

6.6.2 Teste de integrare

Am ales să fac teste de integrare deoarece doream o metodă automată care să testeze rapid
toate comenzile pe care le poate servi skill-ul meu. Pentru acest lucru am folosit aplicația
desktop ​Postman73. Pentru a-mi testa aplicația, am creat o colecție de cereri care va rula la
apăsarea unui buton. Fiecare cerere trimisa reprezintă o cerere HTTP cu metoda POST iar ca
și conținut al mesajului va fi exact fișierul JSON returnat de aplicația web Alexa. Acest mod
de testare este foarte folosit deoarece, în primul rând, se testează dintr-un capăt în altul (pana
la Raspberry) fiecare comandă pe care o suporta skill-ul, iar în urma unor schimbări majore

73
​https://www.getpostman.com/automated-testing
49
făcute codului avem nevoie să rulăm aceste teste de integrare ca să ne asiguram că totul
funcționează cum trebuie. În al doilea rând, deoarece cererile se trimit la adresa locală, acesta
reprezintă un mod viabil de a face debug în aplicație. În Figura 42 avem o captură de ecran cu
aplicația prezentată mai sus și cum arata colecția de cereri care se trimit spre aplicație.

Figura 42. Aplicația Postman și colecția de cereri.

6.6.3 Alte metode de testare

C​hiar dacă testarea automată a aplicației își are rolul său și motivarea folosirii acestui tip de
testare este justificată, cea mai importantă parte, pentru a mă asigura că aplicația merge așa
cum mi am propus, am testat și manual aplicația. Una dintre metodele de a testa aplicația este
direct pe pagina aplicației, în secțiunea Test. Aici este nevoie doar de un microfon. Această
metodă de testare este foarte bună deoarece este important să vedem cum se comportă
aplicația, care sunt timpi de așteptare în cazul în care o cerere durează mai mult sau ce se
întâmplă când apare o eroare. Pe lângă testarea pe pagina oficială, ultimul pas este testarea
aplicației pe dispozitivul fizic Echo Dot.

6.7. Versionarea

Data fiind mărimea și complexitatea lucrării, este justificată folosirea unui sistem de
versionare pentru a-mi urmări schimbările făcute în cadrul aplicației. Pentru acest proiect am

50
ales platforma ​GitHub​. Aici fiecare utilizator își poate crea un container unde își poate ține
codul, denumit repository. Fiecare modificare a utilizatorului pe care o face asupra codului și
alege să o trimită către server (“commit-push”) este foarte ușor de urmărit în cadrul aplicației
web. Pentru a putea împarți munca și a urmări direcții diferite ale aplicației, se pot crea
branch-uri unde utilizatorii pot lucra individual. Pentru aplicația prezentată am ales să
folosesc un repository denumit ​smart_home_licenta​, Pentru a-mi desfășura munca pe
calculatorul personal, cât și pe placa integrata Raspberry Pi, acestea au branch-uri diferite.
Pentru partea de skill exista branch-ul unde se ține aplicația în Azure Function, altul pentru
aplicația în Lambda, iar în ultimul branch se ține codul pentru Raspberry Pi și Arduino.

6.8 Concluzii

Acest capitol descrie metodele pe care le-am folosit pentru a implementa aplicația,
împreună cu justificările riguroase pentru fiecare alegere. Pe lângă arhitectura aplicației,
modul cum poate fi folosită și utilizată, tehnologiile folosite, tipurile de senzori sau plăci
integrate, soft-uri și aplicații, am ales să prezint și modalitățile de configurare a serviciilor
prezentate. Toate cele din urmă au culminat cu o descriere amănunțita a parții de testare și cu
un mod cât mai prietenos de organizare a codului scris prin sisteme de versionare.

51
7. Conferințe internaționale
RoCHI 74
​este o conferință internațională axată pe interacțiunea om-calculator. Aceasta
este primul forum științific pentru cercetarea și dezvoltarea interfețelor utilizatorilor în
România. Printre participanți se numără oameni din mediul corporativ (designeri,
dezvoltatori, experți în grafica) dar și din mediul academic (studenți și cercetători).
Lucrarea ​Smart Home solution a fost trimisă la această conferință, care se desfășoară în
perioada 17-18 octombrie la București.

74
​http://rochi2019.utcluj.ro/about/
52
8. Concluzii finale

8.1 Concluzii
Lucrarea prezentată cu numele “Smart Home solution” ține ușureze modul de viata prin
diminuarea interacțiunii dintre utilizator și unele componente din locuința acestuia. Prin acest
mod facil și prietenos de interacțiune vocală, utilizatorul, își poate controla dispozitivele
electronice de oriunde s-ar afla și mai mult de atât, poate primi detalii despre senzorii din
locuința, în timp real. Acest tip de interacțiune amintit mai sus vine ca urmare a cererii făcute
pe acest segment, din partea utilizatorilor, care își doresc metode cât mai simple de a
automatiza unele procese. Prezenta lucrare tinde să exprime și o cultură bogată în tipurile de
tehnologii folosite, astfel că paradigma de programare de tip ​clouding ​domină în cea mai
mare parte a aplicației iar motivația pentru aceasta regăsindu-se în capitolul dedicat.

8.2 Direcții de viitor

Potențialul de dezvoltare pentru aplicația prezentată este reprezentat doar de numărul de


dispozitive și senzori cu care aceasta se poate integra. Ca urmare a dezvoltării masive în acest
segment și a apariției de noi dispozitive electrice și senzori, aplicația, are un potențial uriaș,
dat fiind și tipul de arhitectură ales pentru aceasta. Câteva exemple ar putea fi: conectarea cu
mai multe dispozitive care suportă transmiterea de semnale de tip infraroșu: aer condiționat,
proiectoare, integrarea cu alte dispozitive de uz casnic: mașini de spălat vase sau haine,
aspiratoare sau termostatul de la centrală, sau integrarea cu anumiți senzori care pot fi
adaugați în casa: de umiditate, de monoxid de carbon, de gaz sau de mișcare.

53
9. Bibliografie
1. Boricha, B. Serverless computing wars: AWS Lambdas vs Azure Functions. In
Packtpub. Cloud & Networking News, (2018).
2. DeLisle, J. J. Top 8 Raspberry Pi alternatives and rivals. In Electronic Products. Board
Level Products - Single Board Computer. (2017).
3. Di Justo, P. Raspberry Pi or Arduino Uno? One Simple Rule to Choose the Right
Board. Makezine. (2015)
4. Hassan, Q. F. Internet of Things A to Z: Technologies and Applications. Wiley-IEEE
Press. (2018)
5. Jindal, F., Jamar, R., Churi, P. Future and challenges of Internet of Things.
International Journal of Computer Science & Information Technology (IJCSIT) vol.
10, no 2, April (2018)
6. Park, E., del Pobil, A. P., Kwon, J., Kwon, S. J. The Role of Internet of Things (IoT)
in Smart Cities: Technology Roadmap-oriented Approaches. Sustainability 10(5):1388
(2018).
7. Porkodi, R., Bhuvaneswari, V. The Internet of Things (IoT) Applications and
Communication Enabling Technology Standards: An Overview. International
Conference on Intelligent Computing Applications (ICICA), pp. 324-329 (2014).
8. Wortmann, F., Flüchter, K. Internet of Things. Bus Inf Syst Eng vol. 57, no. 3, pp.
221–224 (2015).

Links
https://www.instructables.com/id/DHT11-Raspberry-Pi/

https://classes.engineering.wustl.edu/ese205/core/index.php?title=Serial_Communication_betwee
n_Raspberry_Pi_%26_Arduino

https://learn.sparkfun.com/tutorials/ir-communication/all

http://www.circuitbasics.com/arduino-ir-remote-receiver-tutorial/

https://www.captechconsulting.com/blogs/alexa-tutorial-developing-skills-with-azure-functions

https://techcommunity.microsoft.com/t5/Windows-Dev-AppConsult/Build-your-first-Alexa-skill-
with-Alexa-NET-and-Azure-Functions/ba-p/317930

https://github.com/lepiaf/IR-Remote-Code

https://www.bcg.com/publications/2018/mapping-smart-home-market.aspx

https://voicebot.ai/amazon-echo-alexa-stats/

54
https://hub.packtpub.com/serverless-computing-aws-lambdas-azure-functions/

https://www.electronicproducts.com/Board_Level_Products/Single_Board_Computer/Top_8_Ras
pberry_Pi_alternatives_and_rivals.aspx

https://martinfowler.com/articles/serverless.html

https://serverless-stack.com/chapters/what-is-serverless.html

https://azure.microsoft.com/en-us/blog/understanding-serverless-cold-start/

https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview

https://www.abr.com/what-is-rfid-how-does-rfid-work/

https://www.quora.com/What-are-some-good-uses-for-Azure-Functions

https://docs.microsoft.com/en-us/azure/cosmos-db/create-sql-api-dotnet

https://www.theguardian.com/technology/2018/may/24/amazon-alexa-recorded-conversation

https://developer.amazon.com/docs/custom-skills/speech-synthesis-markup-language-ssml-referen
ce.html
https://developer.amazon.com/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html

https://developer.amazon.com/alexa-voice-service

https://developer.amazon.com/docs/custom-skills/create-intents-utterances-and-slots.html

https://www.independent.co.uk/life-style/gadgets-and-tech/news/amazon-alexa-echo-listening-spy
-security-a8865056.html?utm_medium=Social&utm_source=Facebook&fbclid=IwAR3OvKO9op
_W7vMRiHHeLWH9r5A8xNH1jR4eBLApIgFvWK1qmkDFSEGNzPA#Echobox=1554994615

https://jeffknupp.com/blog/2014/03/03/what-is-a-web-framework/

https://pymbook.readthedocs.io/en/latest/flask.html

https://medium.com/python-pandemonium/build-simple-restful-api-with-python-and-flask-part-1-
fae9ff66a706

https://docs.microsoft.com/en-us/dotnet/core/

https://medium.com/@pererikbergman/repository-design-pattern-e28c0f3e4a30

https://dotnetcore.show/episode-1-a-brief-history-of-net-core/

55
https://fiware-tutorials.readthedocs.io/en/latest/crud-operations/index.html

https://makezine.com/2015/12/04/admittedly-simplistic-guide-raspberry-pi-vs-arduino/

https://www.researchgate.net/publication/324915158_The_Role_of_Internet_of_Things_IoT_in_
Smart_Cities_Technology_Roadmap-oriented_Approaches

https://www.researchgate.net/publication/322538736_Internet_of_Things_A_to_Z_Technologies_
and_Applications

http://aircconline.com/ijcsit/V10N2/10218ijcsit02.pdf

https://www.researchgate.net/publication/286573266_The_Internet_of_Things_IoT_Applications
_and_Communication_Enabling_Technology_Standards_An_Overview

https://www.researchgate.net/publication/276439592_Internet_of_Things

56

S-ar putea să vă placă și