tobiasfaust / SolaxModbusGateway

Modbus RTU to MQTT Gateway
GNU General Public License v3.0
66 stars 19 forks source link

Store Item Config not working, saved file corrupt #57

Closed TigerGrey closed 5 months ago

TigerGrey commented 6 months ago

https://github.com/tobiasfaust/SolaxModbusGateway/blob/62295ce90161e3a9f468a4239de0e31e34bdb775/src/modbus.cpp#L1075-L1093

Hallo Tobias, ich hatte das Problem dass die active Items nach einem Neustart weg waren. Ebenso konnte ich die Datei /ModbusItemConfig.json nicht aus einem Filesystem-Download extrahieren, evtl. war die Datei korrupt, sah auch am Ende etwas seltsam aus. Mir ist aufgefallen dass Deine Routine modbus::StoreJsonItemConfig anders aussieht als Deine modbus::StoreJsonConfig, obwohl die ganz was ähnliches machen. Jetzt habe ich die Routine nach diesem Muster umgeschrieben, jetzt geht alles. Aktivstatus wird dauerhaft gespeichert, und ich kann die Datei downloaden und wieder beim Hochladen benutzen (upload filesystem). Hier die angepasste Routine:

void modbus::StoreJsonItemConfig(String* json) {
  JsonDocument doc;
  DeserializationError error = deserializeJson(doc, *json);

  if (error) { 
    if (Config->GetDebugLevel() >=1) {
      Serial.printf("Could not store JsonItemConfig completely -> %s", error.c_str());
    } 
  } else {

    File configFile = LittleFS.open("/ModbusItemConfig.json", "w");
    if (!configFile) {
      if (Config->GetDebugLevel() >=0) {Serial.println("failed to open ModbusItemConfig.json file for writing");}
    } else {  

      serializeJsonPretty(doc["data"], Serial);
      if (serializeJson(doc["data"], configFile) == 0) {
        if (Config->GetDebugLevel() >=0) {Serial.println(F("Failed to write to file"));}
      }
      configFile.close();

      LoadJsonConfig(false);
    }
  }
}
tobiasfaust commented 6 months ago

Hi, vielen dank für deine Arbeit. Ich habe schon meine Kommentare im PR eingetragen, hier aber für dieses Thema nochmal:

Die Speicherroutine "StoreJsonItemConfig" war extra abweichend zur "StoreJsonConfig" da der json string sehr gross ist und deshalb explizit nicht über arduinojson geparsed, und damit in den Speicher geladen werden sollte. Bei grossen json´s steigt der ESP sonst aus. Deshalb würde ich diese gerne so belassen. Wenn es hier aber Speicherfehler gibt muss ich mir das nochmal ansehen. Bei meinen Tests ist mir erstmal nichts aufgefallen.

Was meinst du eigentlich mit:

Gleiches Problem wie bei Deye Invertern Läuft übrigens auch bei mir nicht stabil, nach einigen Stunden steigt der ESP32 aus.

Ich vermute hier ein MemoryLeak. Stell mal auf LogLevel5. Dann wird per MQTT auch FreeHeapMemory übertragen. Schau mal ob es kontinuierlich abnimmt.

Ich bin am letzten WE auch an einem MemoryLeak verzweifelt, deshalb kam der Directory-FileUpload auf der Update-Seite auch später