PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software

Pagina creata da Diego Magnani
 
CONTINUA A LEGGERE
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
Sardegna FESR 2014/2020 - ASSE PRIORITARIO I

 “RICERCA SCIENTIFICA, SVILUPPO TECNOLOGICO E INNOVAZIONE”

Azione 1.1.4 Sostegno alle attività collaborative di R&S per lo sviluppo di nuove
 tecnologie sostenibili, di nuovi prodotti e servizi

 PROGETTI CLUSTER TOP DOWN
 R.3.1 – Specifiche Software
 VIRTUALENERGY

 1/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
Sommario

1. Introduzione ......................................................................................................................................... 4
2. Requisiti Funzionali............................................................................................................................... 5
3. Soluzione Realizzata ............................................................................................................................. 6
 3.1 Architettura .................................................................................................................................. 6
 3.1 Backend ........................................................................................................................................ 7
 3.1.1 Django................................................................................................................................... 7
 3.1.2 Django REST Framework ...................................................................................................... 8
 3.1.3 django-allauth ...................................................................................................................... 8
 3.1.4 Docker .................................................................................................................................. 8
 3.1.5 uWsgi .................................................................................................................................... 8
 3.1.6 Postgres ................................................................................................................................ 8
 3.2 Frontend ....................................................................................................................................... 8
 3.3.1 Vue.js .................................................................................................................................... 9
 3.3.2 Yarn....................................................................................................................................... 9
 3.3.3 Webpack ............................................................................................................................... 9
 3.3.4 Nginx ..................................................................................................................................... 9
 3.3.5 Docker .................................................................................................................................. 9
 3.3 Gateway........................................................................................................................................ 9
 3.4 Client............................................................................................................................................. 9
 3.5 Interfacce di comunicazione ...................................................................................................... 10
4. Dettagli di implementazione .............................................................................................................. 11
 4.1 Backend ...................................................................................................................................... 11
 4.1.1 ER Diagram ......................................................................................................................... 11
 4.1.2 Discovery ............................................................................................................................ 16
 4.1.3 Sensing................................................................................................................................ 17
 4.1.4 Experiment ......................................................................................................................... 18
 4.2 Frontend ..................................................................................................................................... 18

 2/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
4.2.1 Login ................................................................................................................................... 19
 4.2.2 Gestione dei dispositivi ...................................................................................................... 19
 4.2.3 Gestione degli esperimenti ................................................................................................ 20
5. Installazione........................................................................................................................................ 28
 5.1 Pacchetti software...................................................................................................................... 28
 5.2 Download e avvio del server: ..................................................................................................... 28
 5.3 Download e avvio del client ....................................................................................................... 28
 5.4 Funzionamento predefinito........................................................................................................ 29
 5.5 Personalizzare il funzionamento ................................................................................................ 29
6. REST APIs ............................................................................................................................................ 31
 6.1 Autenticazione............................................................................................................................ 31
 6.1.1 Registrazione utente .......................................................................................................... 31
 6.1.2 Login utente........................................................................................................................ 32
 6.1.3 Logout utente ..................................................................................................................... 32
 6.2 Dispositivi ................................................................................................................................... 33
 6.2.1 Lista Nodi ............................................................................................................................ 33
 6.2.2 Istanza di un Nodo .............................................................................................................. 35
 6.2.3 Lista Devices con stato ON ................................................................................................. 37
 6.2.4 Toggle di un Device ............................................................................................................ 38
 6.3 Esperimenti ................................................................................................................................ 39
 6.3.1 Creazione esperimento ...................................................................................................... 39
 6.3.2 Risultati di un esperimento (grafici e statistiche)............................................................... 40
7. Algoritmo di stima associato ad uno scaldacqua elettrico ................................................................. 46
 7.1 Descrizione ................................................................................................................................. 46
 7.2 Implementazione........................................................................................................................ 49
 7.2.1 Codice dell’algoritmo ......................................................................................................... 49
 7.2.2 Funzioni ausiliarie ............................................................................................................... 51

 3/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
1. Introduzione

 Il progetto VIRTUALENERGY è uno dei tanti progetti collaborativi promossi da Sardegna Ricerche
attraverso il programma “Azioni Cluster Top-Down”, finanziato grazie al fondo di sviluppo regionale POR-
FESR Sardegna 2014-2020. La finalità principale che accomuna queste iniziative è quella di svolgere
attività di trasferimento tecnologico nei confronti delle aziende partecipanti, attraverso la risoluzione di
problematiche condivise, mediante l’applicazione di competenze e risultati frutto dell’attività di ricerca.

L’obiettivo del progetto VIRTUALENERGY è quello di implementare un prototipo di Virtual Power Plant
(VPP), ovvero una centrale elettrica virtuale, costituita dall’integrazione e coordinamento di sistemi
eterogenei (potenza, controllo e comunicazione) in grado di interfacciarsi con la rete elettrica ed i vari
stakeholders che operano sul mercato elettrico per il dispacciamento di energia e la fornitura di servizi
ancillari.

Questo documento descrive l’architettura del software realizzato dal DIEE nell’ambito del progetto
VIRTUALENERGY. Questa piattaforma, è stata studiata per consentire in generale il controllo remoto di
risorse elettriche distribuite, ed offrire un ambiente di verifica dei risultati idoneo all’esecuzione di alcune
campagne sperimentali in linea con le specifiche definite nel piano dei test. L’attuale implementazione del
software consente in particolare la gestione remota di carichi elettrici connessi a prese intelligenti ad uso
domestico. Questa scelta è stata indotta dalla disponibilità dei componenti hardware con cui gli sviluppatori
del sistema hanno avuto modo di interagire in maniera diretta. Tuttavia, la struttura del software è idonea
ad integrare il controllo e la gestione di ulteriori risorse hardware.

La piattaforma realizzata risulta essere uno degli elementi che concorrono all’implementazione delle
funzionalità previste per il prototipo di VPP oggetto di studio, in particolare per quanto riguarda il testing e
la validazione di logiche per il Demand Side Management basate sul controllo di carichi elettrici.

La piattaforma abilita la trasmissione e ricezione distribuita di opportune sequenze segnali di controllo da
e verso il campo, con relativo monitoraggio delle prestazioni in termini di qualità della comunicazione,
esponendo opportuni meccanismi di interfacciamento con applicativi di terze parti focalizzati sulle logiche
di funzionamento del VPP.

La piattaforma risulta essere uno strumento di prototipazione utile per le imprese che intendono avviare o
hanno già in corso investimenti per la realizzazione di sistemi che richiedono il controllo e la supervisione
remota dei carichi elettrici domestici.

 4/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
2. Requisiti Funzionali

In questo capitolo è riportato l’elenco dei principali requisiti funzionali che l’attuale implementazione del
software è in grado di soddisfare:

 ✓ Login: l’operatore deve poter accedere al sistema tramite le sue credenziali;
 ✓ Discovery dei Nodi e dei Dispositivi presenti in ogni nodo: il sistema deve automaticamente
 rilevare i nodi ed i dispositivi connessi. Il sistema deve anche rilevare automaticamente la
 disconnessione dei nodi e dei dispositivi;
 ✓ Sensing dei dispositivi: il sistema deve continuamente ed automaticamente ricevere
 l’aggiornamento dello stato dei dispositivi (es. potenza assorbita, accensione o spegnimento,
 etc…);
 ✓ Visualizzazione lista nodi e dispositivi su ogni nodo: il sistema deve consentire ad un operatore
 di monitorare i nodi connessi e lo stato dei dispositivi al loro interno;
 ✓ Visualizzazione dettaglio dispositivi: il sistema deve consentire all’operatore di visualizzare i
 dettagli di ogni dispositivo connesso (es. modello, numero di serie, stato di funzionamento corrente,
 etc…);
 ✓ Controllo dei dispositivi: il sistema deve consentire all’operatore di controllare i dispositivi
 connessi (es. accensione, spegnimento);
 ✓ Setup di un esperimento: il sistema deve consentire all’operatore di organizzare un esperimento
 che coinvolge uno o più dispositivi;
 ✓ Lista storico esperimenti: il sistema deve consentire all’operatore di visualizzare lo storico degli
 esperimenti;
 ✓ Visualizzazione risultato esperimento: il sistema deve consentire all’operatore di visualizzare i
 risultati di ogni singolo esperimento (es. grafici e statistiche, export CSV).

 5/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
3. Soluzione Realizzata

Per soddisfare le specifiche funzionali descritte nel capitolo 2, è stato implementato un sistema web-based
in grado di gestire nodi e dispositivi, composto dai seguenti componenti:

 ✓ Un Backend basato su Django e Postgres, per l’implementazione della logica applicativa;
 ✓ Un Frontend basato su Vue.JS, per offrire un'interfaccia grafica all’operatore;
 ✓ Un Node Client basato sulla libreria open source PyWeMo, per il controllo ed il discovery dei
 dispositivi all’interno di una rete locale;
 ✓ Un Real Time Gateway basato sulla libreria open source Socket.io, per consentire un
 collegamento real time bidirezionale fra i nodi ed il backend.

 Il capitolo descrive gli ambienti software utilizzati per la realizzazione della piattaforma, ed ogni singolo
componente con cui la piattaforma è in grado di interagire.

 3.1 Architettura
In Figura 1 sono riportati i vari componenti che costituiscono l'architettura del sistema realizzato. In
particolare, l’applicazione è strutturata su quattro differenti layer:

 1. Frontend Layer: è il layer di presentazione, che implementa l’interfaccia grafica tramite la quale
 gli utenti interagiscono con il sistema;
 2. Backend Layer: rappresenta il cuore del sistema, fornisce le funzionalità di autenticazione,
 autorizzazione, gestione degli esperimenti, memorizzazione dei dati;
 3. Gateway Layer: implementa un gateway che consente una comunicazione bidirezionale real time
 tra i web client e i server;
 4. Client Layer: è la parte software che si occupa di ricevere i comandi generati dal backend e di
 eseguirli sui dispositivi WeMo.

Nelle sezioni seguenti vengono forniti ulteriori dettagli su ognuno di questi livelli.

 6/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
Figura 1: Architettura del sistema

 3.1 Backend
Il backend consiste in una web application scritta utilizzando il linguaggio di programmazione Python ed il
Web Framework Django. In particolare, le principali tecnologie utilizzate sono quelle di seguito descritte.

 3.1.1 Django
Django è un framework per applicazioni web gratuito e open source, scritto in Python. Le principali
caratteristiche e funzionalità che caratterizzano questo framework, sono di seguito elencate:

 ✓ Pattern Model-View-Controller;
 ✓ Possibilità di installare funzionalità attraverso plugin;
 ✓ Astrazione del database relazionale ad oggetti;
 ✓ Robusta API per la gestione del database;
 ✓ Sistema di template basato su tag con ereditarietà dei template;
 ✓ Gestore di URL basate su espressioni regolari;
 ✓ Sistema di gestione degli utenti e loro autenticazione nell'applicazione We
 ✓ Sistema di componenti "middleware" per lo sviluppo di funzionalità aggiuntive, come ad esempio
 la protezione CSRF e il supporto per la sessione;
 ✓ Può essere usato con Apache nginx e qualsiasi web server che supporta lo standard WSGI.

 7/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
3.1.2 Django REST Framework
Django REST Framework è stato utilizzato per sviluppare e per documentare le API REST in ambiente
Django. Tale framework consente di implementare API e relativa documentazione, impostare adeguate
politiche di autenticazione e autorizzazione, e fornisce strumenti per il supporto alla serializzazione ed alla
validazione degli input.

 3.1.3 django-allauth
La libreria django-allauth è stata utilizzata per implementare gli endpoint e la logica necessari per
aggiungere autenticazione in un progetto Django.

 3.1.4 Docker
Docker è una piattaforma software che permette di creare, testare e distribuire applicazioni, raccogliendo
il software in unità standardizzate chiamate container, che offrono tutto il necessario per la loro corretta
esecuzione, incluse librerie, strumenti di sistema, codice e runtime.

 3.1.5 uWsgi
uWSGI è un'implementazione del server WSGI (Web Server Gateway Interface) che consente di eseguire
applicazioni web Python. uWSGI consente inoltre di servire files statici, gestire la terminazione SSL, ed
effettuare Caching e Task Queuing.

 3.1.6 Postgres
PostgreSQL è un completo DBMS ad oggetti rilasciato con licenza libera. PostgreSQL offre caratteristiche
che lo pongono per alcuni aspetti all'avanguardia nel settore dei database.

 3.2 Frontend
E’ stato scelto di implementare l’interfaccia utente tramite una Single Page Application.

Con il termine Single Page Application (SPA) si intende un'applicazione web, o un sito web, che può essere
usato o consultato su una singola pagina web, con l'obiettivo di fornire un'esperienza utente più fluida e
simile alle applicazioni desktop dei sistemi operativi tradizionali. In un'applicazione su singola pagina, tutto
il codice necessario (HTML, JavaScript e CSS) è recuperato in un singolo caricamento della pagina, e le
risorse appropriate sono caricate dinamicamente e aggiunte alla pagina quando necessario, di solito in
risposta ad azioni dell'utente.

Le principali tecnologie utilizzate sono quelle di seguito descritte.

 8/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
3.3.1 Vue.js
Vue.js è un framework JavaScript open-source per la creazione di interfacce utente e single-page
applications. Vue.js presenta un'architettura adottabile in modo incrementale, che si concentra sul
rendering dichiarativo e sulla composizione dei componenti.

 3.3.2 Yarn
Yarn è un package manager open source per Javascript. Il suo scopo è quello di gestire la complessità
relativa alla gestione dei pacchetti Javascript e relative dipendenze.

 3.3.3 Webpack
Webpack è module bundler open source per applicazioni Javascript. La sua funzione è quella di unire un
insieme di moduli Javascript in un singolo file, o più files, nell’ordine corretto, ma può trasformare risorse
front-end come HTML, CSS e immagini, se sono inclusi i caricatori corrispondenti.

 3.3.4 Nginx
Nginx è un web server/reverse proxy leggero ad alte prestazioni. Il suo scopo è quello di fornire
rapidamente i contenuti statici con un utilizzo efficiente delle risorse di sistema.

 3.3.5 Docker
Docker è una piattaforma software che permette di creare, testare e distribuire applicazioni, raccogliendo
il software in unità standardizzate chiamate container che offrono tutto il necessario per la loro corretta
esecuzione, incluse librerie, strumenti di sistema, codice e runtime.

 3.3 Gateway
Il Gateway è stato implementato utilizzando la tecnologia Socket.io, per consentire una comunicazione
bidirezionale real time orientata agli eventi tra Backend e Client. Socket.IO usa principalmente il protocollo
WebSocket. Il Gateway è un breve script implementato in Python.

 3.4 Client
Il client è costituito da un semplice script Python, ed in particolare utilizza le librerie python-socketio per la
comunicazione real time con il Gateway, e PyWeMo per la comunicazione con le smart socket.

 9/52
PROGETTI CLUSTER TOP DOWN - R.3.1 - Specifiche Software
3.5 Interfacce di comunicazione
Per comprendere meglio il funzionamento del sistema, risulta utile dare una definizione delle interfacce di
comunicazione utilizzate per connettere tra loro i vari elementi architetturali illustrati in Figura 2.

L'interazione tra il frontend e il backend avviene tramite un'interfaccia REST, attraverso la quale le risorse
messe a disposizione dal server sono identificate mediante URI. La connessione utilizza il protocollo
HTTPS. La comunicazione tra backend e client PostgreSQL utilizza un protocollo message-based. Il
protocollo è supportato sia su TCP/IP che su Unix-domain sockets. La comunicazione tra backend e client
avviene grazie al gateway, che consente di instaurare un canale di comunicazione real time bidirezionale
tra i due componenti. La comunicazione tra client e dispositivi Wemo avviene via HTTP tramite le API
Wemo, controllate dalla libreria PyWeMo.

 Figura 2: Interfacce di comunicazione

 10/52
4. Dettagli di implementazione

 Questo capitolo fornisce ulteriori dettagli relativi all’implementazione dei due principali elementi che
caratterizzano l’applicazione.

 4.1 Backend
Il cuore del sistema è il backend, che implementa le seguenti funzionalità:

 ✓ Autenticazione e accounting
 ✓ Discovery dei dispositivi e dei nodi
 ✓ Sensing dei dispositivi
 ✓ Controllo dei dispositivi all’interno di uno o più nodi
 ✓ Gestione degli esperimenti
 ✓ Generazione delle statistiche relative agli esperimenti

Il backend espone tutte queste funzionalità al frontend tramite delle REST API.

La sezione successiva illustra il diagramma ER che rappresenta l’organizzazione interna del database
progettato per il corretto funzionamento dell’applicazione.

Le sezioni che seguono descrivono, mediante diagrammi UML, le sequenze di azioni effettuate dai vari
componenti del sistema relativamente ai tre scenari principali implementati dall’applicazione: discovery,
sensing ed experiment.

 4.1.1 ER Diagram
Il diagramma ER riportato in Figura 3, illustra le principali tabelle del database e le relative relazioni. Per
semplicità sono state omesse le tabelle “accessorie” generate dal framework Django e dagli ulteriori
framework utilizzati durante la realizzazione del backend.

 11/52
Figura 3: Diagramma ER

Le tabelle principali sono:

 ✓ Device: rappresenta il dispositivo WeMo. Lo stato del record nel DB viene tenuto aggiornato allo
 stato attuale dalla procedura di sensing e discovery.

 Campo Descrizione

 id Id univoco autogenerato

 address Indirizzo IP privato nella rete locale

 color Il colore che identifica il device nei risultati grafici dei tests (autogenerato)

 is_active specifica se il device è attivo (connesso) o meno

 last_update ultima volta che è stato aggiornato lo stato o il valore mW del dispositivo

 name nome assegnato al device

 12/52
porta di comunicazione attraverso la quale avviene la comunicazione tra il client a
 port
 cui è connesso il device ed il backend

 mac MAC address del device

 model modello e versione del device

model_name nome modello del device

serial_number numero di serie del device

 value valore della grandezza elettrica misurata dal device

✓ Node: rappresenta il nodo remoto. Lo stato del record nel DB viene tenuto aggiornato allo stato
 attuale dalla procedura di sensing e discovery.

 Campo Descrizione

 id Id univoco autogenerato

 is_active Specifica se il nodo è attivo (connesso) o meno

 last_update Data dell’ultimo aggiornamento, rilevato

 name Nome assegnato al nodo

 owner Utente proprietario del nodo

 sid Identificativo univoco del nodo (viene utilizzato nel Realtime Gateway per la
 comunicazione tra backend e frontend)

✓ Experiment: modello dell’esperimento, che contiene i dati necessari all’esecuzione
 dell’esperimento.

 Campo Descrizione

 uuid uuid autogenerato univoco

 auto_run specifica se l’esperimento deve partire subito dopo la sua creazione

 start momento in cui l’esperimento è stato avviato (autogenerato)

 end momento in cui l’esperimento è terminato (autogenerato)

 13/52
name nome dato all’esperimento (opzionale)

 riferimento alla tabella ExperimentSettings che specifica i tempi e il tipo
 setting
 dell’esperimento

 status Specifica se l’esperimento è in fase di creazione, in corso o concluso

 ✓ ExperimentSetting: contiene il tipo di esperimento e i dati temporali per l’esecuzione
 dell’esperimento stesso (è chiave esterna del modello esperimento).

 Campo Descrizione

 id Id univoco autogenerato

start_experiment specifica quando l’esperimento dovrà essere avviato

experiment_type specifica il tipo di esperimento che verrà condotto

 duration durata dell’esperimento

 impulse frequenza di esecuzione comandi durante l’esperimento

 ✓ SetExperiment: contiene il device su cui dovrà essere eseguito l’esperimento (fa riferimento al
 modello Experiment).

 Campo Descrizione

 id Id univoco autogenerato

 experiment riferimento alla tabella Experiment

 device device coinvolto nell’esperimento (foreignKey alla tabella device)

 14/52
✓ Sample: singolo campione dei dati di un esperimento.

 Campo Descrizione

 id Id univoco autogenerato

 created momento di scrittura del dato sul DB

 finished Momento di fine scrittura del sample (tutte le operazioni e tutte le misurazioni
 previste per il sample sono state eseguite)

 experiment Riferimento alla tabella experiment (identifica l’esperimento di cui fa parte il
 sample)

 device Riferimento alla tabella device (identifica il device i cui dati sono scritti nel
 sample)

 time_sent Momento in cui il il client invia il comando al device (nel diagramma delle azioni
 effettuate durante l’esperimento corrisponde a Time start cmd)

time_received Momento in cui il device risponde al client che ha eseguito il comando (nel
 diagramma delle azioni effettuate durante l’esperimento corrisponde a Time
 start cmd)

time_start_cmd Momento in cui il backend invia il messaggio node_command(data) al client
 passando per il Realtime Gateway (nel diagramma delle azioni effettuate
 durante l’esperimento corrisponde a Time server start cmd)

time_end_cmd Momento in cui il backend riceve dal Realtime Gateway la risposta che il device
 ha eseguito il comando (nel diagramma delle azioni effettuate durante
 l’esperimento corrisponde a Time server end cmd )

 status Stato del device (ON/OFF)

 value valore della grandezza elettrica misurata dal device

 15/52
✓ Statistics: memorizza i dati statistici dei risultati di un esperimento per un device.

 Campo Descrizione

 id Id univoco autogenerato

 experiment Riferimento alla tabella experiment (identifica l’esperimento oggetto della
 statistica)

 device Riferimento alla tabella device (identifica il device oggetto della statistica)

 value Oggetto contenente tutti i dati statistici dell’esperimento

 ✓ Chart: memorizza i dati necessari per la rappresentazione grafica dei risultati di un esperimento

 Campo Descrizione

 id Id univoco autogenerato

 experiment riferimento alla tabella Experiment

 device device coinvolto nell’esperimento (foreignKey alla tabella device)

 4.1.2 Discovery
Il meccanismo di discovery, illustrato in Figura 4, si occupa di rilevare automaticamente i nodi ed i dispositivi
connessi al sistema, o la disconnessione degli stessi. Lo stato dei nodi e dei dispositivi viene memorizzato
all’interno del DB.

La procedura di connessione viene inizializzata dal client ed avviene automaticamente, sfruttando il
meccanismo fornito automaticamente da Socket.io.

Appena possibile, il client si connette automaticamente al real time gateway. Il real time gateway riceve il
messaggio connect(data), che contiene un identificativo univoco del nodo ed il suo nome. Il real time
gateway invia al backend il messaggio node_connected(data), informando in questo modo quest’ultimo sul
fatto che tale nodo si è connesso. Il backend memorizza i dati del nodo e richiede immediatamente a
quest’ultimo, tramite il real time gateway, un aggiornamento sui dispositivi presenti al suo interno, tramite il
comando node_command(data). Il real time gateway riceve il comando e lo inoltra al client. Il client invia al

 16/52
backend un messaggio node_update(data), che contiene l’aggiornamento di tutti i dispositivi ad esso
connessi, con relativo stato associato.

 Figura 4: Diagramma UML - scenario discovery

 4.1.3 Sensing
Il meccanismo di sensing, illustrato in Figura 5, si occupa di effettuare continue misurazioni dei devices,
allo scopo di tenere aggiornati tutti i relativi parametri. Lo stato dei devices aggiornati sarà memorizzato
all’interno del DB.

 Figura 5: Diagramma UML - scenario sensing

 17/52
La procedura di connessione avviene sfruttando il meccanismo di connessione fornito automaticamente da
Socket.io. Appena possibile, il client si connette automaticamente al real time gateway. Il real time gateway
riceve il messaggio node_update(data), che contiene un identificativo univoco del nodo ed il suo nome.Il
real time gateway invia al backend il messaggio node_update(data), che contiene al suo interno i dati
aggiornati del nodo. Se è necessario, il backend aggiorna i dati del nodo, e memorizza i dati aggiornati nel
DB.

 4.1.4 Experiment
Il diagramma illustrato in Figura 6 descrive la sequenza di azioni effettuate durante lo svolgimento di un
esperimento.

 Figura 6: Diagramma UML - scenario experiment

 Il frontend, tramite REST API, invia al backend i dati necessari per la creazione di un esperimento. Al
 tempo time_server_start_cmd, il backend invia al real time gateway un messaggio
 node_command(data) che contiene i dati necessari all’esecuzione dell’esperimento. Il real time
 gateway invia al client, tramite messaggio node_command(data) i dati necessari all’esperimento. Al
 tempo time_start_cmd , il client, interfacciato con i devices, esegue i comandi e legge i parametri degli
 stessi. Al tempo time_end_cmd, il client invia i parametri ottenuti al real time gateway. Al tempo
 time_server_end_cmd, il backend riceve dal real time gateway il messaggio che il device ha eseguito
 il comando. Il backend memorizza nei samples i parametri ottenuti dai devices.

 4.2 Frontend
Le sezioni che seguono illustrano i dettagli relativi alle diverse schermate che caratterizzano l’interfaccia
utente dell’applicazione.

 18/52
4.2.1 Login
In particolare, la Figura 7 fa riferimento alla schermata attraverso cui l’operatore accede all’applicazione.

I parametri di default sono:

Username: admin

Password: admin

 Figura 7: Schermata di login

 4.2.2 Gestione dei dispositivi
La Figura 8 mostra la schermata attraverso cui l’utente ha la possibilità di visualizzare l’elenco dei dispositivi
connessi al sistema. Per ogni dispositivo viene mostrato il relativo identificativo, l’attuale stato di
funzionamento, che nel caso delle smart socket corrisponde allo stato di attivazione del relay integrato
all’interno della presa, i cui stati sono rappresentati in base al differente colore della lampadina (verde:
acceso, bianco: spento), e l’elenco delle grandezze elettriche acquisite dal dispositivo, che in questo caso
corrispondono alla sola potenza assorbita.

 19/52
Figura 8: Elenco dei dispositivi connessi

La Figura 9 mostra la parte della schermata di visualizzazione attraverso cui l’utente accede alle
informazioni di dettaglio relative al singolo dispositivo. Nel caso delle smart socket, queste informazioni
sono relative in particolare a: indirizzo ip del dispositivo, porta di comunicazione attraverso cui il sistema
scambia i dati con il dispositivo, mac address, serial number e modello del dispositivo, ed infine, stato di
funzionamento attuale del dispositivo.

 Figura 9: Lista dispositivi con informazioni relative al singolo device

 4.2.3 Gestione degli esperimenti
La Figura 10 illustra invece la schermata attraverso cui l’operatore ha la possibilità di impostare un nuovo
esperimento. Il sistema implementa due distinte tipologie di esperimento: una modalità di “sola lettura”,
ovvero in cui non è previsto l’invio di alcun segnale di controllo da parte del sistema, che si limita in questo
caso a registrare secondo la frequenza impostata dall’operatore le misure di potenza assorbita acquisite
dal dispositivo; una modalità di “lettura e scrittura”, in cui invece, oltre al campionamento dei parametri
elettrici, è previsto anche l’invio di un certo numero di segnali di accensione/spegnimento, con frequenza
impostabile dall’operatore. L’operatore può selezionare i dispositivi che dovranno essere coinvolti in un

 20/52
determinato esperimento. Un dispositivo può essere coinvolto in più esperimenti. Questa flessibilità
consente all’operatore di impostare campagne di test che consentono di validare svariati scenari. Per ogni
esperimento, l’operatore può impostare: la relativa durata, la frequenza, ossia l’intervallo di tempo che
dovrà intercorrere tra due azioni successive (acquisizione del dato ed eventuale modifica dello stato di
funzionamento). ed infine, la data e l’orario di avvio dell’attività. In particolare, un esperimento potrà essere
avviato immediatamente, selezionando l’opzione ‘Adesso’ dal menù a tendina, oppure in un secondo
momento selezionando l’opzione ‘Posticipa’.

 Figura 10: Schermata relativa alla creazione di un nuovo esperimento

Nel caso in cui si scegliesse di posticipare l’avvio, la data e l’orario potrà essere scelto per mezzo del date-
picker che apparirà subito dopo la selezione di esperimento posticipato, così come mostrato in Figura 11.
L’interfaccia utente offre all’operatore la possibilità di gestire sia gli esperimenti in corso, sia quelli ad avvio
programmato, oltre che naturalmente visualizzare i risultati degli esperimenti conclusi.

 21/52
Figura 11: Schermata relativa all'impostazione della data di avvio dell'esperimento

La Figura 12 mostra in particolare le due opzioni che l’operatore ha a disposizione per gestire un
determinato esperimento in esecuzione. La prima, è quella di poter arrestare l’attività in qualsiasi momento,
tramite il tasto (icona verde con il quadrato blu all’interno); la seconda, è quella di visualizzare i
risultati parziali, grafici e statistici, attraverso il tasto (icona verde con l’occhio blu
all’interno).

 Figura 12: Schermata relativa alla gestione degli esperimenti in corso

La Figura 13 invece, mostra la schermata attraverso cui l’operatore visualizza l’elenco degli esperimenti da
lui programmati, ma non ancora mandati in esecuzione dal sistema.

 22/52
Figura 13: Schermata relativa alla gestione degli esperimenti posticipati

La Figura 14, mostra la schermata attraverso cui l’operatore accede alla gestione degli esperimenti
conclusi. In particolare, per ogni attività conclusa, l’operatore ha la possibilità di consultare i principali
indicatori statistici e grafici attraverso l’interfaccia utente, oppure effettuare l’esportazione dei dati grezzi
tramite in formato .csv per eventuali ulteriori attività di elaborazione off-line.

 Figura 14: Schermata relativa alla gestione degli esperimenti conclusi

La Figura 15 rappresenta la pagina attraverso cui l’operatore ha modo di consultare a livello grafico
l’andamento di un determinato esperimento. In particolare, per ogni singola smart socket analizzata,
l’interfaccia utente mostra l’andamento della potenza assorbita e del delta_t. Quest’ultima grandezza
rappresenta il principale indicatore, il cui grafico consente all’operatore di valutare la qualità della
comunicazione nel corso dell’intero esperimento. L’interfaccia utente rende facilmente distinguibili i segnali
relativi ad ogni singolo dispositivo, differenziandoli dagli altri sulla base del colore associato al particolare
id.

 23/52
Figura 15: Schermata relativa alla visualizzazione grafica dei risultati ottenuti nell’esperimento

La Figura 16 rappresenta la schermata attraverso cui l’operatore ha modo di consultare i vari indicatori
statistici determinati dal sistema una volta concluso l’esperimento. Le grandezze in questione vengono
calcolate come di seguito descritto:

 Quantificazione misure acquisite

 Numero totale di misure aventi timestamp
 = all’interno della finestra temporale di logging
 considerata registrate nel database

 Numero di misure CORROTTE all’interno del
 = ∑ ( )
 totale nella finestra temporale considerata
 =1

 Numero di misure CORRETTE rispetto al totale
 = − 
 nella finestra temporale considerata

 Quantificazione durate temporali

 Durata complessiva della finestra temporale di
 = − 
 logging presa in esame.
 
 Intervallo di tempo, all’interno della finestra
 = ∑ ( ) temporale di logging considerata, calcolato
 =1 come somma degli intervalli di trasmissione
 ( ) ( ) = 0 relativi alle MISURE CORRETTE registrate sul
 ( ) = {
 0 ( ) = 1 database.

 24/52
 
 Intervallo di tempo, all’interno della finestra
 = ∑ ( ) temporale di logging considerata, calcolato
 =1 come somma degli intervalli di trasmissione
 | ( )| ( ) = 1 relativi al numero di MISURE CORROTTE
 ( ) = {
 0 ( ) = 0 registrate sul database.

 Intervallo di tempo, all’interno della finestra
 = − ( + ) temporale di logging considerata, in cui il
 dispositivo è risultato disconnesso.

 Statistiche relative alla trasmissione corretta delle misure

 Massimo intervallo di tempo in cui è avvenuta
 = { ( ) ∀ = 1: }
 correttamente la trasmissione di una misura

 Minimo intervallo di tempo in cui è avvenuta
 = { ( ) ∀ = 1: }
 correttamente la trasmissione di una misura
 
 1 Intervallo di tempo medio in cui è avvenuta
 = ∑ ( )
 correttamente la trasmissione di una misura
 =1

 Varianza degli intervalli di tempo con cui sono
 1 2
 = ∑( ( ) − ) avvenute correttamente le trasmissioni delle
 misure
 =1

 Deviazione standard degli intervalli di tempo con
 1 2
 = √ ∑( ( ) − ) cui sono avvenute correttamente le trasmissioni
 −1 delle misure
 =1

 Valore stimato delle tempistiche associate alle misure (totali, trasmesse, perse)

 Stima dell’intervallo di tempo, all’interno della
 finestra temporale di logging considerata,
 = ⋅ 
 corrispondente al numero di misure registrate nel
 database.

 Stima dell’intervallo di tempo, all’interno della
 finestra temporale di logging considerata,
 = ⋅ 
 corrispondente al numero di misure corrotte
 presenti nel database.

 Stima dell’intervallo di tempo, all’interno della
 finestra temporale di logging considerata,
 = ⋅ 
 corrispondente al numero di misure registrate
 correttamente nel database.

 25/52
Figura 16: Schermata relativa alla visualizzazione degli indicatori statistici associati all'esperimento

In Figura 17 è riportato un esempio di dati relativi ad un esperimento concluso, che l’operatore ha
l’opportunità di esportare tramite interfaccia utente, in formato CSV, qualora fosse necessario effettuare
eventuali ulteriori elaborazioni offline, mediante applicativi di terze parti. Il significato dei singoli campi che
costituiscono i record del file csv estratto dal sistema è di seguito riportato:

✓ N: numero progressivo (univoco) del sample.
✓ Sample Id: identificativo (univoco) del sample all’interno del DB.
✓ Created: timestamp di avvio del processo di creazione del sample.
✓ Finished: timestamp di fine del processo di creazione del sample.
✓ Experiment: uuid dell’esperimento all’interno del DB.
✓ Device: nome del device coinvolto nell’esperimento.
✓ Time start cmd: timestamp dell’istante in cui il client invia il comando al device.
✓ Time end cmd: timestamp dell’istante in cui il comando viene ricevuto (ed eseguito) dal device.
✓ Time server start cmd: timestamp dell’istante in cui il server (all’interno del ciclo dell’esperimento)
 invia al client il comando da far eseguire al device.
✓ Time server end cmd: timestamp dell’istante in cui il server riceve dal client la conferma di comando
 eseguito da parte del device.
✓ Status: stato del device (ON/OFF).
✓ Current power mW: potenza assorbita dal dispositivo.

 26/52
Figura 17: Esempio di dati esportati in formato CSV

In Figura 18 è riportato un diagramma UML che mostra la sequenza di operazioni che caratterizzano il
processo di invio e ricezione dei messaggi dal server (backend) al singolo attuatore (WeMo device), e
viceversa, in cui si trovano evidenziati anche i quattro differenti timestamp che il sistema registra per ogni
singolo campionamento.

 Figura 18: diagramma UML relativo al processo di registrazione dei vari timestamp per ogni sample

 27/52
5. Installazione

In questo capitolo vengono fornite le indicazioni che è opportuno seguire per realizzare una corretta
installazione della piattaforma.

 5.1 Pacchetti software
Per il corretto funzionamento del sistema, occorre anzitutto installare i seguenti software, che costituiscono
prerequisito essenziale per poter completare la messa in servizio del sistema:

 ✓ Git: scaricabile su http://git-scm.com/downloads o utilizzando il gestore di pacchetti del sistema
 operativo
 ✓ Docker: è possibile scaricare e installare il software su diverse piattaforme. Per ulteriori dettagli è
 opportuno fare riferimento alla seguente documentazione: https://docs.docker.com/get-docker

 5.2 Download e avvio del server:
Occorre quindi creare la directory in cui verrà salvato il progetto, e digitare i seguenti comandi:

git clone https://github.com/VirtualEnergy-Project/virtualenergy-backend-app-configuration.git --recurse-
submodules

cd virtualenergy-backend-app-configuration

docker-compose -f production.yml build

docker-compose -f production.yml up

 5.3 Download e avvio del client
Nel dispositivo su cui andrà installato il modulo per la gestione del nodo, creare una directory e, una volta
entrati all’interno di quest’ultima, digitare i seguenti comandi:
 ✓ Effettuare il download del progetto
git clone https://github.com/VirtualEnergy-Project/virtualEnergyNode.git
 ✓ Installare le dipendenze necessarie
pip3 install pywemo==0.4.43

pip3 install python-socketio==4.6.0

pip3 install python-engineio==3.13.0

 28/52
pip3 install six==1.10.0

pip3 install eventlet==0.25.2

pip3 install requests==2.24.0

 ✓ Per avviare il client, all’interno della directory creata è sufficiente digitare il comando:

python3 node_client.py

A questo punto, una volta che il sistema è avviato, è possibile accedere al frontend, collegandosi al link:

http://0.0.0.0:8081

 5.4 Funzionamento predefinito
Ogni secondo il client, invia al Server Django la lista dei devices presenti al suo interno. Il server a sua
volta, riceve la lista e la aggiorna nei seguenti casi:

 ✓ un eventuale nuovo device aggiunto viene memorizzato nel DB con tutti i relativi parametri;
 ✓ un device precedentemente esistente che non viene rilevato per un certo intervallo di tempo
 superiore ad una certa soglia (di default impostata ad un valore pari a 120 secondi), viene
 disabilitato e non sarà più fruibile fino a nuova rilevazione da parte del nodo;
 ✓ l’eventuale variazione di stato (es: ON/OFF) comporterà l’aggiornamento del device stesso

Il Frontend interagisce con le API esposte dal backend all’indirizzo http://0.0.0.0:8000

 5.5 Personalizzare il funzionamento
All’interno della directory in cui risulta installato il modulo virtualenergy-backend-app-configuration, nel path
/.envs/.production/.django, possiamo personalizzare i parametri di default del server, riportati in Figura
19.

 Figura 19: Parametri di configurazione del server

 29/52
Il significato di ognuno di questi parametri è di seguito riportato:

 ✓ SERVER_URL specifica l’indirizzo pubblico, attraverso il quale, verrà esposto il modulo
 websockets realtime gateway.
 ✓ TIME_OUT indica il numero dei secondi oltre i quali, un device non rilevato dal nodo viene
 disabilitato.
 ✓ DEFAULT_ADMIN_USER e DEFAULT_ADMIN_PASSWORD: specificano l’utente di default che
 verrà creato al primo avvio del progetto.

Sono altresì fondamentali le variabili d’ambiente che si trovano nel client, all’interno del file constants.py, il
cui contenuto è riportato in Figura 20

 Figura 20: Parametri di configurazione del client

Il significato di ognuno di questi parametri è di seguito riportato:

 ✓ SERVER_URL: specifica l’indirizzo pubblico, attraverso il quale, verrà esposto il modulo
 websockets realtime gateway (dev’essere obbligatoriamente il medesimo specificato nel server in
 /.envs/.production/.django).
 ✓ DEVICES_REFRESH_TIME: specifica ogni quanti secondi il client deve inviare al server la lista
 aggiornata dei devices.

In /.envs/.production/.dashboard, per mezzo della variabile d’ambiente VUE_APP_BASE_URL è
possibile personalizzare l’indirizzo attraverso cui il frontend si interfaccia alle API esposte dal server, così
come mostrato in Figura 21.

 Figura 21: Parametri per interfacciamento tra frontend ed API

 30/52
6. REST APIs

In questo capitolo vengono descritte in maniera dettagliata le API REST implementate nel Backend.

Le API sono divise in tre gruppi principali:

 ✓ Autenticazione
 ✓ Dispositivi
 ✓ Esperimenti

 6.1 Autenticazione

 6.1.1 Registrazione utente
 Metodo Metodo/Formato Formato
 Input Output

 /rest-auth/registration/ POST JSON

Parametri POST

 username Username identificativo dell'utente

 email Email dell’utente

 password1 Password

 password2 Ripeti la password

Risposta di successo (otteniamo il token di accesso
 {
 "key": "51e85b9e851ecaa76227556db947033d9deb418c"
 }

 31/52
6.1.2 Login utente
 Metodo Metodo/Formato Formato
 Input Output

 /rest-auth/login/ POST JSON

 Headers

 Authorization Token 

 Parametri POST

 username Username identificativo dell'utente

 password Password

Risposta di successo (restituisce il token d’accesso)
{
 "key": "51e85b9e851ecaa76227556db947033d9deb418c"
}

Risposta Errore
{
 "detail": "Invalid token.",
 "status_code": 401
}

 6.1.3 Logout utente
 Metodo Metodo/Formato Formato
 Input Output

 /rest-auth/logout/ POST JSON

Risposta di successo
{
 "detail": "Successfully logged out."
}

 32/52
6.2 Dispositivi

 6.2.1 Lista Nodi
 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/nodes GET JSON

Headers

 Authorization Token 

Risposte di esempio
 {
 "count": 1,
 "next": null,
 "previous": null,
 "results": [
 {
 "node": {
 "id": 1,
 "owner": {
 "username": "admin",
 "email": ""
 },
 "created": "2020-10-13T16:01:18.715702",
 "modified": "2020-10-15T09:59:13.415276",
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "name": "Office",
 "sid": "4d7dd1abba5941ff85e731967d30cc75"
 },
 "device": [
 [
 {
 "id": 2,
 "created": "2020-10-13T16:08:24.111882",
 "modified": "2020-10-15T09:59:13.418559",

 33/52
"status": false,
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "color": "#5DE4D2",
 "name": "103",
 "address": "192.168.5.5",
 "port": 49153,
 "mac": "6038E01B97F4",
 "model": "Belkin Insight 1.0",
 "model_name": "Insight",
 "serial_number": "221714K12000FF",
 "value": "0"
 },
 {
 "id": 1,
 "created": "2020-10-13T16:08:19.761872",
 "modified": "2020-10-15T09:59:13.421564",
 "status": true,
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "color": "#F793FC",
 "name": "104",
 "address": "192.168.5.88",
 "port": 49153,
 "mac": "6038E01B94E8",
 "model": "Belkin Insight 1.0",
 "model_name": "Insight",
 "serial_number": "221714K120003C",
 "value": "0"
 }
 ]
 ]
 }
 ]
}

 34/52
6.2.2 Istanza di un Nodo
 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/nodes/ GET JSON

Headers

 Authorization Token 

Risposte di esempio
{
 "count": 1,
 "next": null,
 "previous": null,
 "results": [
 {
 "node": {
 "id": 1,
 "owner": {
 "username": "admin",
 "email": ""
 },
 "created": "2020-10-13T16:01:18.715702",
 "modified": "2020-10-15T09:59:13.415276",
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "name": "Office",
 "sid": "4d7dd1abba5941ff85e731967d30cc75"
 },
 "device": [
 [
 {
 "id": 2,
 "created": "2020-10-13T16:08:24.111882",
 "modified": "2020-10-15T09:59:13.418559",
 "status": false,
 "is_active": true,

 35/52
"is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "color": "#5DE4D2",
 "name": "103",
 "address": "192.168.5.5",
 "port": 49153,
 "mac": "6038E01B97F4",
 "model": "Belkin Insight 1.0",
 "model_name": "Insight",
 "serial_number": "221714K12000FF",
 "value": "0"
 },
 {
 "id": 1,
 "created": "2020-10-13T16:08:19.761872",
 "modified": "2020-10-15T09:59:13.421564",
 "status": true,
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T09:59:13.404546",
 "color": "#F793FC",
 "name": "104",
 "address": "192.168.5.88",
 "port": 49153,
 "mac": "6038E01B94E8",
 "model": "Belkin Insight 1.0",
 "model_name": "Insight",
 "serial_number": "221714K120003C",
 "value": "0"
 }
 ]
 ]
 }
 ]
}

 36/52
6.2.3 Lista Devices con stato ON
 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/devices/?status=true GET JSON

analogamente con status= false otterremo la lista dei devices con stato OFF

Headers

 Authorization Token 

Risposta di esempio
{
 "count": 1,
 "next": null,
 "previous": null,
 "results": [
 {
 "id": 1,
 "created": "2020-10-13T16:08:19.761872",
 "modified": "2020-10-15T10:35:49.007650",
 "status": true,
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T10:35:48.988256",
 "color": "#65E15B",
 "name": "104",
 "address": "192.168.5.88",
 "port": 49153,
 "mac": "6038E01B94E8",
 "model": "Belkin Insight 1.0",
 "model_name": "Insight",
 "serial_number": "221714K120003C",
 "value": "0",
 "node": {
 "id": 1,

 37/52
"created": "2020-10-13T16:01:18.715702",
 "modified": "2020-10-15T10:35:56.095090",
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T10:35:48.988256",
 "name": "Office",
 "sid": "4d7dd1abba5941ff85e731967d30cc75",
 "owner": 1
 }
 }
 ]
}

 6.2.4 Toggle di un Device
 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/devices//toggle GET JSON

analogamente con status= false otterremo la lista dei devices con stato OFF

Headers

 Authorization Token 

Risposta di esempio
{
 "id": 1,
 "created": "2020-10-13T16:08:19.761872",
 "modified": "2020-10-15T12:07:08.041545",
 "status": false,
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T12:07:07.470466",
 "color": "#CA10C0",
 "name": "104",
 "address": "192.168.5.88",
 "port": 49153,
 "mac": "6038E01B94E8",
 "model": "Belkin Insight 1.0",

 38/52
"model_name": "Insight",
 "serial_number": "221714K120003C",
 "value": "0",
 "node": {
 "id": 1,
 "created": "2020-10-13T16:01:18.715702",
 "modified": "2020-10-15T12:07:07.480607",
 "is_active": true,
 "is_simulated": false,
 "last_update": "2020-10-15T12:07:07.470466",
 "name": "Office",
 "sid": "4d7dd1abba5941ff85e731967d30cc75",
 "owner": 1
 }
}

 6.3 Esperimenti

 6.3.1 Creazione esperimento
 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/experiment POST JSON

Headers

 Authorization Token 

Parametri POST

 auto_run true

 start_experiment Timestamp di inizio esperimento (se nullo l’esperimento partirà subito dopo la
 sua creazione)

 name Nome da assegnare all’esperimento, può essere null

 experiment_type Tipo esperimento: TOGGLE_DEVICE (esperimento con accesione e
 spegnimento dei devices) o READ_DEVICE_STATUS (sola lettura dello stato
 dei devices)

 39/52
duration Durata esperimento in secondi

 impulse Frequenza esperimento lettura stato o impulso di toggle dei devices

 device_ids Array id dei device coinvolti nell’esperimento, può essere null e in questo caso
 verranno considerati tutti i devices

 es:[{"id": 1},{"id": 2}]

Risposta di esempio (otteniamo l’uuid dell’esperimento)
{
 "uuid": "50d3bbf1-3320-40b6-9614-ae7c0e3da651"
}

 6.3.2 Risultati di un esperimento (grafici e statistiche)

Può essere eventualmente eseguito durante l’esecuzione di un esperimento, in modo da ottenere i risultati
parziali

 Metodo Metodo/Formato Formato
 Input Output

 /api/v1/experiment//results POST JSON

Headers

 Authorization Token 

Parametri POST

 device_ids Array id dei device dei quali vogliamo vedere i risultati, può essere null e in
 questo caso verranno considerati tutti i devices

 es:[{"id": 1},{"id": 2}]

Risposta di esempio
{
 "experiment": {
 "experiment_type": "TOGGLE_DEVICE",
 “Start_experiment”: null,
 "duration": 10,

 40/52
Puoi anche leggere