Mettere i dati dei sensori in un DB, usando MQTT

closeQuesto articolo è stato pubblicato 6 anni 15 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.

Questo articolo fa parte del progetto La Domotica fai-da-me ed è il naturale proseguimento dell’articolo sul server/broker MQTT.

Una volta realizzato il server è necessario intercettare i dati inviati dai sensori per memorizzarli nel DB.

Esatto, il DB. per poter lavorare con il database è necessario crearne uno. Io uso SQLite perché è facile, leggero e nativamente integrato in Python. Per installarlo basta usare il solito comando su Ubuntu

sudo apt-get install sqlite3

Per creare il DB è sufficiente accedere a sqlite indicando il nome del DB da creare

sqlite3 /percorso/domotica.db

Una volta dentro si devono creare le tabelle necessarie per memorizzare i dati, la struttura che ho pensato io è basata su tre tabelle:

  • I luoghi dei quali mi servono i dati
  • Le temperature
  • I consumi di corrente (questa tabella è usata dal progetto del misuratore di corrente)

Queste sono le tabelle da creare

CREATE TABLE Luoghi 
(
  ID INTEGER PRIMARY KEY ASC, 
  Descrizione TEXT NOT NULL
);

CREATE TABLE Temperature
(
  ID INTEGER PRIMARY KEY ASC, 
  Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
  Luogo INTEGER,
  Temp REAL,
  Umid REAL,
  Vbatt REAL
);

Una volta create le due tabelle è necessario inserire i vari luoghi che si vogliono monitorare con delle semplici INSERT

INSERT INTO Luoghi (Descrizione) VALUES ('[nome ambiente');

L’identificativo del campo “ID” viene messo automaticamente, per vederlo basta fare una SELECT sulla tabella

SELECT * FROM Luoghi;

Il risultato dovrebbe essere una cosa tipo questa

sqlite> select * from luoghi; 
1|Camera
2|Balcone Strada
3|Cucina
4|Sala

Per comodità è bene prendere nota di questi valori, perché ci serviranno per programmare i sensori e fare le varie query.

Il programma è scritto ovviamente in Python e può essere trovato nella pagina GitHub del progetto. Per poter funzionare sono necessarie alcune librerie, una di queste, che sicuramente manca nel server è la libreria PAHO-MQTT, che permette di gestire MQTT con Python. Si installa con il comando:

pip install paho-mqtt

Il programma va eseguito all’avvio del sistema, se no i sensori troveranno il server, manderanno i loro dati, ma questi non saranno salvati da nessuna parte. Per fare questo è necessario modificare il crontab con il comando

crontab -e

A questo punto si deve inserire la riga

# avvio del sistema che salva i dati vai MQTT al boot
@reboot python /percorso/mqtt_to_db.py >/percorso/mqtt_to_db_std.log 2>&1

per salvare il crontab basta fare Ctrl+X, S (o Y a seconda della lingua del sistema) e poi INVIO

Giusto per capire cosa abbiamo appena scritto:

  • le righe che iniziano con il cancelletto # sono commenti (usare bene i commenti è obbligatorio, sempre!)
  • @reboot: questa cosa va eseguita all’avvio del sistema
  • python /percorso/programma.py: esecuzione del programma
  • >/percorso/log: redirige lo standard output su un file di log invece che a video
  • 2>&1: redirige sullo stesso file di log anche l’output degli errori

Adesso mancano solo più i sensori!

Il progetto è rilasciato con licenza GPL V.3 (Open Source), quindi puoi prenderlo, fartelo a casa, modificarlo e pubblicarlo a nome tuo. Se lo condividi modificato devi citare questo sito (www.iltucci.com) come fonte principale.

2 pensieri riguardo “Mettere i dati dei sensori in un DB, usando MQTT”

  1. Buonasera
    sto facendo delle prove con un esp32 e MQTT, adesso ho l’esigenza di memorizzare i dati ricevuti
    in un db. Ho visto il tuo programma in python e sqllite. Ti chiedo gentilmente se è ancora valido oppure hai sviluppato una nuova versione. nel mio caso forse utilizzerò come db MYsql. Ti ringrazio in anticipo se mi dai un piccolo aiuto.

  2. Ciao, è un codice di più di 5 anni fa, su cui non metto mano da quando l’ho scritto, si SQlite dovrebbe andare, Per MySQL dovrai fare le modifiche sulla connessione al DB, ovviamente

Nota importante, da leggere prima di commentare

Questo è un blog scritto per passione, non fornisco quindi risposte di tipo professionale, se avete bisogno di un aiuto tecnico rivolgetevi ad un professionista di fiducia, non offendetevi se mi astengo dal rispondere. Vi ringrazio per la comprensione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.