πŸ“‹ AttivitΓ  DomoApp

Suddivisione delle attivitΓ  per gruppo β€” Progetto Domotica I.I.S. Volta Frosinone

DomoApp Γ¨ un'applicazione di domotica che i ragazzi dovranno sviluppare lavorando in gruppi. Ogni gruppo si occupa di un'area funzionale specifica. La scheda ElioKit (basata su ESP32-S3) viene controllata tramite comandi MQTT inviati dall'applicazione. L'SDK Java mette a disposizione metodi pronti per interagire con sensori, LED, buzzer, fotocamera e audio della scheda.

πŸ“– Consultare la documentazione SDK per la lista completa dei metodi disponibili e la pagina Test MQTT per provare i comandi in tempo reale.

πŸ—οΈ Architettura del Progetto

Il sistema Γ¨ composto da tre elementi principali:

  1. Scheda ElioKit (ESP32-S3) β€” il dispositivo fisico con sensori, LED, buzzer, speaker, fotocamera. Comunica via MQTT.
  2. Broker MQTT (Mosquitto) β€” il server di messaggistica che fa da ponte tra l'app e la scheda.
  3. Applicazione Web (Spring Boot) β€” l'interfaccia utente che i ragazzi del Gruppo 4 svilupperanno, che invia comandi e riceve dati dalla scheda.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       MQTT        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       MQTT        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  App Web (Java) β”‚ ──────────────▢   β”‚    Broker    β”‚  ◀──────────────  β”‚  Scheda ElioKit β”‚
β”‚  Spring Boot    β”‚ ◀──────────────   β”‚  Mosquitto   β”‚  ──────────────▢  β”‚    ESP32-S3     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    Gruppo 4                                                         Gruppi 1, 2, 3 (logica)
πŸ’‘ Flusso di lavoro: I Gruppi 1, 2 e 3 definiscono la logica applicativa (quali comandi inviare e quando), mentre il Gruppo 4 costruisce l'interfaccia web che permette all'utente di attivare quelle funzionalitΓ . L'SDK Java fornisce i metodi per comunicare con la scheda.

πŸ”΄ Gruppo 1 β€” Sicurezza

GRUPPO 1

Il Gruppo 1 si occupa delle funzionalitΓ  di sicurezza della casa: rilevamento terremoti, allarmi fumo/incendio e sorveglianza tramite rilevamento del movimento con scatto foto automatico.

🌍 AttivitΓ  1.1 β€” Allarme Terremoto

Obiettivo

Rilevare un evento sismico analizzando i dati del giroscopio e dell'accelerometro della scheda. Quando viene rilevato un movimento anomalo (vibrazione), attivare un segnale di allarme composto da bip sonori e luci rosse lampeggianti. L'allarme si disattiva automaticamente quando il movimento cessa.

Passi per lo sviluppo

  • Leggere i dati del giroscopio β€” Utilizzare il metodo SDK per leggere i valori degli assi X, Y, Z dal sensore giroscopico. Il metodo restituisce i dati in formato JSON.
  • Definire una soglia di attivazione β€” Stabilire un valore soglia (ad esempio, accelerazione > 1.5g o variazione angolare > 50Β°/s) oltre il quale il sistema considera il movimento come "anomalo". Sperimentare con la scheda per trovare il valore migliore.
  • Polling periodico β€” Implementare un loop (o un timer schedulato) che legge i valori del giroscopio ogni 100-200 ms per avere una rilevazione reattiva.
  • Attivare l'allarme sonoro β€” Quando la soglia viene superata, utilizzare il metodo SDK per attivare il buzzer con una frequenza allarmante (es. 2000 Hz, durata 300 ms, ripetuto).
  • Attivare le luci rosse lampeggianti β€” Accendere i LED in rosso (R=255, G=0, B=0), spegnere dopo 300 ms, riaccendere dopo 300 ms, creando un effetto lampeggiante.
  • Disattivare l'allarme β€” Quando le letture del giroscopio tornano sotto la soglia per almeno 2-3 secondi consecutivi, spegnere buzzer e LED.

Suggerimenti tecnici

  • Usare un filtro a media mobile (media degli ultimi N campioni) per evitare falsi positivi da singoli picchi isolati.
  • Testare l'allarme scuotendo fisicamente la scheda e osservando la pagina Test MQTT per vedere i valori raw del giroscopio.
  • Prevedere un comando MQTT per abilitare/disabilitare il monitoraggio sismico dall'app web.

πŸ”₯ AttivitΓ  1.2 β€” Allarme Fumo / Incendio

Obiettivo

Monitorare la qualitΓ  dell'aria rilevata dal sensore della scheda. Quando i livelli indicano la presenza di fumo o gas, attivare un allarme con bip sonori e luci rosse lampeggianti. L'allarme si disattiva quando la qualitΓ  dell'aria torna ai livelli normali.

Passi per lo sviluppo

  • Leggere i dati del sensore di qualitΓ  dell'aria β€” Utilizzare il metodo SDK appropriato per ottenere i valori del sensore ambientale. I dati includono indicatori di qualitΓ  dell'aria (TVOC, eCO2, ecc.).
  • Definire le soglie di allarme β€” Stabilire i livelli critici: ad esempio, TVOC > 500 ppb o eCO2 > 1000 ppm. Consultare le specifiche del sensore per i range normali.
  • Polling periodico β€” Leggere il sensore ogni 1-2 secondi. La qualitΓ  dell'aria cambia piΓΉ lentamente rispetto alle vibrazioni, quindi un intervallo piΓΉ lungo Γ¨ sufficiente.
  • Attivare l'allarme β€” Come per il terremoto: buzzer con bip intermittenti + LED rossi lampeggianti.
  • Livelli di gravitΓ  β€” Implementare almeno 2 livelli: attenzione (LED arancioni, bip lento) e pericolo (LED rossi, bip veloce).
  • Disattivare l'allarme β€” Quando i valori scendono sotto la soglia per almeno 10 secondi consecutivi.

Suggerimenti tecnici

  • Il sensore potrebbe necessitare di un breve periodo di riscaldamento (warm-up) dopo l'accensione. Le prime letture potrebbero non essere accurate.
  • Implementare un log storico dei valori letti, utile per il debug e per visualizzarli nell'app web (Gruppo 4).
  • Prevedere un comando per impostare le soglie da remoto, cosΓ¬ il Gruppo 4 potrΓ  inserire un pannello di configurazione.

πŸ“Έ AttivitΓ  1.3 β€” Rilevamento Movimento con Foto e Notifica WhatsApp

Obiettivo

Quando viene rilevato un movimento in casa, la scheda deve scattare 3 foto in rapida successione e inviare un segnale di allarme via WhatsApp utilizzando le API GREEN-API.

Passi per lo sviluppo

  • Rilevare il movimento β€” Utilizzare i dati del giroscopio/accelerometro (come nell'attivitΓ  1.1) oppure, se disponibile, un sensore PIR. Definire una soglia specifica per il "movimento in casa" (diversa da quella sismica).
  • Scattare 3 foto β€” Al rilevamento, invocare il metodo SDK per scattare una foto. Ripetere 3 volte con un breve intervallo (es. 500 ms tra uno scatto e l'altro) per catturare sequenze dell'evento.
  • Configurare GREEN-API β€” Registrarsi su green-api.com e ottenere le credenziali (ID istanza e token). GREEN-API permette di inviare messaggi WhatsApp tramite chiamate HTTP REST.
  • Inviare la notifica WhatsApp β€” Effettuare una chiamata HTTP POST all'endpoint GREEN-API per inviare un messaggio contenente:
    • Testo di allarme: "⚠️ ALLARME: Movimento rilevato in casa! Ora: HH:MM:SS"
    • Le 3 foto scattate come allegati (inviarle come file o come URL se vengono salvate su un server)
  • Anti-spam β€” Implementare un cooldown di almeno 30-60 secondi tra un allarme e l'altro per evitare invii multipli ravvicinati.

Esempio chiamata GREEN-API

// Endpoint per inviare messaggio di testo
POST https://api.green-api.com/waInstance{ID}/sendMessage/{TOKEN}
Content-Type: application/json

{
  "chatId": "39XXXXXXXXXX@c.us",
  "message": "⚠️ ALLARME: Movimento rilevato in casa!\nOra: 14:35:22\nFoto in arrivo..."
}

// Endpoint per inviare un file/immagine
POST https://api.green-api.com/waInstance{ID}/sendFileByUrl/{TOKEN}
Content-Type: application/json

{
  "chatId": "39XXXXXXXXXX@c.us",
  "urlFile": "https://url-della-foto.jpg",
  "fileName": "allarme_foto_1.jpg",
  "caption": "Foto 1 - Movimento rilevato"
}

Suggerimenti tecnici

  • Salvare le credenziali GREEN-API in un file di configurazione, non hardcoded nel sorgente.
  • Per inviare le foto via GREEN-API come URL, Γ¨ necessario prima caricarle su un server accessibile (o usare l'endpoint sendFileByUpload per invio diretto).
  • Testare il flusso completo: movimento β†’ foto β†’ invio β†’ ricezione su WhatsApp.

🟠 Gruppo 2 β€” Gestione Luci

GRUPPO 2

Il Gruppo 2 si occupa del sistema di illuminazione intelligente: accensione automatica basata sulla luminositΓ  ambientale, programmazione oraria, attivazione su movimento e scelta del colore.

πŸ’‘ AttivitΓ  2.1 β€” Accensione Automatica (Sensore di LuminositΓ )

Obiettivo

Le luci si accendono automaticamente quando il sensore rileva che la luminositΓ  ambientale Γ¨ bassa (ad esempio al tramonto o in una stanza buia), e si spengono quando la luminositΓ  torna sopra la soglia.

Passi per lo sviluppo

  • Leggere il sensore di luminositΓ  β€” Utilizzare il metodo SDK per ottenere il valore di lux dall'ambiente. Il sensore restituisce un valore numerico (piΓΉ alto = piΓΉ luce).
  • Definire la soglia di attivazione β€” Sperimentare con il sensore: ad esempio, soglia = 100 lux. Sotto questa soglia β†’ luci accese; sopra β†’ luci spente.
  • Isteresi β€” Per evitare sfarfallio (luci che si accendono e spengono continuamente al confine della soglia), usare due soglie: accensione sotto 80 lux, spegnimento sopra 120 lux.
  • Polling β€” Leggere il sensore ogni 2-5 secondi. Non serve una frequenza alta perchΓ© la luminositΓ  cambia lentamente.
  • Accendere i LED β€” Quando la soglia viene superata, accendere tutti i LED con un colore bianco caldo (es. R=255, G=200, B=100) o il colore scelto dall'utente (vedi attivitΓ  2.4).
  • Spegnere i LED β€” Quando la luminositΓ  risale, spegnere i LED con una transizione graduale (opzionale ma elegante).

Suggerimenti tecnici

  • Esporre la soglia come parametro configurabile dall'app web, cosΓ¬ il Gruppo 4 puΓ² creare uno slider nell'interfaccia.
  • Inviare un messaggio MQTT con il valore di luminositΓ  corrente, utile per il Gruppo 4 per visualizzare un grafico.

⏰ AttivitΓ  2.2 β€” Timer Luci (Programmazione Oraria)

Obiettivo

Permettere all'utente di impostare un orario di accensione e un orario di spegnimento delle luci. Ad esempio: accensione alle 18:30, spegnimento alle 23:00.

Passi per lo sviluppo

  • Ricevere i parametri via MQTT β€” Definire un topic MQTT (es. domoapp/luci/timer) sul quale l'app invia un payload JSON:
    {
      "accensione": "18:30",
      "spegnimento": "23:00",
      "colore": { "r": 255, "g": 200, "b": 100 },
      "attivo": true
    }
  • Gestire l'orologio β€” La scheda deve conoscere l'ora corrente. Verificare se la scheda si sincronizza via NTP all'avvio, oppure ricevere l'ora dal server.
  • Confronto orario β€” Ogni minuto, confrontare l'ora corrente con gli orari impostati. Se l'ora corrente Γ¨ compresa nel range β†’ luci accese; altrimenti β†’ spente.
  • Gestire il caso "a cavallo della mezzanotte" β€” Se accensione=22:00 e spegnimento=06:00, il range attraversa la mezzanotte. Gestire questo caso speciale.
  • Persistenza β€” Salvare le impostazioni del timer in modo che sopravvivano a un riavvio della scheda (opzionale, ma utile).

🚢 AttivitΓ  2.3 β€” Accensione Luci su Movimento

Obiettivo

Le luci si accendono automaticamente quando viene rilevato un movimento (ad esempio, una persona entra in una stanza). Dopo un periodo di inattivitΓ , le luci si spengono.

Passi per lo sviluppo

  • Rilevare il movimento β€” Utilizzare l'accelerometro/giroscopio come trigger di prossimitΓ . In alternativa, se si scatta una foto periodica, usare un confronto rudimentale tra due frame successivi.
  • Accendere le luci β€” All'evento di movimento, accendere i LED immediatamente.
  • Timeout di spegnimento β€” Avviare un timer (es. 2 minuti). Se non viene rilevato ulteriore movimento entro il timeout, spegnere le luci.
  • Reset del timer β€” Se viene rilevato nuovo movimento mentre le luci sono accese, resettare il countdown del timeout.
  • Timeout configurabile β€” L'utente deve poter impostare la durata del timeout dall'app web (30 sec, 1 min, 2 min, 5 min…).

Suggerimenti tecnici

  • Questa funzionalitΓ  puΓ² entrare in conflitto con l'accensione automatica (attivitΓ  2.1) e il timer (attivitΓ  2.2). Definire delle prioritΓ : ad esempio, il timer manuale ha la prioritΓ  piΓΉ alta, poi il movimento, poi la luminositΓ .

🎨 AttivitΓ  2.4 β€” Scelta Colore delle Luci

Obiettivo

L'utente puΓ² scegliere il colore delle luci tramite l'app web. Il colore scelto viene applicato a tutte le modalitΓ  di accensione (automatica, timer, movimento).

Passi per lo sviluppo

  • Definire il topic MQTT per il colore β€” Ad esempio domoapp/luci/colore con payload:
    { "r": 255, "g": 100, "b": 50 }
  • Applicare il colore β€” Quando si riceve il comando, memorizzare i valori RGB e utilizzarli come colore predefinito ogni volta che i LED vengono accesi.
  • Colori predefiniti β€” Offrire una palette di colori preimpostati: bianco caldo, bianco freddo, rosso relax, blu notte, verde natura, ecc. Definire i valori RGB per ciascuno.
  • Anteprima β€” Quando l'utente seleziona un colore dall'app, accendere momentaneamente i LED con quel colore per 3 secondi come anteprima.
  • Effetti (bonus) β€” Implementare effetti speciali: rainbow (scorrimento colori), pulsazione lenta, disco (colori random veloci).

Suggerimenti tecnici

  • Coordinarsi con il Gruppo 4 per il color picker nell'interfaccia web: l'ideale Γ¨ un widget HTML5 <input type="color"> che restituisce valori esadecimali da convertire in RGB.
  • Memorizzare l'ultimo colore scelto in modo persistente per non perderlo al riavvio.

🟣 Gruppo 3 β€” Intrattenimento

GRUPPO 3

Il Gruppo 3 si occupa delle funzionalitΓ  di intrattenimento domestico: radio in streaming, sveglia programmabile, timer con segnale acustico/visivo e invio di messaggi vocali alla casa.

πŸ“» AttivitΓ  3.1 β€” Radio in Streaming

Obiettivo

Permettere l'ascolto della radio in streaming dalla scheda ElioKit, con tutti i controlli: cambio stazione, regolazione volume, accensione e spegnimento.

Passi per lo sviluppo

  • Lista stazioni radio β€” Creare un elenco di URL di stream radio (formato MP3/AAC). Esempi:
    // Stazioni radio italiane in streaming
    RTL 102.5:     http://streamingv2.shoutcast.com/rtl1025
    Radio Deejay:  https://streamcdnm10-dd782ed59e2a4e86aabf6fc508674b59.msvdn.net/live/S97044836/chunklist.m3u8
    RDS:           http://stream.rds.it/rds
    Radio 105:     http://icecast.unitedradio.it/Radio105.mp3
  • Avviare la radio β€” Utilizzare il metodo SDK per avviare lo streaming audio passando l'URL della stazione selezionata.
  • Cambio stazione β€” Fermare lo stream corrente e avviarne uno nuovo con l'URL della nuova stazione.
  • Regolazione volume β€” Utilizzare il metodo SDK per impostare il volume (range 0-100).
  • Accensione / Spegnimento β€” Un comando per avviare lo streaming e uno per fermarlo.
  • Topic MQTT β€” Definire topic dedicati:
    • domoapp/radio/play β€” con payload: { "url": "http://...", "stazione": "RTL 102.5" }
    • domoapp/radio/stop
    • domoapp/radio/volume β€” con payload: { "volume": 75 }

Suggerimenti tecnici

  • Alcuni stream richiedono headers HTTP specifici; verificare che l'SDK li supporti.
  • Gestire l'errore di stream non disponibile e notificarlo all'app web.
  • Inviare lo stato corrente (in riproduzione / stazione / volume) su un topic di risposta, utile al Gruppo 4 per aggiornare l'interfaccia.

⏰ AttivitΓ  3.2 β€” Sveglia

Obiettivo

Implementare una sveglia programmabile: l'utente imposta un orario di sveglia, il numero di ripetizioni del suono e puΓ² spegnerla manualmente.

Passi per lo sviluppo

  • Ricevere i parametri via MQTT β€” Topic: domoapp/sveglia/imposta con payload:
    {
      "ora": "07:30",
      "ripetizioni": 5,
      "suono": "buzzer",
      "attiva": true
    }
  • Controllo orario β€” Verificare ogni 30 secondi se l'ora corrente corrisponde all'ora della sveglia impostata.
  • Attivazione della sveglia β€” Quando scatta:
    • Emettere un bip con il buzzer (es. 1000 Hz per 500 ms, pausa 500 ms, ripetere)
    • Accendere i LED con un effetto "sunrise" (da spento β†’ giallo chiaro β†’ bianco brillante, gradualmente)
    • Ripetere il ciclo per il numero di volte impostato
  • Spegnimento manuale β€” L'utente puΓ² inviare un comando domoapp/sveglia/stop per fermare la sveglia prima che completi tutte le ripetizioni.
  • Snooze (bonus) β€” Posticipare la sveglia di 5 minuti con un comando domoapp/sveglia/snooze.

Suggerimenti tecnici

  • Prevedere piΓΉ sveglie (ad esempio un array di sveglie), ciascuna con i propri parametri.
  • Considerare l'opzione di usare un suono MP3 al posto del buzzer, sfruttando il sistema audio della scheda.

⏱️ AttivitΓ  3.3 β€” Timer

Obiettivo

L'utente imposta un timer (conto alla rovescia). Alla scadenza, la scheda emette un bip e i LED si accendono di blu ogni 2 secondi. L'utente puΓ² disattivare il timer in qualsiasi momento.

Passi per lo sviluppo

  • Ricevere il timer via MQTT β€” Topic: domoapp/timer/imposta con payload:
    {
      "durata_secondi": 300,
      "attivo": true
    }
  • Countdown β€” Avviare un countdown interno. Opzionalmente, pubblicare ogni secondo il tempo rimanente su domoapp/timer/stato perchΓ© il Gruppo 4 possa mostrare il countdown nell'interfaccia.
  • Alla scadenza:
    • Emettere un bip col buzzer (es. 1500 Hz, 200 ms)
    • Accendere i LED blu (R=0, G=0, B=255) per 1 secondo
    • Spegnere per 1 secondo
    • Ripetere il ciclo fino alla disattivazione
  • Disattivazione β€” Topic: domoapp/timer/stop. Ferma il bip e spegne i LED.
  • Timer multipli (bonus) β€” Supportare piΓΉ timer contemporanei, ognuno con il proprio nome e durata.

Suggerimenti tecnici

  • Pubblicare aggiornamenti sul topic di stato per consentire al Gruppo 4 di mostrare una barra di progresso o countdown nell'interfaccia.
  • Gestire correttamente il caso in cui il timer viene reimpostato mentre uno Γ¨ giΓ  attivo (cancellare il precedente e avviarne uno nuovo).

πŸ—£οΈ AttivitΓ  3.4 β€” Messaggio Vocale alla Casa

Obiettivo

L'utente scrive un messaggio di testo nell'app web e la scheda ElioKit lo riproduce come messaggio vocale attraverso lo speaker, utilizzando il sistema di Text-to-Speech (TTS).

Passi per lo sviluppo

  • Ricevere il testo via MQTT β€” Topic: domoapp/messaggio/invia con payload:
    {
      "testo": "Ciao ragazzi, la cena Γ¨ pronta!",
      "voce": "Bianca",
      "volume": 80
    }
  • Invocare il TTS β€” Utilizzare il metodo SDK per inviare il testo al sistema Text-to-Speech della scheda. Il TTS converte il testo in audio e lo riproduce sullo speaker.
  • Impostare il volume β€” Prima di riprodurre, impostare il volume desiderato.
  • Feedback β€” Pubblicare un messaggio di conferma su domoapp/messaggio/stato (es. { "stato": "in_riproduzione" }, poi { "stato": "completato" }).
  • Coda messaggi β€” Se arrivano piΓΉ messaggi, metterli in coda e riprodurli uno alla volta.

Suggerimenti tecnici

  • Il TTS potrebbe dipendere da un servizio cloud (es. AWS Polly). Verificare che la scheda sia connessa a Internet.
  • Definire un limite di lunghezza del messaggio (es. max 200 caratteri) per evitare abusi.
  • Coordinare con il Gruppo 4 per il campo di input nell'interfaccia, includendo la selezione della voce se disponibile.

πŸ”΅ Gruppo 4 β€” Applicazione Web (Spring Boot)

GRUPPO 4

Il Gruppo 4 Γ¨ responsabile dello sviluppo dell'applicazione web con Spring Boot che funge da pannello di controllo centralizzato per tutte le funzionalitΓ  implementate dagli altri gruppi. L'app comunica con la scheda ElioKit tramite MQTT.

πŸ›οΈ AttivitΓ  4.1 β€” Architettura dell'Applicazione

Obiettivo

Progettare e realizzare la struttura base dell'applicazione web con Spring Boot, integrando un client MQTT per comunicare con la scheda.

Passi per lo sviluppo

  • Creare il progetto Spring Boot β€” Usare Spring Initializr con le dipendenze:
    • spring-boot-starter-web β€” per le API REST e le pagine web
    • spring-boot-starter-thymeleaf β€” per il templating HTML (o usare un frontend separato in React/Vue)
    • spring-integration-mqtt β€” per la connessione MQTT
    • spring-boot-starter-websocket β€” per aggiornamenti real-time verso il browser
  • Configurare il client MQTT β€” In application.properties:
    mqtt.broker.url=tcp://INDIRIZZO_BROKER:1883
    mqtt.client.id=domoapp-webapp
    mqtt.username=
    mqtt.password=
    mqtt.default.topic=domoapp/#
  • Creare il servizio MQTT β€” Una classe @Service che:
    • Si connette al broker all'avvio
    • Sottoscrive i topic di risposta dalla scheda
    • Fornisce metodi per pubblicare comandi
    • Notifica i controller via eventi quando arrivano messaggi
  • WebSocket per il real-time β€” Configurare WebSocket (con SockJS + STOMP) per inviare aggiornamenti live al browser quando arrivano dati dalla scheda.
  • Struttura del progetto:
    src/main/java/com/domoapp/
    β”œβ”€β”€ DomoAppApplication.java          // Main
    β”œβ”€β”€ config/
    β”‚   β”œβ”€β”€ MqttConfig.java              // Configurazione MQTT
    β”‚   └── WebSocketConfig.java         // Configurazione WebSocket
    β”œβ”€β”€ service/
    β”‚   β”œβ”€β”€ MqttService.java             // Invio/ricezione MQTT
    β”‚   β”œβ”€β”€ SicurezzaService.java        // Logica Gruppo 1
    β”‚   β”œβ”€β”€ LuciService.java             // Logica Gruppo 2
    β”‚   └── IntrattenimentoService.java  // Logica Gruppo 3
    β”œβ”€β”€ controller/
    β”‚   β”œβ”€β”€ DashboardController.java     // Pagina principale
    β”‚   β”œβ”€β”€ SicurezzaController.java     // API Gruppo 1
    β”‚   β”œβ”€β”€ LuciController.java          // API Gruppo 2
    β”‚   └── IntrattenimentoController.java // API Gruppo 3
    └── model/
        β”œβ”€β”€ AllarmeConfig.java
        β”œβ”€β”€ LuciConfig.java
        β”œβ”€β”€ RadioConfig.java
        └── TimerConfig.java

πŸ–₯️ AttivitΓ  4.2 β€” FunzionalitΓ  da Integrare nell'Interfaccia

Obiettivo

Creare le pagine web e le API REST per controllare tutte le funzionalitΓ  implementate dagli altri gruppi.

Pagine da realizzare

  • Dashboard β€” Pagina principale con panoramica dello stato della casa: allarmi attivi, luci accese, radio in riproduzione, timer attivi. Utilizzare card o widget aggiornati in tempo reale via WebSocket.
  • Pannello Sicurezza (Gruppo 1):
    • Toggle ON/OFF per monitoraggio terremoto
    • Toggle ON/OFF per monitoraggio fumo
    • Toggle ON/OFF per sorveglianza movimento
    • Slider per regolare le soglie di sensibilitΓ 
    • Visualizzazione ultime 3 foto scattate
    • Log degli allarmi recenti con timestamp
  • Pannello Luci (Gruppo 2):
    • Toggle ON/OFF luci manuali
    • Toggle per modalitΓ  automatica (sensore luminositΓ )
    • Impostazione orario accensione/spegnimento (2 input time)
    • Toggle per accensione su movimento
    • Color picker per scegliere il colore
    • Palette colori predefiniti
    • Indicatore luminositΓ  ambientale corrente
  • Pannello Intrattenimento (Gruppo 3):
    • Player radio con lista stazioni, play/stop, slider volume
    • Impostazione sveglia: input orario, numero ripetizioni, ON/OFF
    • Timer: input durata, start/stop, countdown in tempo reale
    • Campo testo per messaggio vocale con pulsante "Invia"

API REST da esporre

// ── Sicurezza ──
POST   /api/sicurezza/terremoto/toggle     // { "attivo": true }
POST   /api/sicurezza/fumo/toggle          // { "attivo": true }
POST   /api/sicurezza/sorveglianza/toggle  // { "attivo": true }
GET    /api/sicurezza/allarmi              // Lista allarmi recenti
GET    /api/sicurezza/foto                 // Ultime foto scattate

// ── Luci ──
POST   /api/luci/toggle                    // { "accese": true }
POST   /api/luci/colore                    // { "r": 255, "g": 100, "b": 50 }
POST   /api/luci/auto                      // { "attivo": true, "soglia": 100 }
POST   /api/luci/timer                     // { "accensione": "18:30", "spegnimento": "23:00" }
POST   /api/luci/movimento                 // { "attivo": true, "timeout": 120 }

// ── Intrattenimento ──
POST   /api/radio/play                     // { "url": "http://...", "stazione": "RTL" }
POST   /api/radio/stop
POST   /api/radio/volume                   // { "volume": 75 }
POST   /api/sveglia/imposta                // { "ora": "07:30", "ripetizioni": 5 }
POST   /api/sveglia/stop
POST   /api/timer/imposta                  // { "durata_secondi": 300 }
POST   /api/timer/stop
POST   /api/messaggio/invia                // { "testo": "...", "voce": "Bianca" }

Suggerimenti tecnici

  • Design responsive β€” L'app deve funzionare su desktop e mobile. Usare un framework CSS come Bootstrap 5 o Tailwind CSS.
  • Coordinamento con i gruppi β€” Concordare i topic MQTT e i formati dei payload JSON con ogni gruppo. Documentare ogni contratto in modo chiaro.
  • WebSocket β€” Utilizzare STOMP over WebSocket per ricevere aggiornamenti in tempo reale: stato allarmi, valore luminositΓ , countdown timer, stato radio.
  • Gestione errori β€” Mostrare notifiche toast quando un'operazione fallisce o quando la scheda non risponde.
  • Autenticazione (bonus) β€” Aggiungere un login base per proteggere l'accesso al pannello di controllo.
⚠️ Importante: Tutti i gruppi devono coordinarsi sui nomi dei topic MQTT e sulla struttura dei payload JSON. Si consiglia di definire un documento condiviso con il "contratto" di ogni topic prima di iniziare lo sviluppo.
πŸ’‘ Consiglio: Usare la pagina Test MQTT per verificare che i comandi funzionino correttamente prima di integrarli nell'applicazione web.