Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/dadebertolino/db-stazione-meteo/archive/refs/heads/main.zipMostra sul sito della scuola le misure della stazione meteo LoRa: ultimi valori e andamento. Niente servizi esterni, niente registrazioni, niente abbonamenti.
Versione: 0.1.0
Autore: Davide Bertolino
Licenza: GPL v2 or later
Richiede: WordPress 5.8+, PHP 7.4+
GitHub: dadebertolino/db-stazione-meteo
Come arrivano i dati
nodi LoRa ──► ricevitore ──USB──► Raspberry (bridge) ──HTTPS──► questo plugin
data e ora, POST /wp-json/dbmt/v1/misure
coda locale
Il bridge è nel repository del progetto, dadebertolino/stazione-meteo-lora. È lui a spingere i dati verso il sito: alla scuola non serve aprire nessuna porta.
Struttura
| File | Ruolo |
|---|---|
db-stazione-meteo.php |
file principale: costanti, updater, avvio |
inc/class-updater.php |
aggiornamenti da GitHub Releases (DB_GitHub_Updater_V2) |
inc/class-dbmt-db.php |
tabella {prefix}dbmt_misure, creata all'attivazione |
inc/class-dbmt-rest.php |
endpoint POST /dbmt/v1/misure: ricezione dal bridge, con token |
inc/class-dbmt-validazione.php |
controllo di ogni misura, campo per campo |
inc/class-dbmt-token.php |
token del bridge: nel database solo l'hash |
inc/class-dbmt-admin.php |
Impostazioni → Stazione Meteo: token, quota, stato |
inc/class-dbmt-shortcode.php |
shortcode [dbmt_meteo] (ultimi valori) e [dbmt_grafici] (andamento) |
inc/class-dbmt-serie.php |
serie aggregate per i grafici: GET /dbmt/v1/serie |
inc/class-dbmt-meteo.php |
pressione riportata al livello del mare |
assets/js/grafici.js |
grafici SVG, senza librerie né CDN |
assets/css/db-admin-ui.css |
design system admin condiviso |
uninstall.php |
rimuove tabella e opzioni |
tests/run-tests.php |
test senza WordPress: php tests/run-tests.php |
Sulla pagina
[dbmt_meteo] ultimi valori di ogni nodo, minima e massima delle 24 ore
[dbmt_meteo nodo="2"] un nodo solo
[dbmt_grafici] andamento: 24 ore, 7 giorni, 30 giorni
[dbmt_grafici periodo="7g"]
I grafici sono tre, uno sotto l'altro con lo stesso asse dei tempi: temperatura, umidità, pressione al livello del mare. Grandezze con unità diverse non condividono mai un asse. Ogni nodo è una linea con il colore del suo numero (la palette è verificata per il daltonismo); sui 7 e 30 giorni una fascia mostra minima e massima di ogni intervallo. Dove mancano misure la linea si interrompe. Il mouse, o le frecce della tastiera sul grafico selezionato, mostra in un solo riquadro i valori di tutti i nodi in quell'istante; "Mostra i dati in tabella" dà gli stessi dati senza grafico.
Sono disegnati in SVG da assets/js/grafici.js, senza librerie e senza CDN: la pagina della scuola non fa richieste a server esterni. Si aggiornano da soli ogni 5 minuti.
Le serie arrivano già aggregate da GET /wp-json/dbmt/v1/serie?periodo=24h|7g|30g, pubblico e in sola lettura: medie a 10 minuti (24 ore), a un'ora (7 giorni), a 3 ore (30 giorni), quindi al massimo qualche centinaio di punti anche dopo anni di dati. In cache da 1 a 15 minuti secondo il periodo.
Dati
Una riga per misura, con l'ora di arrivo assegnata dal Raspberry. La chiave unica (nodo, ora di arrivo) scarta i reinvii: il bridge può rimandare un gruppo di misure senza creare doppioni.
L'ora si salva in UTC. In ora locale, nella notte del cambio d'ora di ottobre, l'ora fra le 2 e le 3 si ripete: due misure diverse avrebbero la stessa ora e la seconda verrebbe scartata come doppione.
La pressione si salva come misurata sul posto; la pagina la mostra riportata al livello del mare con la quota delle impostazioni (predefinita 395 m).
Nessun dato personale: solo misure ambientali e diagnostica dei nodi.
Formato dei dati (bridge → plugin)
POST /wp-json/dbmt/v1/misure
X-DBMT-Token: <token>
Content-Type: application/json
{
"bridge": "0.1.0",
"misure": [
{
"ricevuto": "2026-10-25T17:42:07Z",
"nodo": 2,
"tipo": "bme280",
"seq": 41,
"reset": null,
"temp_c": 18.33,
"ur_pct": 57.24,
"press_hpa": 964.7,
"vbat_mv": 3000,
"vbat_tx_mv": 3000,
"rssi": -51,
"snr": 14
}
]
}
| Campo | Tipo | Note |
|---|---|---|
ricevuto |
stringa ISO 8601 | ora di arrivo al Raspberry, in UTC (Z) |
nodo |
intero 1-15 | |
tipo |
"bme280" o "sht45" |
|
seq |
intero 0-255 | 0 solo nel primo pacchetto dopo un riavvio del nodo |
reset |
intero 1-7 o null |
causa del riavvio, solo con seq 0 |
temp_c, ur_pct, press_hpa, vbat_mv, vbat_tx_mv |
numero o null |
null = misura non disponibile; press_hpa sempre null per l'SHT45 |
rssi, snr |
intero | qualità del segnale al ricevitore |
Il token si genera in Impostazioni → Stazione Meteo e si vede una sola volta. Va nell'header X-DBMT-Token; è accettato anche Authorization: Bearer <token>, ma alcuni hosting Apache tolgono quell'header prima di PHP e alcuni plugin di sicurezza lo intercettano.
Al massimo 500 misure per richiesta. Dopo un periodo senza internet il bridge svuota la coda in più richieste, dalle più vecchie.
Risposte
| Codice | Significato | Cosa fa il bridge |
|---|---|---|
200 |
gruppo elaborato | segna come inviate le misure inserite e i doppioni; quelle in scartate le segna come rifiutate, senza riprovare |
400 |
corpo non valido (JSON, campo misure mancante, più di 500 misure) |
non riprova lo stesso gruppo: è un errore del bridge, va nel log |
401 |
token mancante o sbagliato | si ferma e lo scrive nel log: va rigenerato il token |
5xx, timeout, rete assente |
sito non disponibile | riprova al giro successivo, senza perdere niente |
{ "ricevute": 10, "inserite": 9, "doppioni": 1, "scartate": [ { "indice": 4, "motivo": "temp_c fuori campo" } ] }
Una misura viene scartata, e non bloccata in coda per sempre, se ha un campo fuori campo o di tipo sbagliato: per esempio una temperatura fuori da −40…85 °C o una data nel futuro.