INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
SPIFFS Messwerte speichern
15.03.2019, 08:41
Beitrag #1
SPIFFS Messwerte speichern
Hallo zusammen,

mal wieder eine Frage:
Ich möchte fortlaufende Messwerte in einer Datei speichern. Bis jetzt mache ich dies:
erste Werte werden gespeichert,
wenn die nächsten Werte kommen wird die Datei in einen String gelesen, die neuen Werte ans Endes dieses Strings gehängt und der dann wieder mit dem alten Dateinamen im SPIFF gespeichert.
Das klappt auch. Aber jetzt habe ich bemerkt, dass irgendwann die Datei geleert und neu beschrieben wird, also alle älteren Werte sind weg.

Meine Frage: Gibt es eine max. Größe (ausser der Speicherplatzgröße) für die Datei und / oder wie lange darf ein String eigentlich sein?
Oder gibt es eine andere Möglichkeit an eine Datei etwas anzuhängen?

(NODEMCU, 2 MB SPIFFS).

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 09:30 (Dieser Beitrag wurde zuletzt bearbeitet: 15.03.2019 10:21 von Fips.)
Beitrag #2
RE: SPIFFS Messwerte speichern
Einfach anhängen.

Edit: Ich war unterwegs!
Die Haltbarkeit des Speichers ist endlich, also möglichst nur speichern wenn sich die Werte geändert haben.
Wenn du viel mit dem Esp8266 machst, speicher dir doch mal folgende Links.
https://arduino-esp8266.readthedocs.io/en/latest/
https://links2004.github.io/Arduino/classes.html

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 11:19 (Dieser Beitrag wurde zuletzt bearbeitet: 15.03.2019 11:19 von Tommy56.)
Beitrag #3
RE: SPIFFS Messwerte speichern
Wenn sich die Werte häufig ändern, würde ich eher zu einem FRAM raten.
Hier fehlen mal wieder Infos vom TO.

Wie wäre es mit dem Sketch?
Zeilenweise Speichern und lesen ist günstiger.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 16:07
Beitrag #4
RE: SPIFFS Messwerte speichern
So, hier mal der jetzt laufende Sketch
Code:
const String Version           = "SPIFFSTEST Ver. 07.03.2019",
             Build    = "Build " + String(__DATE__) + ", " + String(  __TIME__) ;

#include <FS.h>
// --------------------------------------------------------------------
void setup()
{
  SPIFFS.begin();
  Serial.begin(74880);
  Serial.print(Version + "\n" + Build + "\n");
}
// --------------------------------------------------------------------
void loop()
{
  delay(10);
  FSInfo fs_info;
  SPIFFS.info(fs_info);
  Serial.println(fs_info.usedBytes);
  Serial.println(fs_info.totalBytes);
  Serial.println(fs_info.totalBytes - fs_info.usedBytes);
  Serial.println();
  delay(100);
  schreibeSPIFFS("Hallo Text 1234567890 1234567890 1234567890 1234567890", "test.txt", true);                                              // Daten auf SPIFFS schreiben
}


//-------------------------------------------------
String schreibeSPIFFS(String Text, String filename, bool Flag)     // Flag true ist anhängen.
{ // For more information visit: https://fipsok.de
  String fn = filename;
  File f;

  if (!fn.startsWith("/")) fn = "/" + filename;

  if (Flag)                                                         // an Datei anhängen
  {
    f = SPIFFS.open(fn, "a");
    f.println(Text);
    delay(10);
    f.close();                                                  
  }
  else
  {
    f = SPIFFS.open(fn, "w");
    f.println(Text);
    f.close();                                                      
  }
  f = SPIFFS.open(fn, "r");
  Serial.println(f.readString());        
  f.close();

  return "ok";
}

Der Hinweis auf anhängen war es... Wenn man weiß wonach man googeln muss ist alles ganz einfach. Danke. Jetzt noch eine Frage am Rande:

Irgendwann kommt ein Punkt, an dem die gespeicherte Textdatei so groß ist, dass <<Serial.println(f.readString());>> so lang dauert dass der Watchdog zuschlägt. Was könnte man da machen?

Bei meinem Logger wird alle 30 Minuten ein Datensatz mit 13 Messwerten gespeichert, das müsste schon einige Zeit lang reichen....

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 16:34
Beitrag #5
RE: SPIFFS Messwerte speichern
Ich hatte ja schon geschrieben: Zeilenweise schreiben (machst Du ja schon) und lesen. Schau Dir readStringUntil an. Wenn Du die maximale Länge einer Zeile abschätzen kannst, dann nutze am Anfang reserve.
Zwischen den Zeilen immer yield() aufrufen, damit der Wachhund gefüttert wird.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 17:01 (Dieser Beitrag wurde zuletzt bearbeitet: 15.03.2019 17:48 von Fips.)
Beitrag #6
RE: SPIFFS Messwerte speichern
(15.03.2019 16:07)uk1408 schrieb:  Irgendwann kommt ein Punkt, an dem die gespeicherte Textdatei so groß ist, dass <<Serial.println(f.readString());>> so lang dauert dass der Watchdog zuschlägt. Was könnte man da machen?

Warum lädst du die Datei nicht einfach runter?
Das geht bedeutend schneller.

Eine wichtige Sache fehlt bei dir.

Der Spiffs lässt sich überfüllen. Dann kannst du zwar immer weiter schreiben aber nichts mehr lesen. Deine Dateien sind dann alle futsch. Dann hilft nur noch das neu formatieren des Speichers.

Die beste Erklärung dazu steht auf Ullis Roboter Seite
Zitat:Leider hat die Implementierung in der ESP8266-Arduino-Variante (Version 2.3.0) einen Bug. Es wird nicht erkannt, dass das SPIFFS voll ist. Man wird das SPIFFS "überfüllen". Weitere sinnvolle Zugriffe auf das SPIFFS sind dann nicht mehr möglich. Es hilft dann nur noch eine Neuformatierung des SPIFFS. Fips hat mich per E-Mail auf diesen Umstand aufmerksam gemacht. Dies betrifft (betraf) insbesondere meine Implementierung des SPIFFS-Editors als Web-Interface.

Das Problem ist zweigeteilt. Zum einen kann trotz gefüllten SPIFFS' weiter geschrieben werden. File::write() zerstört die SPIFFS-Struktur unbarmherzig. Das zweite Problem ist, dass FSInfo.usedBytes nicht den korrekten Füllstand anzeigt. Bei der Ermittlung des freien Speichers gibt es "Unschärfen", die ich leider nicht in der Lage bin aufzulösen. Das SPIFFS ist einfach sehr komplex und der Code nicht wirklich gut dokumentiert.

Fips hat mehrere Versuche angestellt, aber auch keine exakte Lösung gefunden. Aber er hat eine pragmatische Alternative aufgezeigt:

Man versieht FSInfo.usedBytes mit einem Sicherheitsaufschlag. Seinen Erfahrungen nach sind etwa 5% ausreichend (Faktor 1.05). Der freie Speicher wird dadurch reduziert.

Belegter Speicher = FSInfo.usedBytes * 1.05
Freier Speicher = FSInfo.totalBytes - Belegter Speicher.

Meine Hilfsfunktion dazu:
Code:
bool freeSpace(uint16_t const& printsize) {            // Funktion um beim speichern in Logdateien zu prüfen ob noch genügend freier Platz verfügbar ist.
  FSInfo fs_info;   SPIFFS.info(fs_info);              // Füllt FSInfo Struktur mit Informationen über das Dateisystem
  //printf("Funktion: %s meldet in Zeile: %d FreeSpace: %s\n",__PRETTY_FUNCTION__,__LINE__,formatBytes(fs_info.totalBytes - (fs_info.usedBytes * 1.05)).c_str());
  return (fs_info.totalBytes - (fs_info.usedBytes * 1.05) > printsize) ? true : false;
}

Insgesamt finde ich sieht das bei dir irgendwie komplieziert aus.
Das speichern von Logdateien sieht bei mir so aus.
Code:
File f = SPIFFS.open("/ablauf.txt", "a");                       // Nur zum Debuggen
    if (f && freeSpace(200)) {
      f.printf("%s Push anheizen false - Push nachlegen true - Ofen angeheizt - Max return\n", oz.Zeitstempel);
    }
    f.close();

Kompliziert kann ich aber auch. Die folgende Funktion speichert bis zu 400 Werte mit einmal.
Code:
void printer() {
  File file = SPIFFS.open("/szeit.dat", "w");
  if (file) {
    for (auto i = 0; i < count; i++) {
      file.write(switchActive[i]);
    }
    for (auto i = 0; i < count; i++) {
      for (auto j = 0; j < 7; j++) {
        file.write(wday[i][j]);
      }
    }
    for (auto i = 0; i < count * 2; i++) {
      file.printf("\n%s", switchTime[i]);
    }
    file.close();
  }
}

Edit: In 2.4.2 wird die Struktur des Spiffs nicht mehr zerstört.
Bei gefüllten Spiffs wird die letzte Datei zwar gelesen aber nicht mehr bis zum Ende geschrieben.
Unschön dabei ist, es kommt keine Fertigmeldung wodurch die Webseite nicht neu geladen wird. "Gefühlt" bleibt die Verbindung offen!
Genaues kann ich nach dem kurzen Test noch nicht sagen.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2019, 18:38
Beitrag #7
RE: SPIFFS Messwerte speichern
Mein Sketch war nur zum testen der SPIFF-Funktion, im "richtigen" Sketch ist eine Abfrage auf Speicherplatz drin (obwohl da nie was passiert, 100 Byte pro Stunde sind 876 kB im Jahr).Und auch die Daten werden heruntergeladen, wie gesagt hier ging es nur ums testen....

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 09:31
Beitrag #8
RE: SPIFFS Messwerte speichern
(15.03.2019 18:38)uk1408 schrieb:  Und auch die Daten werden heruntergeladen, wie gesagt hier ging es nur ums testen....

Das konnte ich nicht wissen.

(15.03.2019 16:07)uk1408 schrieb:  Irgendwann kommt ein Punkt, an dem die gespeicherte Textdatei so groß ist, dass <<Serial.println(f.readString());>> so lang dauert

Sah für mich aus als wenn du es so machst.

Fazit: Dann ist ja alles gut!


Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 als SPIFFS/Webserver soll Daten verarbeiten TiRe 23 2.948 23.01.2019 08:03
Letzter Beitrag: Fips
  Spiffs Verwaltung -->> ESP...Datei Verwaltung für ESP8266, Nodemcu, Wemos, Sonoff Fips 3 2.922 25.09.2018 07:56
Letzter Beitrag: Fips
  Spiffs-Verwaltung zum schnellen Einbinden in eigene Projekte Tommy56 6 4.764 11.04.2018 15:51
Letzter Beitrag: Tommy56
Lightbulb SPIFFS DOWNLOAD UPLOAD & DELETE Esp8266 NodeMCU Fips 30 12.525 23.03.2018 11:10
Letzter Beitrag: sfb2

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste