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`)
) 

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"
      }
   ]
}

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);

?>

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

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....

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