ESP8266: SMB-Dateizugriff möglich ? Sowie Frage zur Datenvisualisierung

Hallo,
ich möchte mittels eines ESP8266 Sensordaten aufnehmen, und sie im Zeitverlauf sowohl als Tabelle abspeichern, sowie über einen Webserver des ESPs anzeigen.

  • Für den Datenlog würde ich am liebsten eine einfache CSV-Datei auf eine SMB-Freigabe (wäre auch als FTP-Freigabe verfügbar) meiner Fritzbox 7590 schreiben.
    Gibt es eine Arduino-Bibliothek, die den (Schreib)Zugriff via SMB2, SMB3 oder FTP ermöglicht, oder ist das zu komplex ?
    (falls das nicht geht, würde ich das sonst über SPIFFS direkt auf dem ESP loggen, wäre aber nur zweite Wahl für mich).
  • Der ESP soll als kleiner Webserver die aktuellen Sensorwerte, sowie den Zeitverlauf der Sensordaten über eine einfache Graphik darstellen. Ersteres ist kein Problem, aber wie kann ich einen einfachen Zeitverlauf darstellen ?
    Ich hatte als einfache Lösung die Erzeugung einer SVG-Datei nach dem Beispiel hier website.c - Mikrocontroller.net angedacht.
    Würde es noch andere einfache Alternativen geben ?
    Ich möchte online-Dienste aus grundsätzlichen Erwägungen vermeiden, sowie MQTT aus Komplexizitätsgründen. Und Java/Javascript um das clientseitig aufzupeppen kann ich auch nicht...

Danke & Gruß,
Tütenflieger

Zur Visualisierung - wie man einen Chart dynamisch generiert, rate ich dir diese Beiträge zu lesen, da steht imho alles drinnen:

Zum Datenspeichern mittels SMB habe ich keine Idee.

Ich würde die Nutzdaten an einen Webserver übertragen und dort mittels PHP an die Datei entsprechend anfügen. Das habe ich mal in einem 4teiligen Tutorial versucht zu beschreiben: IoT: Datenübertragung mit dem ESP8266 an einen Webserver

Oder in eine MySQL/MariaDB Datenbank schreiben und daraus beliebige Grafiken, z.B. mit der PHP-Lib JpGraph erzeugen.
Egal welchen Weg Du gehen willst, um Lernen kommst Du nicht herum.

Gruß Tommy

Hallo,

Ich schreibe die Daten eines BME280 mittels FTP auf einen Stick in der Fritzbox. Eine fertige Lib dazu habe ich nicht gefunden, allerdings mehrere Vorlagen die im Wesentlichen alle ähnlich vorgehen. Als Vorlage hab ich dann das genommen und angepasst. Dabei werden die Daten mit append in eine CSV Datei geschrieben. Für jeden Monat gibts eine neue Datei. Das läuft jetzt seit fast zwei Jahren.

.FTP Client

Heinz

hier mein Schnipsel dazu

if (ftp_write())Serial.print(F("FTP ok")); // Aufruf wann erforderlich



//================ FTP ==============================
// -------------- ftp recive ---------------------
byte eRcv() {
  byte respCode;
  byte thisByte;

  while (!ftpClient.available()) delay(1);
  respCode = ftpClient.peek();
  byte i = 0;
  while (ftpClient.available()) {
    thisByte = ftpClient.read();
    if (i < 200) {
      buffer[i] = thisByte;
      i++;
      buffer[i] = 0;
    }
  }
  Serial.print(respCode); Serial.print("  "); Serial.println(buffer);

  if (respCode >= '4') {
    efail();
    return 0;
  }
  return 1;

}
//----------------- ftp client fehler ----------------
void efail() {
  byte thisByte = 0;

  ftpClient.println(F("QUIT"));
  while (!ftpClient.available()) delay(1);
  while (ftpClient.available()) {
    thisByte = ftpClient.read();
    Serial.write(thisByte);
  }
  ftpClient.stop();
  Serial.println(F("Abbruch FTP getrennt"));

}



//--------------------- FTP daten schreiben-------------

byte ftp_write() {
  char file [20];
  sprintf(file, "%02d%02dwet.csv", jahr - 2000, monat);

  char DatumZeit[40];
  sprintf(DatumZeit, "%02d.%02d.%04d %02d:%02d:%02d",
          lasttag, lastmonat, lastjahr, lasthour, lastmin, lastsec);

  //  sprintf(DatumZeit, "%04d-%02d-%02d %02d:%02d:%02d",
  //          jahr, monat, tag, stunden, minuten, sekunden);

  Serial.println (file);
  Serial.println(DatumZeit);

  if (ftpClient.connect(gateway, 21)) {
    Serial.println(F("FTP Server verbunden"));
  }
  else {
    Serial.println(F("FTP Verbindung nicht möglich"));
    return 0;
  }

  if (!eRcv()) return 0;

  Serial.println(F("send user"));
  ftpClient.println(F("USER xxxxx"));// xxx Benutzer
  if (!eRcv()) return 0;

  Serial.println(F("Send password"));
  ftpClient.println(F("PASS yyyyy"));// yyy password
  if (!eRcv()) return 0;

  Serial.println(F("send SYST"));
  ftpClient.println(F("SYST"));
  if (!eRcv()) return 0;

  Serial.println(F("Verzeichniss wechseln"));
  ftpClient.println(F("CWD STICK"));
  if (!eRcv()) return 0;

  Serial.println(F("CWD daten"));
  ftpClient.println(F("CWD daten"));
  if (!eRcv()) return 0;

  Serial.println(F("pwd"));
  ftpClient.println(F("pwd"));
  if (!eRcv()) return 0;

  Serial.println(F("TYPE I"));
  ftpClient.println(F("TYPE I"));
  if (!eRcv()) return 0;

  Serial.println(F("PASV"));
  ftpClient.println(F("PASV"));
  if (!eRcv()) return 0;

  // Port auslesen steht nach 4 und 5 Komma
  char *tStr = strtok(buffer, "(,");
  int array_pasv[6];
  for (int i = 0; i < 6; i++) {
    tStr = strtok(NULL, "(,");
    array_pasv[i] = atoi(tStr);
    if (tStr == NULL) {
      Serial.println(F("Bad PASV Answer"));
    }
  }
  unsigned int hiport, loport;
  hiport = array_pasv[4] << 8;
  loport = array_pasv[5] & 255;
  hiport = hiport | loport;
  Serial.print(F("vom Server Port für Daten erhalten: ")); Serial.println(hiport);

  if (dClient.connect(gateway, hiport)) {
    Serial.println(F("FTP Dateserver verbunden"));
  }
  else {
    Serial.println(F("Daten-Verbindung nicht möglich"));
    return 0;
  }

  Serial.println(F("send Append"));
  ftpClient.print(F("APPE ")); ftpClient.println(file);

  if (!eRcv()) {
    dClient.stop();
    return 0;
  }
  String buf, buf1;
  buf += temp;
  buf += "; ";
  buf += hum;
  buf += "; ";
  buf += pres;
  buf += "; ";
  buf += VCC;
  buf.replace(".", ","); // punkt gegen Komma tauschen sonst wird das mit Excell nix

  buf1 = DatumZeit;
  buf1 += "; ";
  buf1 += buf;
  buf1 += ("\r\n");


  dClient.print(buf1);
  delay(1);
  dClient.stop();
  Serial.println(F("QUIT"));
  ftpClient.println(F("QUIT"));
  if (!eRcv()) return 0;
  ftpClient.stop();
  Serial.println(F("Verbindung normal beendet"));

  return 1;

}

Hallo,
Danke für die Infos.
@noiasca: Der Thread im Arduino-Forum zur Graphenerzeugung sieht ja echt gut aus, mit ansprechender Graphik. Ich werde mir das mal genauer anschauen, evtl. brauche ich nur wirklich kleine Modifikationen des JS Scriptes. Und ein genauerer Blick auf Fipsok.de steht auch auf meiner Todo-Liste.
Ich will mich nur nicht zu tief in JS reinhängen, mein Zeitbudget lässt neben den kleinen Arduino Spielereien in C nur noch wenig anderes zu, und das will ich eher in einen Einstieg in Python für das ML investieren.
@Rentner: Das Logging auf der Fritzbox ist ziemlich genau das Gleiche was ich brauche. Danke für den Tip!
@Tommy56: Datenbanken sind mir hier zu komplex.

Gruß,
Tütenflieger