Beiträge von pimke0815

    Bist du sicher? Ich glaube, dass die Meldung unter 0.14 nur nach x Nachrichten aufgetreten ist und dass es notwendig war, den Shelly neu zu starten, nachdem die Meldung einmal aufgetreten ist. Seit FW 1.0 erscheint dieser Fehler jedoch ohne jeglichen Script MQTT-Puplish, sobald die CPU und/oder der Memory stark ausgelastet ist, kontinuierlich. Dem Shelly sind also schon die eigenen MQTT Status Nachrichten zu viel.

    Da hast du recht. Zu diesem Zeitpunkt habe nicht so genau darauf geachtet.

    So weit ich mich erinnern kann, ist das kein neues Problem. Auch in der 0.14 gab es hier overflows, vor allem dann, wenn viele Nachrichten reingekommen sind. Hab leider schon meine Shellies (sofern möglich) auf die 0.14 gesetzt. Werde aber mal ausprobieren, ob ich die Fehlermeldungen auch in der 1.0.7 sehe.

    Danke für die Info und auch Danke für die Unterstützung bei dem Stack overflow.

    Ich habe am Wochenende meine Skripte so abgeändert, damit sie unter 1.0.7 jetzt laufen (kein Stack overrun) und kann jetzt leider auch bestätigen, das es Schwierigkeiten mit MQTT gibt. Manchmal kein Empfang von MQTT Nachrichten.

    Zudem können die Plus 1PM nicht mehr auf die Version 0.14 gebracht werden. Bei den restlichen Plus2PM, Plus 4PM, Plus Plug S konnte die alte Version wieder eingespielt werden.

    Irgendwie schade.

    Zurück zum Thema: Tatsächlich existiert in der FW 1.0.7 ein synchrones Function-Stack-Limit, das nicht in der API oder im Changelog dokumentiert ist. Es liegt bei etwa 9 Ebenen.

    Hier ist ein Testskript, um das Limit selbst zu bestimmen.

    Ich finde es nur schade, dass aus einem unbegrenzten Stack (0.14), was natürlich auch nicht richtig ist, in der jetzigen Version ein sehr statisches Limit von ca. 9 wurde. Ein Stack ist für mich immer noch etwas dynamisches. Wenige Parameter -> höhere Rekursionstiefe. Dieses statische Limit ist für mich eher ein Hinweis, das hier Probleme mit der Stackimplementierung existieren und sie keine andere Lösung gefunden haben, als es so radikal zu begrenzen.

    Zitat von i_am_konni

    Ich finde es interessant, wie viele Leute "komplexe" Skripte auf den Shellies laufen lassen. Ich benutze dafür Home Assistant.

    Sehr komplex sind meine Skripte eigentlich nicht, aber immer wieder getippten Source Code in Funktionen zu packen, um sich das Leben zu erleichtern, sollte keine Problem sein. Alleine hier ergibt sich ganz leicht eine Stacktiefe von 3-4. Dann bleibt nicht mehr viel für Logik übrig.

    Zudem muss man auch betrachten, aus welchen Grund man sich für Shellies entschieden hat. Bei mir waren es drei. WLAN, "keine Zentrale benötigt" und das alles im Heimnetz läuft (also keine Cloud nötig). Somit ist es logisch, dass die Funktionalität auf den Shellies sein soll und ich alles tue, mir keine zusätzliche Zentrale oder Cloud ans Bein zu binden. Aber das ist eine Entscheidung, die jeder für sich treffen muss.

    Globale Variablen versuche ich ebenfalls nicht zu viele zu haben. Diese Erfahrung habe ich auch schon in der 0.14 gemacht.

    Es geht bei mir nicht um den RAM. In der 0.14 habe ich immer noch ca 90kB frei (je nach Skript).

    In der 1.0.7 kann ich es leider noch nicht messen. In den beta Versionen habe ich meine Skripte so abgespeckt, dass sie gerade liefen und es waren ca 100KB frei. Mit einen einzigen Aufruf mehr gab es dann die Fehlermeldung "out of memory". Somit konnte ich nie den wirklichen freien RAM für das gesamte Skript messen.

    In der 1.0.7 stable ist nun folgender Fehler "Uncaught Error: Too much recursion - the stack is about to overflow". Somit komme ich auf die Stackgröße, bzw die Stackverwaltung. Es können natürlich auch die Object auf dem Stack größer geworden sein, oder die maximale Anzahl der geschachtelten Funktionsaufrufe wurde verkleinert. Einer dieser Parameter, denke ich, hat sich zur 0.14 geändert.

    Das identische Skript läuft ohne Probleme auf 0.14.

    Übrigens lass ich aktuell nur ein Skript pro Shelly laufen. Somit gibt es keine Beeinflussung durch mehrere Skripte.

    An sich würde ich auch gerne diese neuen Funktionen verwenden, da diese manches vereinfachen würden. Ebenfalls finde ich die Skriptverwaltung (Start/Stop/Save + Diagnose) in der 1.0.x ebenfalls besser als in der 0.14, aber leider kann ich noch nicht wegen dieses Fehlers wechseln.

    Ich programmiere immer iterativ und nicht rekursive. In meinen Skripten gibt es viele Funktionen, die sich auch gegenseitig aufrufen können, aber nie eine Rekursion bilden!

    Da ich nun schon einige Version unter 1.0.x getestet habe, muss ich leider sagen, dass meine Skripte, die unter 0.14 ohne Probleme funktionieren, in noch keiner 1.0.x Version gelaufen sind.

    Zuerst war es die Reduktion auf 15KB. Ab 1.0.7 beta X konnten die Skripte wegen "out of memory" nicht gestartet werden.. Nun in der 1.0.7 ist es die Stacksize, die sich zur 0.14 verkleinert hat.

    Auch wenn die Oberfläche sich positive geändert hat, kann ich leider dies nicht für Skripte behaupten. Hier hat sich einiges seit 0.14 verschlechtert. Eigentlich schade, da ich bisher von den Shellies und ihren Möglichkeiten sehr positiv angetan war.

    Hallo,

    Habe einen Plus 2PM auf neue Software (1.0.3) geupdated.

    Lasse folgendes Skript laufen:


    Ergebnis unter 1.0.3:

    Info 1: {"_topic":"Mytopic","_tosend":{"info":"true","time":"12:23"}}

    Info 2: {"infoarray":[{"_topic":"Mytopic","_tosend":{"info": ... ,"time": ... }}]}

    Info 3: {"infoarray":[{"_topic":"Mytopic","_tosend":{"info":"true","time":"12:23"}}]}

    Info 4: object


    Ergebnis unter 0.14.1:

    Info 1: {"_tosend":{"time":"12:23","info":"true"},"_topic":"Mytopic"}

    Info 2: {"infoarray":[{"_tosend":{"time":"12:23","info":"true"},"_topic":"Mytopic"}],"__p":{}}

    Info 3: {"infoarray":[{"_tosend":{"time":"12:23","info":"true"},"_topic":"Mytopic"}],"__p":{}}

    Info 4: array


    Hier sind die Ergebnisse bei "Info 2" (Inhalt von info und time) und "Info4" unterschiedlich. Warum?

    Unter 1.0.3 werden auch bei darauf folgenden Aufrufen mit den Daten bei "Info 2" die falschen Daten verwendet. Ein reales senden über MQTT liefert :{"info": ... ,"time": ... }


    Wird die Zeile

    {{this.Inform(JSON.stringify(status));}} 

    abgeändert auf (eine Klammerebene weg)

    {this.Inform(JSON.stringify(status));}

    Info: Im original Skript ist vor jeder Klammer und vor jedem Funktionsaufruf ein If statement. Das weglassen des "if"s hat aber keinen Einfluß auf das hier dargestellt Verhalten.

    ist das Ergebnis unter 1.0.3:

    Info 1: {"_topic":"Mytopic","_tosend":{"info":"true","time":"12:23"}}

    Info 2: {"infoarray":[{"_topic":"Mytopic","_tosend":{"info":"true","time":"12:23"}}]}

    Info 3: {"infoarray":[{"_topic":"Mytopic","_tosend":{"info":"true","time":"12:23"}}]}

    Info 4: object


    Hier ist die "Info 2" wieder richtig.


    Mach ich hier was falsch, oder liegt es an der neuen Firmware?

    Ich verwende seit ein paar Monaten einige "Shelly Plus 2 PM" und "Shelly Door Window 2".

    Firmware "Plus 2 PM": 20221206-141957/0.12.0-gafc2404

    Sobald ich den Befehl Script.Eval (unter I/O Actions der DW2) ausführe, wird der freie verfügbare Speicher im "Plus 2 PM" kleiner.

    Als Beispiel kann man den folgenden Befehl ca. 300 mal ausführen und der Shelly verliert ca. 40KB.

    shelly_ip_addressPLUS2PM/rpc/Script.Eval?id=1&code="let sysstatus = Shelly.getComponentStatus('sys');print(sysstatus['ram_free']);"

    Erreicht der Shelly dann die Grenze von ca 30KB freiem Speicher, führt er einen Reset durch.

    Erst nach stoppen und wieder starten des Skriptes ist der Speicher wieder verfügbar.

    Kann es sein das hier ein Memory Leak existiert, oder verwende ich den Befehl falsch?

    Ich verwende diesen Script.Eval Befehl, um Aktionen (Auslöser DW2) in den Skripten auf dem Plus 2PM zu starten.

    Ich verwende ebenfalls MQTT. Der Broker verlangt einen SSL Verbindung, wodurch eine direkte Verknüpfung der DW2's und den Plus 2PM's mit MQTT nicht möglich ist, da der DW2 keine SSL Verbindung unterstützt..

    Gibt es evtl. eine andere Lösung, Aktionen auf Plus 2PM durch DW 2 auszulösen?