Ciao WALTERmwp,
Aggiungo volentieri informazioni sul mio progettino da weekend-di-lockdown. Con tutto questo tempo che purtroppo abbiamo a disposizione, ho deciso di fare almeno qualcosa di utile in casa. Che poi "utile" è un concetto discutibile, ma lasciamo perdere
Modello caldaia: Bulex ThemaCondens 25
La tensione di consenso l'ho per prima cosa trovata indicata nel manuale della caldaia (foto allegata) e poi l'ho verificata con il multimetro ai morsetti del vecchio termostato. Quando la caldaia è spenta, il multimetro segna intorno ai 24 V tra COM e NO, mentre quando è accesa segna ovviamente 0 V.
Web server: Python3 con framework
Flask. Il server internamente usa la libreria
gpiozero per pilotare il pin GPIO che attiva/disattiva il relay. Usare la libreria è semplicissimo. Esempio veloce per un relay il cui input è collegato al pin 21:
- Codice: Seleziona tutto
from gpiozero import OutputDevice
relay = OutputDevice(21, active_high=False)
relay.on()
...
relay.off()
...
relay.toggle()
Da notare che la libreria prevede anche la possibilità di simulare la presenza di pin, e ho usato questa feature per i miei unit test in locale.
App Android: sviluppata in Java con AndroidStudio ultima versione, per il mio smartphone con Android 10. Per la parte HTTP client ho usato la libreria
volley di Google: si trovano tanti esempi nella documentazione ufficiale e in giro per la rete.
Architettura SW: il web server (Raspberry) espone un unico endpoint.
Una richiesta GET su questo endpoint restituisce lo stato attuale del relay (attivo o spento).
Una richiesta POST permette di cambiare lo stato del relay. Il body del POST conterrà lo stato desiderato e un nonce per evitare replay attacks. Quando il web server riceve una richiesta, il nonce viene salvato come "usato" in un in-memory database (
redis), in modo che sia possibile verificare che il nonce contenuto in nuove richieste sia fresco. Per quanto riguarda il nonce stesso, uso un semplice UUID v4.
Capitolo sicurezza: tutte le richieste (sia GET che POST) prevedono una autenticazione tramite HMAC: l'app Android aggiunge il tag HMAC alla richiesta e il web server verifica questo tag prima di fare qualunque cosa.
Il limite di questa soluzione è che la stessa chiave deve essere presente sia sul client sia sul server. Se volessi aggiungere altri client dovrei fornire loro la chiave o, cosa migliore, passare a un sistema di firme digitali come ECDSA. Ma dato che uso solo il mio telefono, questa soluzione è sufficiente.
Networking: ho configurato un port forwarding sul mio router per esporre la porta del web server, in modo da poter comandare la caldaia anche da remoto.
Ciao!