ESP32 - fips - spiffs.html Upload funktioniert nicht

Hallo,

ich hätte noch eine Frage zum Datei Zeitstempel.
Es wird sich die richtige aktuelle Zeit vom pool.ntp.org geholt.
Jedoch sind alle Zeitstempel des Dateisystemtest von 1970.
Eine LittleFS.setTime() Methode o.ä. finde ich nicht.
Wir setzt man das "Dateisystem" auf die aktuelle Zeit?

Hast Du beim Bearbeiten des LittleFS schon die wirkliche Uhrzeit im System?
Schau mal hier.

Gruß Tommy

Hallo,

die Zeit kann sich der ESP aus dem Internet holen. Das IDE Bsp. ist ähnlich zu dem Link vom ESP8266 Sketch.

................WiFi connected
Contacting Time Server

Now is : 2024-04-18 18:55:45

----list 1----
Listing directory: /
  DIR : newDir  LAST WRITE: 1970-01-01 00:59:59
Listing directory: /newDir
  DIR : newOrder  LAST WRITE: 1970-01-01 00:59:59
Listing directory: /newOrder
Test complete

Wenn die Dateien mit diesem Timestamp geschrieben wurden, wird der auch so angezeigt. Lege doch mal neue Dateien an, wenn die Zeit gesetzt ist. Was zeigt das verlinkte Beispiel der Lib an?

Gruß Tommy

Das weiß ich leider nicht. Ich habe mir den Stand von Fips vor anderthalb Jahren oder so geholt, da gab es bei ihm noch kein LittleFS. Sein neuer Stand und meiner passen also nicht zueinander. Da es hier im Forum Nachfragen gab, hat Tommy meine LittleFS.ino auf seinem Server abgelegt, so daß ich darauf verweisen konnte. Das hat sich aber eigentlich erledigt, nachdem Fips LittleFS in seine Tabs integriert hat.

Soweit mich meine Erinnerung nicht trügt :wink:

Hallo,

ich arbeite immer noch mit dem IDE LittleFS_time Bsp. Sketch. Die Zeit wird als Erstes aus dem Internet geholt. Zeigt mit Now is: korrekt an.
Danach kommt eine Formatierung und dann werden immer alle Verzeichnisse erstellt. Nur eben mit falschen Datum.
Das ESP8266 Bsp. lässt sich nicht kompilieren. Die Lib Namen habe ich natürlich angepasst.

Ausgabe vom unteren Sketch.
Kann es sein das das Datum beim Verzeichnis erstellen immer 1970 ist und erst nach Änderungen darin (Datei schreiben) auf das richtige Datum aktualisiert wird?

@agmue : okay

Now is : 2024-04-18 19:29:51

----create and work with file----
Writing file: /mydir/hello.txt
File written
Appending to file: /mydir/hello.txt
Message appended
----list 3----
Listing directory: /
  DIR : mydir  LAST WRITE: 1970-01-01 00:59:59
Listing directory: /mydir
  FILE: hello.txt  SIZE: 13  LAST WRITE: 2024-04-18 19:29:51
  DIR : newDir  LAST WRITE: 1970-01-01 00:59:59
Listing directory: /newDir
  DIR : newOrder  LAST WRITE: 1970-01-01 00:59:59
Listing directory: /newOrder
Test complete
#include "FS.h"
//#include "SPIFFS.h"
#include "LittleFS.h"
#include <time.h>
#include <WiFi.h>

constexpr bool FORMAT_LITTLEFS_IF_FAILED {false};

long timezone = 1;
byte daysavetime = 1;

void listDir(fs::FS &fs, const char *dirname, uint8_t levels) {
  Serial.printf("Listing directory: %s\n", dirname);

  File root = fs.open(dirname);
  if (!root) {
    Serial.println("Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      Serial.print("  DIR : ");
      Serial.print(file.name());
      time_t t = file.getLastWrite();
      struct tm *tmstruct = localtime(&t);
      Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
      if (levels) {
        listDir(fs, file.path(), levels - 1);
      }
    } else {
      Serial.print("  FILE: ");
      Serial.print(file.name());
      Serial.print("  SIZE: ");
      Serial.print(file.size());
      time_t t = file.getLastWrite();
      struct tm *tmstruct = localtime(&t);
      Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
    }
    file = root.openNextFile();
  }
}

void createDir(fs::FS &fs, const char *path) {
  Serial.printf("Creating Dir: %s\n", path);
  if (fs.mkdir(path)) {
    Serial.println("Dir created");
  } else {
    Serial.println("mkdir failed");
  }
}

void removeDir(fs::FS &fs, const char *path) {
  Serial.printf("Removing Dir: %s\n", path);
  if (fs.rmdir(path)) {
    Serial.println("Dir removed");
  } else {
    Serial.println("rmdir failed");
  }
}

void readFile(fs::FS &fs, const char *path) {
  Serial.printf("Reading file: %s\n", path);

  File file = fs.open(path);
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while (file.available()) {
    Serial.write(file.read());
  }
  file.close();
}

void writeFile(fs::FS &fs, const char *path, const char *message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if (file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

void appendFile(fs::FS &fs, const char *path, const char *message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if (!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if (file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

void renameFile(fs::FS &fs, const char *path1, const char *path2) {
  Serial.printf("Renaming file %s to %s\n", path1, path2);
  if (fs.rename(path1, path2)) {
    Serial.println("File renamed");
  } else {
    Serial.println("Rename failed");
  }
}

void deleteFile(fs::FS &fs, const char *path) {
  Serial.printf("Deleting file: %s\n", path);
  if (fs.remove(path)) {
    Serial.println("File deleted");
  } else {
    Serial.println("Delete failed");
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);  // OnBoardLed ESP32 Dev Module
  // We start by connecting to a WiFi network
  Serial.println();
  connect();

  Serial.println("Contacting Time Server");
  configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
  struct tm tmstruct;
  delay(2000);
  tmstruct.tm_year = 0;
  getLocalTime(&tmstruct, 5000);
  Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct.tm_year) + 1900, (tmstruct.tm_mon) + 1, tmstruct.tm_mday, tmstruct.tm_hour, tmstruct.tm_min, tmstruct.tm_sec);
  Serial.println("");

  if (!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED)) {
    Serial.println("LittleFS Mount Failed");
    return;
  }
/*
  Serial.println("Formatierung");
  LittleFS.format();

  Serial.println("----list 1----");
  listDir(LittleFS, "/", 1);

  Serial.println("----create a new dir----");
  createDir(LittleFS, "/mydir");
  createDir(LittleFS, "/newOrder");
  createDir(LittleFS, "/newDir");

  Serial.println("----list 2----");
  listDir(LittleFS, "/", 1);
*/
  Serial.println("----create and work with file----");
  writeFile(LittleFS, "/mydir/hello.txt", "Hello ");
  appendFile(LittleFS, "/mydir/hello.txt", "World!\n");

  Serial.println("----list 3----");
  listDir(LittleFS, "/", 1);

  LittleFS.end();
  Serial.println("Test complete");
}

void loop() {
}

Hallo,

jetzt wollte ich meinen Sketch mit paar Zeilen vom ESP8266 Bsp. erweitern. Muss aber feststellen, dass mir paar File Methoden fehlen. Deswegen kompiliert das nicht.
file.getCreationTime();
gibt es bei mir bspw. nicht.

Das mit der Dir-Time scheint ein allgemeines Problem von LittleFS zu sein (bz. so gewollt zu sein), dass es die Timestamps nur an den Files fest macht und die Dirs bei Änderungen nicht mit zieht.
Hier mal eine Diskussion zwar vom ESP8266 aber die zeigt das auf. Die haben auch einen Lösungsansatz dafür drin.

Gruß Tommy

Edit: Die issues auf Github gehen davon aus, dass Du, wenn Du aktuelle Dir-Timestamps brauchst, eine lokale Kopie der Lib und des Kernels modifizieren musst.
D.H es ist so gewollt.

Hallo,

ich guck mir das einmal in Ruhe an. Danke.

Hallo,

also den Versuch kann man mit ruhigem Gewissen lassen. Die LittleFS Lib vom ESP8266 und ESP32 haben absolut nichts miteinander zu tun bzw. keine Gemeinsamkeiten. Das sind komplett unterschiedliche Libs bzw. Ansätze. Letztlich beruht/beginnt die LittleFS mit der FSImpl.h und darin sind nur virtuelle Definitionen enthalten. Die besagten Zeilen aus deinem Link gibt es bei mir nicht.

Den Effekt kenne ich!

Ursache: Zeilenenden.
Am Ende einer gesunden *.h Datei hat sich ein Zeilenende zu befinden.
Fehlt das, hilft eine Leerzeile vor dem nächsten include, define, oder was auch immer.
Meine include Dateien bekommen gerne eine überflüssige Leerzeile am Ende,
Die stört nicht, zeigt aber in der IDE, dass ein Zeilenende existiert

Hallo,

auf den Zusammenhang muss man erstmal kommen. Geändert, kompiliert.
Danke.

Ich traue der Vollkompatibiltät des Arduino Nao ESP32 nicht.
Wieso muss man einerseits

Does it use the official ESP32 core?

Yes, if you are an ESP32 user, simply install the latest version of the Arduino Nano ESP32 core through the board manager in the Arduino IDE.

Das ist für mich ein Widerspruch. Einerseits sagen "official ESP32-core"
und
gleich im nächsten Satz "Arduino Nano ESP32 core

Ja wat denn nu?

Den official ESP32-core
oder
den Nano ESP32-core?

oder

ist das ungenau bezeichnet im Sinne von jederweder Arduino ESP32 benutzt ganz unten drunter den ESPRESSIF-core halt angepasst für Arduino-kompatibilität

Wenn es denn ULTRA-kompatibel sein soll

Will the Nano ESP32 be compatible with sketches from generic ESP32 boards?

The Arduino Nano ESP32 can run code written for other ESP32 devices without any fuss. It's designed to be fully compatible with the ESP32 ecosystem, making it easy to port existing code.

Warum dann
if you are an ESP32 user, simply install the latest version of the Arduino Nano ESP32 core through the board manager in the Arduino IDE.
???

Hallo,

das kann ich nun wiederum beantworten.

Der Text vom letzten Abschnitt in der Antwort.
esp32-hal-uart-c9-warning-return-with-no-value

Kurz gesagt, der Arduino ESP32 Core ist der Espressif Core nur allein mit dem verwendeten ESP32 Controller auf dem Nano. Alle anderen sind rausgeflogen. Man kann auch den Espressif Core verwenden, freut sich über eine möglicherweise höhere Versionsnummer, wählt man hierbei Arduino Nano ESP32 aus, ist es jedoch das Gleiche wie der Arduino ESP32 Core. Die Änderungen in der Espressif Version betrifft dann andere Controller. Wenn Änderungen für den Arduino ESP32 erfolgen weiß ich allerdings nicht in welchen zeitlichen Abstand dessen Übernahme erfolgt. Der hat-uart Fehler ist ja bis heute nicht behoben.
Das alles führt zu dem unglücklichen Zustand das man unterschiedliche Core Versionen zur Verfügung hat. Jedoch sind die Arduino Cores für beide IDEs gleich.

IDE 1.8.19:
Arduino Core 2.0.13
Espressif Core 2.0.15

IDE 2.3.2:
Arduino Core 2.0.13
Espressif Core 2.0.11 (warum hier die Auswahl hinterher hinkt weiß ich nicht)

Ehrlich gesagt macht mich dieses Versionskaos und Abhängigkeiten auch Wahnsinnig. Andererseits ist jedoch klar das alles eine gemeinsame Code Basis hat. Am Ende bleibt festzustellen es liegt am ESP Varianten Wahnsinn. Die ESP Controller Varianten halten sich noch in Grenzen, obwohl auch hier stetig neue auf den Markt kommen.
Nur einmal als Info wer es nicht kennt.
Embedded World #1
Embedded World #2
Embedded World #3
Embedded World #4
Embedded World #5
Shenzhen #6
Aber die unzähligen Boardvarianten machen es nicht einfacher. Wenn man dann mit dem Blick noch ein Schritt zurücktritt, sieht man noch ganze andere Boards auf der Welt die einen interessieren könnten. Die Vielfalt der µC Boards die es mittlerweile gibt erschlägt mich auch. Ein XIAO nRF52840 Sense würde mich bspw. auch ansprechen, wie der Support aussieht weiß ich nicht, wird wohl ein Nischendasein fristen. Da bleibe ich erstmal bei Atmel/Microchip, da kenne ich mich aus und nebenbei fummel ich mit ESP32 rum, der ist gut genug verbreitet, der Core wird weiterentwickelt und man findet immer jemanden den man fragen kann. Ob die Wahl mit einem RP2040 besser gewesen wäre kann nicht sagen.

Ist nun doch mehr Text geworden wie gedacht. :wink:

Hallo,

bin das nochmal komplett neu angegangen. Jetzt funktioniert es wie es soll.
Die #define Krücke habe ich auch entsorgt, man musste nur noch in der Admin.ino paar wenige Stellen von SPIFFS auf LittleFS ändern. Das wars.
Und ich glaube, bin mir sicher, zu wissen was ich letztens falsch gemacht habe. :thinking:
Ich Blödmann habe trotz überall LittleFS Einstellung immer auf der Webseite die spiffs.html hochgeladen statt die fs.html. :face_with_open_eyes_and_hand_over_mouth:

Schön, dass es funktioniert.
Das ist das typische Wald/Bäume Problem. Man wird mit der Zeit betriebsblind für seinen Code und der erste Kollege, der vorbei läuft sagt: Dort hast Du ...
Nur läuft zu Hause keiner vorbei.

Gruß Tommy

Hallo,

bin auch froh darüber das Thema abhaken zu können. Die linke Maustaste hatte sicherlich ihr Eigenleben im blinden Workflow. :joy:

Lange zeit habe den Uploader vom fips genutzt, seit dem es direkten LittleFS Uploader in der IDE gibt, wird es sehr wenig genutzt, man muss nicht extra Zusatz Sketch öffnen um Kleinlichkeit hochladen.
Zu dem kann es drei Formate hochladen LittleFS, SPIFFS, FatFS und kann auch Flasch löschen, wen nötig. Funktioniert mit 1.8.19, ob die neue IDE 2.xx auch wird unterstützt weis nicht.

Der Vorteil des Tools von Fips ist, dass man keine IDE braucht, sondern beliebige Files direkt im Browser hoch laden und löschen kann.
Da bei mir ein ESP immer ein Webinterface hat, ist das kein zusätzlicher Aufwand.
Was willst Du da mit einem Zusatzsketch?

Gruß Tommy

Das war es, was meinem Gehirn entschwunden war. Ich war damals auf andere Sachen wie das Entschlüsseln des Datenstroms des Stromzählers fixiert, da war LittleFS nur ein Nebenthema. Freut mich, daß Du es zum Laufen gebracht hast :slightly_smiling_face: