Persistente Variablen werden nach Reset nicht korrekt wiederhergestellt

  • Hallo zusammen,

    ich bin ganz neu mit Tasmota in Berührung gekommen, da ich einen Weg gesucht habe meinen digitalen Stromzähler auslesen zu können und die Daten zu protokollieren.

    Das ganze klappt auch soweit ganz super und es ist echt spitze, was da mit Tasmota und den ganzen Erweiterungen auf die Beine gestellt wurde.

    Vielen Dank an die von den Entwicklern geleisteten Stunden!

    So nun zu meinem konkreten Problem bzw. der Auffälligkeit.

    Ich nutze einen Wemos D1 mini R2 (von Azdelivery) welcher 4MB Flash speicher besitzt.

    Diesen Flashspeicher wollte ich nutzen, also habe ich die Konfiguration entsprechend angepasst und das ganze mit Visual Studio Code kompiliert,

    Ich werde im Anhang noch aufführen, welche Schalter ich konkret gesetzt habe.

    Nun habe ich zuerst das Tasmota.bin File mit Tasmotizer geflashed, was auch augenscheinlich funktioniert hat, allerdings lies sich nachher nichts über die WebUI abspeichern.

    Im genaueren, es war z.B. nicht möglich die Geräte Konfiguration auf "Generic 18" zu ändern. Sobald der Restart nach dem Speichern durch war, stand die Einstellung wieder auf "Sonos Basic".

    Also versucht das Tasmota.bin file über die WebUI nochmals zu flashen, dies ging nicht und wurde mit einem Fehler (File Größe fehlerhaft oder so ähnlich verweigert).

    Also den Flash mittels Tasmotizer noch mal erased und dann Plattform IO so eingestellt, dass ich direkt von dort den Upload machen konnte.

    Das ganze hat dann auch funktioniert und es Liesen sich nun alle Einstellungen abspeichern! Auch das flashen über die WebUI geht nun einwandfrei.

    Also schon gefreut dass nun alles geht und mich daran gemacht das Skript zu Entwickeln um meinen Stromzähler per SML auslesen zu können.

    Auch dass ging soweit problemlos und funktioniert auch super.

    Dann erstmal die letzten 3 Tage keine Zeit mehr gehabt zu basteln und Tasmota auf dem WemosD1 lief problemlos vor sich hin und gelegentliches nachschauen zeigte auch, dass alles super funktioniert und stabil läuft.

    Dann habe ich noch eine Kleinigkeit am Script angepasst und mal einen Neustart über die Konsole ausgelöst.

    Aber nach dem Neustart dann leider feststellen müssen, dass die persistenten Variablen nicht mehr die korrekten Werte enthielten.

    Ok, dachte ich, nicht so schlimm hast sicher im Skript "svars" vergessen, konnte da aber keinen Fehler finden und habe mir dann die Werte der Variablen nach dem Neustart nochmal genau angeschaut und festgestellt, dass es so aussieht, als ob da ein Offset zwischen Variablennamen und Wert besteht.

    Ich meine damit, dass von meinen insgesamt 6 persistenten Variablen die ersten 2 im Skipt total irrsinnige Werte anzeigen, die nächsten zwei, aber die Werte der ersten 2 und die letzten 2 die der vorhergehenden.

    Ich denke, dass die Funktionsweise der persistenten Variablen ja so ist, dass zur Laufzeit auf variablen gearbeitet wird, welche im RAM des µC liegen und immer wenn "svars" zum Einsatz kommt das ganze dann im Flash oder EEPROM abgelegt wird.

    Wenn dem so ist, ist es dann denkbar, dass die Init Routine, welche dann die EEPROM Daten beim "Neustart" wieder auf die RAM größen schreibt sich hier verhaut?

    Habe auch schon im Skript selbst in der >S Sektion die persistenten Variablen initialisiert und direkt svars drunter geschrieben und das ganze nur kurz laufen lassen um das Flash/EEPROM nicht totzuschreiben, dass bringt aber auch nichts für den Neustart, lediglich arbeitet das Skript nun auch nach dem Auskommentieren des beschreibens so lange mit den richtigen Werten bis erneut ein Restart erfolgt.

    Das ganze verhält sich mit Tasmota 8.4.0 und auch Tasmota 8.5.0 das ich heute kurz getestet habe so.

    So jetzt viel geschrieben, wollte aber möglichst genau beschreiben was ich getrieben habe.

    Ich hoffe jemand von den Experten, der sich tiefer mit Tasmota auskennt hat eine Idee was ich falsch konfiguriert habe oder findet vielleicht auch einen Bug in der SW selbst.

    Ich kann bei bedarf auch das Map- und BinFile oder auch die kompletten sourcen bereitstellen. Ich befürchte nämlich, dass die Ursache nicht so einfach zu finden ist.


    Nun die Auflistung der Toolversionen: (Wenn noch was fehlt zur Analyse dann werde ich das versuchen nachzuliefern)

    1. Visual Studio Code
      Version: 1.48.2 (user setup)
      Commit: a0479759d6e9ea56afa657e454193f72aef85bd0
      Date: 2020-08-25T10:13:11.295Z
      Electron: 7.3.2
      Chrome: 78.0.3904.130
      Node.js: 12.8.1
      V8: 7.8.279.23-electron.0
      OS: Windows_NT x64 10.0.19041
    2. Plattform IO
      Core 5.0.0 Home 3.3.0

    Nun die Anpassungen an TASMOTA für die Kompilierung:

    1. platformio_override.ini angelegt mit den folgenden aktiven Schaltern
      default_envs = tasmota
      board_build.ldscript = eagle.flash.4m2m.ld
      upload_port = COM6
    2. user_config_override.h angelegt mit den folgenden defines
      #define USE_SCRIPT 
      #define USE_SCRIPT_FATFS -1
      #define FAT_SCRIPT_SIZE 4096
      #define USE_SCRIPT_FATFS_EXT
      #define SDCARD_DIR
      #define USE_SML_M
      #define SML_MAX_VARS 20
      #define USE_SCRIPT_WEB_DISPLAY
      #define FRIENDLY_NAME "EVU_Zaehler"
      #define MY_LANGUAGE de_DE
      #define APP_TIMEZONE 99
      #define LATITUDE       48.95923
      #define LONGITUDE      9.24857
  • Moin userTK

    Hab dein script geprüft.

    Der Fehler passiert beim Neustart wenn die Uhr noch nicht gestellt ist.

    Der chg[] ist bei Neustart immer einmal wahr und der Monatstag (day) steht auf 1

    dadurch werden deine ersten beiden p Variablen überschrieben.

    du kannst z.B. das Jahr mit dazu nehmen. wenn das >0 ist ist die Uhr gestellt und dein Vergleich funktioniert wie erwartet

    man testet solche Probleme am besten in dem man die fraglichen Variablen mit print ausdruckt

    und auch die Stellen wo sie modifiziert werden mit einem debug print versieht.