---
slideOptions:
transition: slide
transitionSpeed: fast
theme: solarized
---
# Stampi IoT
---
## Obiettivi
* Controllare in maniera autonoma una pressa
* Monitorare nel tempo l'andamento di variabili (temperatura, stato della pressa ecc)
* Fornire un'interfaccia web per l'analisi dei dati raccolti
---
# Componenti del sistema
---
## Sensori
<div style="text-align: left">
Montati direttamente sulla macchina, e collegati fisicamente alla centralina
</div>
<br/><br/>
- **Termocoppia**, per misurare la temperatura
- **Sensore a contatto**, per misurare l'apertura/chiusura della pressa
---
## Attuatori
- **Motore passo-passo**, che permette di controllare l'apertura della pressa e pilotato dalla centralina
---
## Centralina
- Pilota il motore passo-passo per l'apertura della pressa, seguendo una curva di pressione predefinita
- Si interfaccia con i sensori per raccogliere periodicamente delle misure
- Invia le misure al servizio di telemetria
- Mostra lo stato attuale della pressa su un piccolo schermo on-board, che permetterà di diagnosticare velocemente degli eventuali problemi
---
### Google Cloud Platform - IoT Core
- La centralina comunica con il servizio **IoT Core** della Google Cloud Platform, che offre un modo per autenticare le centraline in modo sicuro, ed eventualmente organizzarle in strutture gerarchiche
- I dati periodicamente trasmessi sono chiamati _telemetry_
- Il protocollo utilizzato è MQTT, standard de facto per i device IoT
---
### Google Cloud Platform - PubSub
- Una volta ricevuti i dati dalla centralina, il servizio **IoT Core** li pubblica su un canale di comunicazione ad eventi, chiamato **PubSub**
- Questo canale si divide in _Topic_, ed oltre allo scambio puro di messaggi permette di attivare altri servizi in seguito ad un nuovo messaggio ricevuto
---
### Google Cloud Platform - Cloud Functions
- Nel nostro caso, ad ogni nuova _telemetry_ ricevuta viene invocata una nostra funzione serverless, scritta in NodeJS
- Questa funzione avrà il compito di validare i dati ricevuti, e chiedere al nostro backend di salvarli nel database
- Un approccio serverless permette di risparmiare delle risorse (CPU, RAM ecc) ed utilizzarle solo quando necessario
---
### Database
- Il database utilizzato deve permettere il salvataggio di grandi quantità di dati, dalla struttura non sempre nota in fase di progetto
- La scelta migliore per gestire questo tipo di carico è un database NoSQL: per questa applicazione abbiamo scelto *MongoDB*
- Il database di produzione sarà operativo su un cluster di nodi, che permettono una buona ridondanza e fault tolerance
---
### Backend
- È necessario un sistema intermedio tra i frontend ed il database, che permetta di controllarne l'accesso e formattare i dati in modo agevole: questo ruolo è ricoperto da un servizio di backend scritto in NodeJS
- Questa applicazione sarà pubblicata utilizzando il servizio **App Engine**, sempre parte della _Google Cloud Platform_
- Questa soluzione ci permette un'ampia flessibilità, necessaria per poter elaborare i dati con prestazioni accettabili
---
### Frontend
- L'interfaccia che gli utenti finali andranno ad utilizzare sarà implementata utilizzando tecnologie web (VueJS)
- Questo permetterà l'accesso da un qualunque dispositivo connesso ad internet, senza la necessità di installare del software
- Verranno utilizzati i servizi Google Cloud:
- **Firebase Auth** per l'autenticazione
- **Firebase Hosting** per pubblicare l'applicazione web
---
### Frontend - Funzionalità
- La schermata principale sarà dedicata all'analisi dei dati: sarà possibile esplorare i dati ricevuti in tempo reale da tutte le proprie macchine, nonchè uno storico dei dati ricevuti nell'ultimo mese
- Questo permetterà ogni tipo di analisi, fornendo all'utente la libertà di approfondire il comportamento della macchina su un determinato periodo
- Ci sarà anche la possibilità di gestire le proprie macchine, aggiungendone di nuove o modificando quelle presenti
---
