105 lines
3.6 KiB
JavaScript
105 lines
3.6 KiB
JavaScript
// Importamos las utilidades que necesitemos y la configuración del programa
|
|
import { sleep, saveDataInFile } from './utils.js';
|
|
import config from '../config.js';
|
|
|
|
// Creamos una lista de elementos que contendrá las peticiones acumuladas para enviarlas de golpe
|
|
const peticionesRetrasadas = [];
|
|
|
|
/**
|
|
* Añade el dato a la lista de peticiones en el formato que necesita la api
|
|
* @param {object} datos Objeto con los datos a subir
|
|
*/
|
|
async function subirDato(datos) {
|
|
if (datos === null || datos === undefined) {
|
|
return;
|
|
}
|
|
const datosParaEnviar = {
|
|
created_at: datos.datetime,
|
|
//delta_t: 1, // Activar si da problemas con el tiempo
|
|
field1: datos.paquetes,
|
|
field2: datos.temperatura,
|
|
field3: datos.presion,
|
|
field4: datos.altitudSegunPresion,
|
|
field5: datos.altitudMetros,
|
|
field6: datos.velocidadKmph,
|
|
field7: datos.numSatelites,
|
|
latitude: datos.latitud,
|
|
longitude: datos.longitud
|
|
};
|
|
|
|
peticionesRetrasadas.push(datosParaEnviar);
|
|
saveDataInFile(datos);
|
|
}
|
|
|
|
|
|
/**
|
|
* Sube los datos de golpe al ThingSpeak
|
|
* @param {Array} datosParaSubir Array de objetos con los datos a subir
|
|
* @returns {Promise<boolean>} True si se subieron los datos correctamente, false si no
|
|
*/
|
|
async function subirDatosDeGolpe(datosParaSubir) {
|
|
//console.log("Subiendo datos de golpe...");
|
|
|
|
// Si no hay datos, no subimos nada
|
|
if(datosParaSubir.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
// Preparamos los datos para subir añadiendo la apiKey
|
|
const datosParaEnviar = {
|
|
write_api_key: config.thingSpeak.writeKey,
|
|
updates: datosParaSubir
|
|
}
|
|
|
|
//console.log(datosParaEnviar);
|
|
|
|
// Hacemos la petición a la API de ThingSpeak
|
|
let resultado = false;
|
|
await fetch(`https://api.thingspeak.com/channels/${config.thingSpeak.channelId}/bulk_update.json`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json"
|
|
},
|
|
body: JSON.stringify(datosParaEnviar) // Convertimos el objeto a JSON para enviarlo
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
console.log(data);
|
|
resultado = true; // Si todo sale bien, devolvemos true
|
|
})
|
|
.catch(error => {
|
|
console.error('Error al subir los datos:', error);
|
|
resultado = false; // Si algo sale mal, devolvemos false
|
|
})
|
|
return resultado;
|
|
}
|
|
|
|
/**
|
|
* Bucle infinito que sube los datos de golpe al ThingSpeak cada 20 segundos
|
|
*/
|
|
async function bucleSubidaDatos() {
|
|
// Creamos bucle infinito
|
|
while(true) {
|
|
await sleep(20000); // Esperamos 20 segundos
|
|
// console.log("Lista por subir: " + peticionesRetrasadas.length);
|
|
const datosQueSeVanASubir = JSON.parse(JSON.stringify(peticionesRetrasadas))// Creamos una copia de los datos del array
|
|
if (await subirDatosDeGolpe(datosQueSeVanASubir)) { // Subimos los datos de golpe
|
|
if (peticionesRetrasadas.length == datosQueSeVanASubir.length) { // Si la cantidad de datos subida es diferente a la cantidad de datos en el array reiniciamos el array
|
|
peticionesRetrasadas.length = 0;
|
|
} else { // Puede darse el caso que mientras se suben los datos, lleguen nuevos y los eliminemos sin querer, por eso, sólo eliminamos de la lista original los datos que se han subido
|
|
peticionesRetrasadas.splice(0, datosQueSeVanASubir.length);
|
|
//console.log("Datos que se hubieran perdido: " + peticionesRetrasadas)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export {
|
|
subirDato,
|
|
subirDatosDeGolpe
|
|
}
|
|
|
|
bucleSubidaDatos();
|
|
|
|
|