Introduzione

Florawave è una soluzione completa per la gestione e l’utilizzo di dispositivi IoT all’interno di campi agricoli o serre. Il progetto è composto da 5 componenti:

  1. Un client per Windows, Mac, Linux scritto con Kotlin Multiplatform che permette di interagire con il server tramite API.
  2. Il server, sempre scritto in Kotlin, espone API e microservizi. Si interfaccia con un database SQL e con un broker MqTT.
  3. Un server di Keycloack dove abbiamo gestito l’autenticazione di tutti gli utenti.
  4. Un secondo server, sempre scritto in kotlin che emula dispositivi IoT reali.
  5. Un broker MqTT per far comunicare i device IoT con il server.

Florawave è nato come progetto universitario del corso di “Sistemi e implementazione dei sistemi software in rete” durante il corso di Informatica presso l’Università del Piemonte Orientale.


Fasi del progetto

Analisi e pianificazione

Di seguito viene riportata la consegna del progetto richiesto dai docenti:

Descrizione del progetto

Obiettivo del progetto è la progettazione e l’implementazione di un sistema di gestione di coltivazioni di ortaggi / fiori all’aperto o in serra.

Gli utenti del sistema sono i responsabili di una data azienda agricola (agricoltori) ed i loro collaboratori. Un agricoltore può aggiungere nuove serre/campi di sua proprietà nel sistema di gestione con l’indicazione del tipo di coltura e le informazioni riguardo ai sensori ed attuatori presenti al loro interno. Inoltre può visualizzare in ogni momento lo stato di ciascuna serra o campo (misure provenienti dai sensori di luce, temperatura e umidità), pianificare gli orari e/o le condizioni di attivazione degli attuatori (illuminazione artificiale, riscaldamento, irrigazione, … in base al livello di luminosità, temperatura o umidità rilevate). I collaboratori possono solo visualizzare l’elenco delle serre e dei campi dell’azienda agricola di loro competenza e monitorare lo stato delle serre o dei campi (inclusi i valori più recenti registrati dai sensori e lo stato degli attuatori), ma non possono inserire nuove serre o campi.

Entrambi i tipi di utenti possono attivare/disattivare gli attuatori in modo immediato, indipendentemente da eventuali orari predefiniti di attivazione/disattivazione (modalità manuale di gestione degli attuatori) o ripristinare la modalità automatica di attivazione/disattivazione di un dato attuatore; inoltre entrambi i tipi di utenti possono visualizzare l’elenco delle misure registrate in un dato arco temporale.

Struttura del sistema (progettazione)

Il sistema dovrà essere composto da

  • un “backend” che espone un’interfaccia di tipo REST e permette di inserire in un database i dati rilevanti sulle serre, e consultarli. Il backend ha accesso esclusivo al DB (chiunque voglia aggiornare o leggere i dati deve chiederlo al backend).
  • Una interfaccia utente (un’app, una web-app o una mobile app) che permetterà agli utenti di interagire con il backend (tramite le API-REST di quest’ultimo). Questa potrà essere una semplice interfaccia testuale oppure una interfaccia a finestre (per esempio eseguibile nel browser, quindi una web-app) o una mobile app (se avete seguito il corso di applicazioni mobili).
  • Un gestore del sottosistema IoT: si tratta di un componente che può entrare in comunicazione con i sensori e gli attuatori, invia periodicamente le misure rilevate tramite i sensori e agisce sullo stato degli attuatori in base a comandi che arrivano dall’esterno. L’idea è che ogni azienda agricola di norma abbia nella propria rete locale (la stessa alla quale si agganciano i dispositivi sensori/attuatori) un gestore di sottosistema IoT. I gestori dei sottosistemi IoT dovranno interagire con gli altri sottosistemi tramite broker MQTT.

SENSORI E ATTUATORI: i sensori e gli attuatori potranno essere reali o emulati, in base alla disponibilità di strumenti fisici. In ogni caso per poter effettuare più facilmente i test sul sottosistema IoT e i test d’integrazione occorrerà predisporre delle piccole applicazioni in grado di fornire misure fittizie (generate in modo random oppure estratte da un file) o in grado di recepire i comandi e visualizzarli in formato testo o grafico (una possibilità è usare l’emulatore delle Philips Hue assegnando a ciascuna lampadina emulata un significato, come rappresentante di un attuatore fisico, e in base al comando ricevuto accenderla, spegnerla o farle cambiare colore).

Componenti facoltativi

Il sistema potrebbe inglobare anche alcuni componenti accessori: seguono alcuni esempi.

  • un sistema esterno di autenticazione / autorizzazione (es. keycloak) da utilizzare per permettere l’accesso ai soli utenti autorizzati (previa autenticazione);
  • un sistema esterno che fornisce le previsioni meteo per regolare di conseguenza la programmazione dell’irrigazione;
  • un sistema esterno che regolamenta l’accesso a risorse idriche condivise (e quindi incide aulla possibilità di irrigare più o meno di quanto precedentemente definito).

Sviluppo

Elenco qua di seguito le tecnologie usate per i vari componenti del progetto.

Componente Descrizione
Client Kotlin multiplatform, Jetpack Compose (Compose For Desktop) e retrofit (API).
Server (Florawave) Java Spark per i microservizi, Retrofit per le API, SQL per il database MySql, Eclipse paho per la comunicazione MqTT
Server (IoT) Kotlin ed Eclipse paho per la comunicazione Mqtt
Server di autenticazione utenti Keycloak
Broker Mqtt Eclipse mosquitto

Tra le richieste del progetto vi era anche quella di generare gli schemi UML riguardanti la struttura del progetto stesso, qua di seguito ne riporto alcuni:

Diagramma UML delle classi

Diagramma UML degli Use Case

Diagramma UML della sequenza (dell’emulatore)

Test & Debugging

Abbiamo usato JUnit per testare il formato e i dati scambiati tra tutti gli endpoint REST del progetto, visualizzabili nel seguente file:


Presentazione del progetto

Client

Schermata di login

Dashboard

Dopo il login vi è la dashboard, una schermata appositamente progettata da noi per lo sviluppo delle funzionalità del progetto; da questa schermata l’utente può effettuare tutte le operazioni stabilite. Essa è divisa in varie card o sezioni, dove ognuna di queste ha una funzionalità specifica.

  • Panoramica: Visualizzazione di alcune statistiche inerenti all’utente attualmente loggato.
  • Aggiunta/rimozione terreni: Permette di aggiungere o rimuovere terreni all’interno del proprio account.
  • Aggiunta/Rimozione collaboratori: Permette di aggiungere o rimuovere collaboratori al farmer attualmente loggato. Per ogni collaboratore associato al farmer sarà possibile associare a lui dei terreni dei farmer.
  • Storico rilevazioni: permette di visualizzare tutte le rilevazioni registrate di tutti gli IoT device di tutti i terreni attualmente associati al farmer attuale.
  • Operazioni server: Schermata aggiuntiva dove si vedono lo storico di tutte le operazioni più importanti registrate nel database.

Tutte queste sezioni (tranne quella di aggiunta/rimozione terreni e collaboratore) sono accessibili sia al farmer che ai collaboratori.

All’interno della dashboard è presente una snackbar (tipo quella di Android) che compare dall’alto dopo che viene effettuato un’operazione importante nella dashboard. Per operazione importante si intende ad esempio una chiamata a un api dove la snackbar mostra lo stato della risposta del server.

Gestione Device IoT

Aggiunta/Rimozione device IoT

Settaggio programmazione automatica

In questa finestrella è possibile gestire la programmazione automatica di ogni dispositivo IoT che abbia almeno un attuatore, scegliendo orario di accensione/spegnimento, e il valore desiderato ove possibile. Questa programmazione sarà poi letta dall’emulatore che ne gestirà gli eventi in base alla sua configurazione (specificata nella sezione più in basso). Ovviamente se si volesse mettere in auge i dispositivi per raccogliere valori reali dai dispositivi stessi, bisognerebbe adattare il codice dell’app che è stato forzato a raccogliere i dati dall’emulatore.

Storico rilevazioni e storico operazioni server

Server (Florawave)

Il server di florawave è il cuore del progetto in quanto include i microservizi che, esponendo delle API REST, si interfacciamo con il database MySql e con il broker Mqtt. Ci sono tre microservizi:

  1. Microservizio data: questo è il microservizio più importante, ovvero quello che si occupa nel gestire tutti i dati del sistema. Questo è sempre collegato al database SQL.
  2. Microservizio helper: questo è un piccolo microservizio che contiene funzioni di utilità per il client.
  3. Microservizio IoT: questo è il microservizio che si occupa della comunicazione tra i dispositivi IoT e il server. All’interno vi sono un publisher e un subscriber Mqtt che interagiscono direttamente con il broker.

Server (Emulatore IoT)

L’emulatore al suo avvio fa partire il timer che si sincronizza inizialmente con l’ora e la data attuale, poi si aggiorna ogni 30 sec facendo passare 1 ora (nel sistema di Florawave), l’intero emulatore dipende dal metodo che gestisce il timer. Come prima cosa vengono inizializzati i valori di default del tempo atmosferico, a ogni aggiornamento del timer verranno effettuati controlli sulla programmazione dei dispositivi che si comporteranno di conseguenza, segnalando ogni loro update al server tramite il publisher Mqtt.


Demo

È possibile richiedere una demo del progetto contattando uno degli sviluppatori.

Tecnologie utilizzate

Kotlin

SQL

Compose

Mosquitto

Gradle

Keycloak

Detekt

Java Spark

MySql

Git

Retrofit

JUnit

Intellij IDEA

Microsoft Office

Draw.io

Postman

Figma

Illustrator


Autori del progetto

Nome Ruolo Links
Gabriele Lizzos Architettura del progetto, scrittura server, scrittura microservizio data (solo API), scrittura microservizio IoT, gestione server keycloak Github Linkedin
Loris Farrauto Architettura modulo client, scrittura client, scrittura emulatore e microservizio IoT Github Linkedin Email
Francesco Beccuti Architettura modulo server, scrittura microservizio data, gestione database SQL, scrittura documentazione UML Linkedin Email