Accesso alla API
Indirizzo e formato
Tutte le rotte stanno sotto <indirizzo-dell-app>/api/v1, dove
<indirizzo-dell-app> è l'indirizzo a cui l'app è pubblicata
(schema, host ed eventuale porta, es. https://sensu.esempio.it).
Negli esempi compare come variabile $SENSU: impostala una volta
nella shell e i comandi si copiano così come sono.
export SENSU=https://<indirizzo-dell-app>
Non è prevista autenticazione: chiunque raggiunga l'indirizzo può leggere e
modificare dispositivi, guasti e simulazione. Le richieste con body usano
Content-Type: application/json; i campi sconosciuti vengono
rifiutati.
Ogni risposta JSON è racchiusa in un envelope:
{"data": ...} // successo
{"error": {"message": "..."}} // errore
| Codice | Significato |
|---|---|
| 200 / 201 | letto / creato |
| 204 | eliminato (nessun body) |
| 400 | richiesta non valida (campo mancante, formato errato) |
| 404 | dispositivo inesistente |
| 409 | conflitto (es. codice già in uso) |
Primi passi
# il server risponde?
curl $SENSU/api/v1/healthz
# avvia la simulazione (factor facoltativo: secondi simulati per secondo reale)
curl -X POST $SENSU/api/v1/simulation/start -d '{"factor": 3600}'
# stato della run: state, sim_time, factor, total_readings, active_faults
curl $SENSU/api/v1/simulation
# ultime rilevazioni di una stazione
curl "$SENSU/api/v1/readings?station=st-001&limit=20"
Dispositivi
| Rotta | Funzione |
|---|---|
GET/POST /stations | elenco e registrazione stazioni |
GET/PUT/DELETE /stations/{id} | lettura, modifica, eliminazione |
GET/POST /sensors | elenco (?unassigned=true per i non assegnati) e registrazione |
GET/PUT/DELETE /sensors/{id} | lettura, modifica, eliminazione |
GET /sensors/{id}/detail | scheda completa: stazione, posizione, stato, guasto attivo |
PUT/DELETE /sensors/{id}/association | associa ({"station_id": "…"}) o dissocia |
GET /associations | coppie sensore → stazione |
GET /associations/validate?sensor=&station= | valuta un'associazione senza applicarla |
curl -X POST $SENSU/api/v1/stations -d '{
"id": "st-100", "name": "Stazione di prova",
"position": {"lat": 45.05, "lon": 9.69},
"coverage_radius_km": 2, "capacity": 10
}'
curl -X POST $SENSU/api/v1/sensors -d '{
"id": "sn-9000", "name": "Termometro di prova",
"quantity": "temperature", "sampling_period": "5m",
"station_id": "st-100"
}'
Il sensore non ha coordinate proprie: la posizione è quella della
stazione. station_id è facoltativo; sampling_period è
una durata (30s, 5m, 1h).
Grandezze ammesse in quantity
| Valore | Grandezza | Unità |
|---|---|---|
temperature | Temperatura | °C |
humidity | Umidità relativa | % |
pressure | Pressione atmosferica | hPa |
pm25 | Particolato PM2.5 | µg/m³ |
pm10 | Particolato PM10 | µg/m³ |
co2 | Anidride carbonica | ppm |
no2 | Biossido di azoto | µg/m³ |
ozone | Ozono | µg/m³ |
rain | Pioggia | mm/h |
wind_speed | Velocità del vento | m/s |
wind_direction | Direzione del vento | ° |
noise | Rumore | dB |
soil_moisture | Umidità del suolo | % |
water_level | Livello idrometrico | m |
Rilevazioni ed eventi
| Rotta | Filtri |
|---|---|
GET /readings | sensor, station, from, to, limit (default 500, max 5000) |
GET /sensors/{id}/readings | from, to, limit |
GET /events | type (fault, recovery), origin (spontaneous, injected), target, limit |
GET /export/readings | come /readings, senza limite; format=csv|json |
GET /export/events | come /events, senza limite; format=csv|json |
from e to sono timestamp RFC 3339 sul
tempo simulato (es. 2026-01-01T12:00:00Z). Ogni rilevazione
riporta collected e collected_at: una misura di un
sensore orfano, di una stazione offline o persa dalla rete è generata ma non
raccolta.
Stream in tempo reale (SSE)
Per i sistemi a valle, due flussi Server-Sent Events fuori dal prefisso
/api/v1. Ogni messaggio ha event: reading o
event: event e il JSON nel campo data; un commento
: ping ogni 15 s tiene viva la connessione.
# solo ciò che una rete reale consegnerebbe (filtri: sensor, station)
curl -N "$SENSU/stream/readings?station=st-001"
# anche le rilevazioni non raccolte, utile in collaudo
curl -N "$SENSU/stream/readings?all=true"
# guasti e ripristini (filtro: target)
curl -N $SENSU/stream/events
Guasti
curl -X POST $SENSU/api/v1/faults -d '{
"target_kind": "sensor", "target_id": "sn-0001",
"fault_kind": "drift", "duration": "2h"
}'
curl $SENSU/api/v1/faults # guasti attivi
curl -X DELETE $SENSU/api/v1/faults/sensor/sn-0001 # ripristino
| Destinazione | fault_kind | Effetto |
|---|---|---|
| sensor | out_of_range | valori oltre il range plausibile |
drift | deriva di calibrazione progressiva | |
disconnect | misura ma non trasmette | |
shutdown | spento, nessuna rilevazione | |
| station | offline | stazione irraggiungibile: nulla viene raccolto |
duration è sul tempo simulato ed è facoltativa: senza,
il guasto resta finché non lo si rimuove. L'iniezione richiede la simulazione
avviata.
Simulazione e scenario
| Rotta | Funzione |
|---|---|
GET /simulation | stato della run |
POST /simulation/start | avvia o riprende; body facoltativo {"factor": N} |
POST /simulation/pause | sospende mantenendo lo stato |
POST /simulation/stop | termina la run |
GET/PUT /scenario | esporta lo scenario corrente, o ne carica uno |