Webapp mit JSON und SPIFFS -> eure Expertise

Hallo,
ich möchte mir gerne ein WebApp für meine Wallbox bauen. Damit ich die Webseite nicht andauern neu laden muss hätte ich mir gedacht, dass ich das so mache wie in dieser Anleitung:
https://www.youtube.com/watch?v=15X0WvGaVg8&t=1496s&ab_channel=mo_thunderz

Zu dieser Lösung habe ich aber jetzt mal eine Frage:
Sehe ich das richtig, dass das JSON in beiden fällen (TX RX) erst dann die "JSON Datei" erstellt sobald sich jemand via Browser auf den ESP32 verbindet?

Wäre es ein Nachteil wenn man das ganze via JSON-File und SPIFFS macht? also das ein fixes JSON-File auf dem SPIFFS liegt und über diese kommuniziert wird.

Hier mal mein Code-Schnipsel wie ich das erstellt habe zum lesen von Daten:

///////////// START Read from SPIFFS config.json /////////////////////
//            and parse this to variables
//////////////////////////////////////////////////////////////////////
    File configFile = SPIFFS.open("/config.json", "r"); //r= ReadMode
    long filesize = configFile.size();
    if (filesize > 1024) {
      Serial.print("\r\n");
      Serial.printf("File size is too large -> Size:%d Byte", filesize);
    }
    if (!configFile) {
      Serial.print("Faild to open file");
    } 

      std::unique_ptr<char[]> buf(new char[filesize]);
      configFile.readBytes(buf.get(), filesize);
      // Serial.println(buf.get());      // Anzeigen des Inhalts der JSON-Datei
      StaticJsonDocument<1024> doc;
      DeserializationError error = deserializeJson(doc, buf.get());
      if (error) {
        Serial.print("\r\n");
        Serial.print("deserializeJson Error: ");
        Serial.println(error.c_str());
      }
      //////////// Umlegen in Variablen
      String test = doc["serverName"];
      String test1 = doc["acessTocken"];
      int intTest = doc["intTest"]; 
        Serial.print("\r\n");
        Serial.printf("\n%s", test1);      
        Serial.printf("\n%s", test);
        Serial.printf("\n%d", intTest);
        Serial.print("\r\n");
      configFile.close();  
///////////// END Read from SPIFFS config.json //////////////////////
//
/////////////////////////////////////////////////////////////////////

Vorteil wäre, dass dann ja die Daten remanent gespeichert sind. Ich denke da an Schalterstellungen etc. die nach einem reboot dort sein sollten wo sie vorher waren.
hat man einen Nachteil es wird ja dann auch das SPIFFS-File-System permanent geladen bzw. beschrieben?

Danke für deine Antwort und Expertise!

das macht wohl weniger Sinn oder? Du hast am ESP aktuelle Werte, die bringst in ein JSON und schickst sie dann an den Browser raus.

Was anderes ist wenn man Werte zunächst mal über einen Systemstart behalten will. Typische Variablen würde ich am ESP32 aber in den preferences halten, und damit dann eben das JSON befüllen wenn am Browser benötigt.

Welchen MC verwendest Du?
SPIFFS ist als deprecated gekennzeichnet, wird also irgendwann verschwinden. Besser das aktuelle LittleFS verwenden.
Beide schreiben ihre Dateien ins Flash, damit ist die Anzahl der Schreibzyklen begrenzt.
Wenn Du nur selten etwas änderst ok, wenn es laufend passiert, musst Du einen anderen Weg gehen. (Evtl. FRAM mit LittleFS auf Teensy)

Gruß Tommy

Danke für die raschen Antworten,
ich habe schon gelesen, dass SPIFFS vom Aussterben bedroht ist aber ich habe sonst keine guten Anleitungen gefunden für LittleFS odgl.
zzt. Speichere ich IP-Adresse und manche Einstellungen die man nur selten einstellt via EEPROM jedoch sind beispielsweise Ladesessions mit Datum, Uhrzeit, RFID-Tag, usw. praktischer via JSON auf dem File-System finde ich. Zudem liegt ja sowieso schon die ganze WebApp auf dem FileSystem. Diese lade ich dann via "Sketch Data Upload" auf den ESP32-WROOM-32U hoch.

@Tommy56
was meinst du mit "FRAM mit LittleFS auf Teensy" gibt es da verständliche Anleitungen?
Wäre das was für meinen MC?

DANKE!

am ESP32 ist SPIFFS meines Wissens noch nicht abgekündigt. Da würde ich noch nicht auf eine andere Lib gehen. Statt der EEPROM Emulation würde ich wie schon erwähnt die preferences nehmen.

Am ESP8266 siehts anders aus :wink:

LittleFS gehört mittlerweile zu den Libs, die mit dem Core ausgeliefert werden.

Gruß Tommy

sorry für meine leihenfrage aber was sind die preferences? ist das speichern via eeprom nicht mehr stand der technik?

https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/preferences.html

Wenn ein EEPROM vorhanden ist durchaus, aber ESP32 hat keins, der tut nur so, Emulation eben.

ist das jetzt schlecht, dass man nicht die ESP preferences verwendet sondern EEPROM?
Was sind die Vor- und Nachteile dieser beiden versionen... oder gibt es überhaupt einen unterschied?

Der Hersteller schreibt:
It should be considered as the replacement for the Arduino EEPROM library.

Reicht dir das nicht um von einem toten Pferd abzusteigen und ein neues zu satteln?

Als Vorteil sehe ich, dass man beim Auslesen einen Default-Wert mitgeben kann. Wenn die Variable bisher nicht gespeichert war, bekommt man den Default Wert retour. Finde ich für "Systemeinstellungen" gut.

Man kann es in vielen Fällen recht einfach ersetzen
https://unsinnsbasis.de/littlefs-esp32/

Dafür gibt es einen guten Grund: LittleFS funktioniert so wie SPIFFS, die Methoden sind die gleichen. Wenn Du in einem Beispiel "SPIFFS" in "LittleFS" umbenennst, wird 99 % funktionieren.

Die Arduino-IDE enthält ein Beispiel für LittleFS.

Ob Du SPIFFS oder LittleFS, EEPROM oder Preferences nutzt, bleibt Dir überlassen. Wir geben Dir nur Hinweise, die zukunftsfähigere Wahl zu treffen.

Schau mal zu Fips mit der LittleFS-Ergänzung von agmue (anstelle von SPIFFS).

Bei LittleFS auf FRAM war ein Link dabei. Der Code ist für einen Tennsy. Man kann ihn aber auf dieser Basis evtl. auf ESP32 umschreiben, wenn man will. Oder die Strukturen direkt im FRAM speichern.

Gruß Tommy

Danke für eure wertvollen Beiträge! ich werde auf jedenfalls in naher Zukunft auf LittleFS umsteigen und auch nicht mehr EEPROM verwenden sondern preferences für meinen ESP32.

Nun noch zu einer (für mich) Herkulesaufgabe in Sachen JSON mit dem Arduino. Und zwar folgendes Szenario:
Ich habe ein Json-File zzt. noch auf dem SPIFFS. Dieses hat ein Array[100] mit mehreren Einträgen (Datum&Uhrzeit-Ladung-Start, Datum&Uhrzeit-Ladung-Stop, Zählerstand-Start, Zählerstand-Stop, RFIF-Tag, usw.) und nun möchte ich bei Start einer Ladung alle Einträge im Array um eine Position verschieben und in das "oberste" Array ( Array[1] oder Array[0]) die aktuelle Ladung eintragen.

Hättet Ihr da einen Ansatz wie ich das mit dem ESP32 hinbekomme?

DANKE!

wenn deine Einträge eh schon einen Zeitstempel haben, dann bräuchtest doch nur einfach den ältestens überschreiben. Also wie bei einem Ringbuffer.

Für solche Sachen sind Files die denkbar schlechtesten Speicher.
Da kannst Du nichts einfach vorn raus nehmen. Da musst Du entweder mit 2 Files arbeiten und die Sätze vom alten File lesen und hinten ran ins neue File schreiben oder in ein Array einlesen und neu schreiben.

Sowas schreit eigentlich nach einem Array mit Sicherung im FRAM oder nach einer externen Datenbank.

Wieviele Bytes hat denn ein solcher Datensatz?

Gruß Tommy

Hallo,
warum muss es JSON sein , weil Du das auf einer HTML Seite anzeigen willst. ? Eine oder mehrere Struct getrennt nach Nutzdaten , dein Array , und Ini-Daten sind eventuell leichter zu händeln.
Heinz

> wenn deine Einträge eh schon einen Zeitstempel haben, dann bräuchtest doch nur einfach den ältestens überschreiben. Also wie bei einem Ringbuffer.

also das wäre mir etwas zu gefährlich... was ist wenn kein Datum drinnen steht oder mehrmalig aus irgend einem Grund!? Ringspeicher ist meiner Meinung nach ja genau das was ich beschrieben Habe also das verschieben von Einträgen und irgend wann fällt halt dann der letzte hinten raus. Zumindest habe ich meine Störmelde-Puffer früher immer so gemacht jedoch nicht mit einem ESP und auch nicht mit JSON.

Warum muss es denn unbedingt JSON und ein File sein?
In welchen Zeitabständen werden denn die Daten geschrieben? Die Frage nach der Größe hast Du auch noch nicht beantwortet.

Gruß Tommy