Sensor de calidad del aire conectado a luftdaten.info ,Parte III – Guardar datos en mysql

Buenas , os voy a explicar como guardar los datos del sensor en nuestra base de datos mysql , lo primero que haremos será crear una tabla donde irán los datos , yo la cree con la siguiente estructura

CREATE TABLE `Aire_Casa` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `SDS_P1` DOUBLE(16,2) DEFAULT 0.00, `SDS_P2` DOUBLE(16,2) DEFAULT 0.00, `BME280_temperature` DOUBLE(16,2) DEFAULT 0.00, `BME280_pressure` DOUBLE(16,2) DEFAULT 0.00, `BME280_humidity` DOUBLE(16,2) DEFAULT 0.00, `Fecha` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`ID`) )
Lenguaje del código: SQL (Structured Query Language) (sql)

La finalidad es grabar en nuestra base de datos todos los datos que nos enviara el sensor en formato JSON

{ "software_version":"NRZ-2020-133", "age":"264", "sensordatavalues":[ { "value_type":"SDS_P1", "value":"9.88" }, { "value_type":"SDS_P2", "value":"2.60" }, { "value_type":"BME280_temperature", "value":"16.61" }, { "value_type":"BME280_pressure", "value":"101120.66" }, { "value_type":"BME280_humidity", "value":"62.74" }, { "value_type":"samples", "value":"10514545" }, { "value_type":"min_micro", "value":"28" }, { "value_type":"max_micro", "value":"20040" }, { "value_type":"interval", "value":"300000" }, { "value_type":"signal", "value":"-53" } ] }
Lenguaje del código: JSON / JSON con comentarios (json)

Luego crearemos una pagina llamada data.php , a la cual llegara el json anterior , en esta pagina trataremos los datos , los extraeremos y los insertaremos en la tabla Aire_Casa . os pego mi código para que no vayáis sobre seguro

<?php $servername = "localhost"; $dbname = "sensores"; $username = "XXXXXXXXXXXXXXXXXX"; $password = "YYYYYYYYYYYYYYYYYYYYYYYYYY"; $connect = mysqli_connect($servername, $username, $password, $dbname); // Conexion if (!$connect) { die("Fallo en la conexion : " . mysqli_connect_error()); } $data = json_decode(file_get_contents('php://input'), true); $datavalues = $data['sensordatavalues']; print_r($datavalues); //Extraemos los datos del json foreach ($datavalues as $item) { // echo $item['value_type'], PHP_EOL; // echo $item['value'], PHP_EOL; if ($item['value_type'] == "SDS_P1"){ $aire_SDS_P1 = $item['value']; } if ($item['value_type'] == "SDS_P2"){ $aire_SDS_P2 = $item['value']; } if ($item['value_type'] == "BME280_temperature"){ $aire_BME280_temperature = $item['value']; } if ($item['value_type'] == "BME280_pressure"){ $aire_BME280_pressure = $item['value'] / 100; } if ($item['value_type'] == "BME280_humidity"){ $aire_BME280_humidity = $item['value']; } if ($item['value_type'] == "signal"){ $aire_signal = $item['value']; } } $sql = "INSERT INTO Aire_Casa(SDS_P1, SDS_P2, BME280_temperature, BME280_pressure, BME280_humidity) VALUES('$aire_SDS_P1', '$aire_SDS_P2', '$aire_BME280_temperature', '$aire_BME280_pressure', '$aire_BME280_humidity')"; echo "SDS_P1 : " . $aire_SDS_P1, PHP_EOL; echo "SDS_P2 : " . $aire_SDS_P2, PHP_EOL; echo "BME280_temperature : " . $aire_BME280_temperature, PHP_EOL; echo "BME280_pressure : " . $aire_BME280_pressure, PHP_EOL; echo "BME280_humidity : " . $aire_BME280_humidity, PHP_EOL; echo "signal : " . $aire_signal, PHP_EOL; if (mysqli_query($connect, $sql)) { echo "Registro insertado...."; } else { echo "Error: " . $sql . "<br>" . mysqli_error($connect); } mysqli_close($connect); ?>
Lenguaje del código: PHP (php)

Para probarlo os recomiendo grabar un fichero data.json y enviarlo por curl para ver la respuesta del servidor al envío de los datos , podéis usar este comando para comprobarlo

curl -X POST -H "Content-Type: application/json" -d @data.json http://192.168.1.20:8045/aire/data.php
Lenguaje del código: JavaScript (javascript)

La respuesta si es correcto todo deberia ser algo como esto

[6] => Array ( [value_type] => min_micro [value] => 28 ) [7] => Array ( [value_type] => max_micro [value] => 20040 ) [8] => Array ( [value_type] => interval [value] => 300000 ) [9] => Array ( [value_type] => signal [value] => -53 ) ) SDS_P1 : 9.88 SDS_P2 : 2.60 BME280_temperature : 16.61 BME280_pressure : 1011.2066 BME280_humidity : 62.74 signal : -53 Registro insertado....
Lenguaje del código: PHP (php)

Si es así , perfecto entonces vamos a configurar el sensor para que envíe los datos de forma automática a data.php y este los inserte en la base de datos , para ello debemos rellenar la sección de api propia con los valores correctos

configuracion api propia

Si todo es correcto en cada ciclo de envío de datos ( yo lo tengo puesto a 300 segundos ) nos debería insertar un registro en nuestra tabla Aire_Casa y ver desde phpMyAdmin algo similar a esto.

Ya teneis los datos del sensor en vuestra base de datos , a partir de aquí el resto ya corre de vuestra imaginación