Proyecto con muchos dispositivos que base de datos utilizar

Buenas, lo primero felicitaros por el foro y el soporte que ofrecéis, soy usuario en modo lectura desde hace un par de años.

Ahora mismo estoy con un proyecto el cual el cual va a constar de muchos dispositivos iguales monitorizando diferentes parámetros en hogares.

El proyecto lo tengo muy avanzado y funcionando en varios hogares ya para testear el funcionamiento. Estos dispositivos de prueba están configurados mediante el Skets para que se conecten a una base de datos MyQSL determinada, en un servidor determinado y una tabla determinada. Funcionan al 100%.

Este modo de envío de datos es solo para los prototipos, MySQL por que tenia un servidor ya pagado y conocía mas o menos su funcionamiento de otros proyectos.

Para el dispositivo final he estado probando varias opciones para almacenar los datos a parte de MySQL, como puedan ser las hojas de datos en drive, envío de .csv a una carpeta de un servidor online. Todas ellas las he conseguido implementar y hacer que funcionen, casi al 100%.

Mi primera consulta, es si podéis indicarme más opciones de hacer este mismo trabajo para investigarlas y ver su posible uso.

El proyecto lo he basado en una placa NodemCu ESP8266 12E, 4M Flash, programado a través del IDE de arduino.

Comienza con un app para poner los datos de la red wifi por el usuario basada en esta consulta del foro:

https://forum.arduino.cc/index.php?topic=483803.0

Recolecta los datos de diferentes sensores y los guarda en un archivo .txt (podría ser cualquier otra extensión) en la memoria Spiffs de la placa.

Una vez cada "X" tiempo se conecta a internet y lee el contenido del archivo guardado en Spiffs y en este caso compone las URL para poder enviar la información a la base de datos MySQL. de esta forma no pierdo la información si se cae la conexión o se apaga el dispositivo.

Actualmente la placa la tengo programada de tal forma que entra en modo servidor y puedo acceder desde cualquier otro dispositivo de la red local a través de la IP a una página web que alojo también en la memoria Spiffs. De esta forma me facilita la interacción con el usuario para poder mostrarle datos e incluso cambiar estados de pins, etc...

He probado también a parte de lo anterior, crear una app con APP Inventor 2, la cual interprete la base de datos MySQL y muestre la información, pero entre ambas opciones por ahora he utilizado la del servidor local.

La hora y fecha, así como la localización en coordenadas GPS las obtengo con el propio NodemCu y las librerías que existen destinadas para este trabajo.

Toda la programación la tengo clara, gracias al foro y a internet!

Van a ser muchos dispositivos individuales en diferentes hogares, espero que sean más de 1000 en un par de años y que siga subiendo los siguientes años.

Ahora tengo mi duda principal sobre todo el proyecto;

¿¿¿Que tipo de base de datos utilizar???

Sigo con MySQL, existen mejores opciones?

Teniendo el cuenta que el dispositivo final se tiene que conectar el solo con la base de datos (sea cual sea el método utilizado), sin que el usuario medie en nada de esto, y serán muchos dispositivos.

No tengo código que compartir, ya que tengo 7 o 8 versiones diferentes de código cada una para hacer las cosas descritas arriba, más HTML, PHP, App Inventor, Api´s, todos diferentes para probar todas las opciones descritas arriba.

Perdón por el tamaño de consulta, pero quería dejar claro como funciona el sistema por si condiciona en algo para la elección de la base de datos.

Gracias por adelantado. :wink:

Muchas gracias por contestar ArduMyth

Pues estuve pensando donde escribirlo y elegí mal el lugar, pido disculpas por ello.

No te voy a mentir, por ahora debido al margen de tiempo que barajo para terminar el proyecto no me voy a documentar en nodejs y Mysql por Mongoose, pero si que me lo apunto para empezar con ello en el siguiente proyecto y ver sus posibilidades, viendo como lo presentas. Te lo agradezco mucho, ya tengo referencia para saber que buscar.

No tengo problema con que la documentación este en otro idioma, casi el 75% del actual proyecto esta documentado de foros en ingles, alemán y chino.

Al final voy a optar por enviar los datos a una base de datos MySQL, a través de consultas GET y POST, recibidas por un PHP para la inserción.

Estoy programando el "Void Setup" para que realice la consulta a un php de si existe una tabla determinada en la base de datos o no.

En caso de respuesta negativa, quiero que se vuelva hacer la consulta pero esta vez añadiendo un número al final del nombre y que se autoincremente.

Hasta que obtenga una respuesta positiva.

Ejemplo:
Envío consulta si existe la tabla monitorizacion_1,
Y si la respuesta es negativa,
Enviar de nuevo la consulta pero esta vez con el nombre monitorizacion_2,
Así hasta obtener la respuesta positiva.

Adjunto al code del ESP8266, con la variable "Nombre_BD_MySQL_Variable" aún fija para testear que todo funciona. Ahora es donde necesito hacer que si autoincremente el valor.

#include <ESP8266WiFi.h>
#include "FS.h"

#include "DHTesp.h"

DHTesp dht;

int dhtPin = 14;

const char* ssid     = "XXX";
const char* password = "XXXX";

const char* host = "www.XXXX.com";

int analog_pin = 0;

String Nombre_BD_MySQL_Variable;

String Respuesta_existe_tabla_MySQL;

void setup() {
  Serial.begin(9600);
  
  SPIFFS.begin();
  //SPIFFS.format();
  Serial.println();

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(5000);
  }

/////////////////////////////////////////////Abrir y leer Spiffs "SpiffsNombreBD"////////////////////////////

  File SpiffsNombreBD = SPIFFS.open("/SpiffsNombreBD.txt", "r");
  if (!SpiffsNombreBD) {
    
      Serial.println("file open failed");
      
  }  
  
  Serial.println("====== Reading from SPIFFS file =======");

    String Nombre_BD_MySQL=SpiffsNombreBD.readStringUntil('\n');

    Serial.println(Nombre_BD_MySQL);


  //}
  // espere unos segundos antes de volver a hacerlo todo de nuevo
  delay(3000);
//}
  SpiffsNombreBD.close();
  



delay(2000);


if (Nombre_BD_MySQL == "")
{

Serial.println("Spiffs nombre de la base de datos vacio!");
delay(3000);

WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
  Serial.println("La Conexión con el servidor a fallado");
  return;
}
else
{
  Serial.println("La Conexión EXITOSA");
}
delay(3000);

  // We now create a URL for the request
  String url = "/medidor/existetabla1.php?";
  String key = "pass=1234";
  String dato1 = "nombretabla=";
  String dato2 = "Temperatura";
  

  client.print(String("GET ") + url + dato1 + dato2 + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
    while (client.available()) {
    String ExisteTablaMySQL = client.readStringUntil('\r');
  Serial.print("Existe la Base de Datos MySQL?  ");
  Serial.println(ExisteTablaMySQL);
  delay(1000);
    }
  
}
else{

Serial.println("Spiffs Nombre BD contiene información");
Serial.print("El nombre de la base de datos del archivo spiffs es: ");
delay(1000);
Serial.println(Nombre_BD_MySQL);
Nombre_BD_MySQL_Variable = Nombre_BD_MySQL;
Serial.print("El nombre de Nombre_BD_MySQL_Variable asignado es; " );
Serial.println(Nombre_BD_MySQL_Variable);
}

}

  
void loop() {

 
  
}

Repasando el código, creo que me he complicado al poder hacer lo mismo en el "void Loop", condicionando con in "if" hasta obtener la respuesta positiva.

Aún así me gustaría saber si desde el "void setup" existe forma de realizarlo.

Gracias de nuevo, un saludo

Buenas de nuevo.

Doy esta consulta por cerrada.

Gracias de nuevo ArduMyth por la referencia, he estado leyendo un poco y me ha picado la curiosidad.

Eso si, no va ser cosa de 2 tardes para poder poner en marcha.

Sigue con MySQL, no vale la pena transistar la curva de aprendizaje de algo nuevo.
Si estoy de acuerdo que nodejs, mongosee y otras alternativas son excelentes.

De hecho yo uso nodejs, json, etc. pero tmb uso MySQL con Nodejs, según como se presentan las cosas.