tasmota script - Array Grundlagenfragen

  • Tasmota Script - Arrays

    Hallo zusammen,

    ich bin geübter Anfänger mit Vorerfahrungen in VBA und google scirpt/sheets. bin aber kein Entwickler.

    Ich habe mir nun Tasmota für das Auslesen eines Stromzählers mittels IR-Schnittstelle auf einen ESP 32 (unterstützt damit HTTPS) installiert.

    Ich baue mir aktuell per Script die Webseite zusammen.

    Mit Rückschlägen ("unerklärliches" Verhalten, fehlendes Basiswissen und noch nicht gefundenes Debugging) geht es aber an sich gut voran.

    Die Basis habe ich fertig und die Zählerdaten sende ich mir per webquery zu google sheets. Ich möchte aber die tolle Funktion der eigenen Tasmota Visualisierung nutzen und für mich weiter umsetzen.

    Zu Arrays habe ich folgende Fragen (Die Hilfeseite kenne ich).

    1) Die Zahl hinter dem D heisst genau bzw bedeutet in der Praxis? Ich will in einem Array Feld 88,888,123 als Format abspeichern.

    3) Aktuell kann ich nur 5 Arrays anlegen, dies soll man in den Voreinstellungen ändern können. Ich habe das noch nicht verstanden und auch nicht, wie ich genau den Speicherbedarf nachsehen kann.

    3) Kann ich auch Arrays mit zwei Dimensionen anlegen? Also pro Zeiteinheit (z.B. Tag/Stunden = 12 jeweils dadrunter 5 Zähler)?

    4) Kann ich als Workaround auch ein Riesen-Array anlegen und da die Werte "hintereinander" ablegen? Ist zwar nicht schön, aber wenn es läuft.... 0-560? Oder sprenge ich damit den Speicherbedarf?

    Danke für Eure Hilfe!

    Ede

  • Ja, das habe ich umgesetzt bzw als Einstieg benutzt.

    Läuft auch, da ich aber mehr auswerten/visualisieren will, komme ich damit an die Grenzen.

    So hat er z.B nur eindimensionale Arrays verwendet und sich auch an die 5 gehalten.

  • Es gibt nur eindimensionale Arrays.

    Die Anzahl der möglichen Arrays ist vordefiniert mit 5 und kann vergrößert werden vor dem Kompilieren

    wundere dich nicht über die Bezeichnung, Arrays können auch Filter sein

    #define MAXFILT 5

    eine Array kann so groß sein wie du Speicher hast. Beim ESP32 mit PSRAM auch sehr gross.

    checke die verblieben RAM Größe (heap). es sollten beim ESP8266 mindestens so 12k übrig bleiben und beim ESP32 20k


    Hinter >D kann man die Default string Größe (20) erhöhen bis auf die vordefinierte Maximalgröße ist default 48

    #define SCRIPT_MAXSSIZE 48

  • ok, da ich eine fertige Datei als Grundlage genutzt habe (siehe link oben) und mit der recht gut klarkomme, möchte ich auf das eigene kompilieren verzichten.

    Ich werde wohl ein Array mit 0-600 anlegen und in diesem Bereich Zähler und Verbrauch jeweils hintereinander packen. Das ist das beim Erstellen lästig, aber nacher sieht es keiner. Man muss sich halt eine Übersetzung machen.

    Bei mir steht >D 40

    Wenn ich nun nur Zahlen (größe) 88.888,888 nutzen möchte, kann ich a) die Zahl auf 10 reduzieren und b) würde er damit den Speicherbedarf reduzieren?

    Aktuell sieht es bei mir so aus


  • Welche Funktionen/Features fehlen dir, die dazu hinzufügen möchtest?

    An sich klapt schon alles bzw über kleine Umwege.

    Verständlicher wären für mich a) mehrdimensionale Arrays und b) mehr als 5 Arrays (geht wenn man es wohl vorher definiert).

    Damit ich z.B. pro Zeiteinheit alle Zähler ablegen kann:

    24 (Stunden) Fächer für einen Tag

    - dadrunter 5 Fächer für

    - Strombezug

    - Einspeisung (PV)

    - Gas

    - Temperaturen

    - dadrunter jeweils Zählerstand und Veränderung (sofern man unter W nicht subtrahieren kann.

    Aber wie gesagt, ich werde es nun alle untereinander in einem Array packen und gucken, ob der Speicher reicht (hierfür habe ich noch kein Gefühl).

    Wenn der Speicher reicht, würde ich noch mehr Spielereien in den Zeiteinheiten aufnehmen (max./min-Wert in dem Fach.

    Mir ist bewusst, dass ich das alles mit Folgesysteme machen kann, für mich ist aber auch der Weg das Ziel.

    Und wenn der ESP es kann. Bin aktuell schon mit den "Prototypen" als Anfänger zufrieden.

    Zum Thema Array ist bei mir aktuell folgendes offen:
    Bei mir steht >D 40

    Wenn ich nun nur Zahlen (größe) 88.888,888 nutzen möchte, kann ich a) die Zahl auf 10 reduzieren und b) würde er damit den Speicherbedarf reduzieren?

  • erst mal was du da definiert hast geht nicht. der permanente Speicher hat nur 1532 Bytes.

    ein numerischer Wert verbraucht 4 Bytes, also kannst du nur ca 380 Bytes permanent in einem Array speichern.

    Wenn du größere Arrays speichern willst musst du das mit dem Dateisystem machen (fwa(), fra())

    ein Array vorbelegen geht mit array = {1 2 3 4} etc was aber nur bei kleinen Arrays Sinn macht.

    in Zukunft wird es dafür einen Befehl geben, momentan musst du das in einer Schleife machen.

  • Hi gemu2015 ,

    von dem script, von dem ich lerne und wohl viele einsetzen, hat auch sehr große Arrays
    (https://ottelo.jimdofree.com/stromz%C3%A4hler-auslesen-tasmota/):

    ; -- ARRAYS --
    ; 24h power chart
    M:p:sday=0 288
    ; daily energy from grid table day 1-31
    M:p:dcon=0 31
    ; daily energy to grid table day 1-31
    M:p:dprod=0 31
    ; monthly energy table
    ; from grid 1-12
    ; to grid 13-24
    M:p:mcon=0 24
    ; 4h power chart, value every 30s
    M:s4h=0 480

    Wobei auch bei ihm nach Scriptänderung erstmal die Werte erstmal wieder schief sind und sich rauswaschen müssen mit der Zeit.
    Bis auf das Speichern geht es eigentlich ganz gut.

    Was mich noch stört, ist dass er eine Spalte immer beim Speichern des Scripts mit Mondwerten füllt. Habe noch nicht erkannt, warum er das bei der Spalte macht (die daneben sind m.E. gleich definiert und versorgt.)

    Dies bastel ich mir selber. Auch wenn es noch nicht so aussieht, klappt das schon ganz gut


    Einmal editiert, zuletzt von 2000ede (30. Dezember 2023 um 08:48) aus folgendem Grund: link hinzugefügt

  • ok, danke. ich werde meins entsprechend auch aufteilen.
    Werde aber noch mit einigen Fragen um die Ecke kommen zu dem Thema

    edit: durch deinen Hinweis und das aufteilen sind auch endlich die langen Phantasiewerte weg! Es geht voran :)

    Einmal editiert, zuletzt von 2000ede (30. Dezember 2023 um 10:44)