Beiträge von Ich@Home

    Nach dem Update kann auf einem Shelly Plus 1 bei mir nur noch ein Script ausgeführt werden. Versuche ich das 2. Script über die neue App zu starten, gibt es die Fehlermeldung "Skriptfehler: out_of_memory!". Das ist sehr ärgerlich und ein deutlicher Rückschritt! Hätte gerne die alte Firmware zurück! Vermutlich hängt das mit der neu eingeführten 15kb Grenze zusammen, die den Shelly für mich unbrauchbar macht.

    Gruß Martin

    Die zweite Zeile scheint mir eine Fehlermeldung mit Fehlernummer zu sein: "1676459656 - L-1: E:M 19339". Der Rest gibt Auskunft über die aktuelle Speicherbelegung, was aber ohne Systemwissen unbrauchbar ist. Für mich sieht es so aus, als ob der Editor einen Speicherfehler verursacht. Derartige Blöcke finden sich mehrfach im Log und lassen sich zeitlich dem Aufruf des Editors zuordnen. Seitdem ich den Editor nicht mehr verwende und stattdessen die Scripte per ShellyScanner hochlade, starte und stoppe, gibt es bisher keine Probleme mehr.

    Gruß Martin

    Hallo Zusammen,

    das Debugging ist (noch?) etwas mühsam. Aktuell verwende ich diverse "prints" im Script und kontrolliere die Ausgabe im Web GUI des Shellys. Leider läuft mein Script stundenlang völlig unauffällig und korrekt, um dann den Shelly scheinbar zum Absturz zu bringen.

    Tritt der Fall ein, wird das Script in der Übersicht als "Running" geführt, aber klickt man auf das Script, ist der Editor leer und auch der Scriptname wird nicht angezeigt. Es ist so, als gäbe es das Script nicht. Lediglich das "Stop" deutet darauf hin, dass das Script noch zu laufen scheint. Klickt man wieder auf die Scriptübersicht, taucht das Script wieder in der Übersicht als "Running" auf. Auffällig ist auch, dass in dieser Situation die Verbindung zum Shelly ständig neu aufgebaut werden muss. Das Problem lässt sich dann nur durch einen Reboot beheben.

    Nachdem ich mein Script xmal kontrolliert habe, keinen Fehler finden konnte, bin ich der Sache mit dem ShellyScanner (sehr nützliches Tool!) nachgegangen und habe folgenden Hinweis im Log gefunden:

    1676459656 - L2: shelly_scripts_rpc.:332 Sending "script_2.js"

    1676459656 - L-1: E:M 19339

    1676459656 - L-1: Heap summary for capabilities 0x00001800:

    1676459656 - L-1: At 0x3ffb6388 len 7288 free 4 allocated 6048 min_free 4

    1676459656 - L-1: largest_free_block 0 alloc_blocks 78 free_blocks 0 total_blocks 78

    1676459656 - L-1: At 0x3ffb9a20 len 16648 free 4 allocated 15436 min_free 4

    1676459656 - L-1: largest_free_block 0 alloc_blocks 71 free_blocks 0 total_blocks 71

    1676459656 - L-1: At 0x3ffcc678 len 80264 free 396 allocated 75764 min_free 4

    1676459656 - L-1: largest_free_block 112 alloc_blocks 795 free_blocks 6 total_blocks 801

    1676459656 - L-1: At 0x3ffe0440 len 129984 free 42616 allocated 86340 min_free 26120

    1676459656 - L-1: largest_free_block 17408 alloc_blocks 26 free_blocks 9 total_blocks 35

    1676459656 - L-1: At 0x3ff80000 len 8192 free 7268 allocated 0 min_free 7268

    1676459656 - L-1: largest_free_block 7168 alloc_blocks 0 free_blocks 1 total_blocks 1

    1676459656 - L-1: Totals:

    1676459656 - L-1: free 49644 allocated 184232 min_free 33400 largest_free_block 17408

    Für mich sieht es so aus, dass nicht mein Script, sondern das Web GUI die Ursache für das merkwürdige Verhalten ist. Scheinbar verursacht der Aufruf des Editors das Problem? Ein Temperaturproblem ist es nicht, weil die Shelly Temperatur laut ShellyScanner unter 45 Grad bleibt. Kann man den Fehlercode (Firmware 0.13.0, Shelly Plus1) irgendwo nachlesen?

    Gruß Martin

    Update!


    1. Danke für den Hinweis und die unbenannte Funktion im Callback habe ich entfernt. Hatte zwar nur Level1 Aufrufe, aber man weiß ja nie.
    2. Die Anzahl gleichzeitiger Callbacks kann nun eingestellt werden (default bei mir 2), damit der Shelly nicht überfordert wird.
    3. Der Callback Stack wird nun kontrolliert und falls es ein Problem mit hängenden Callbacks gibt, wird eine Warnung ausgegeben.


    Damit lassen sich nun eine ganze Reihe von Shellys zentral von einem Shelly (quasi 1W Homeserver) steuern, ohne den Shelly selbst zu überfordern. Das Kernstück ist damit soweit ok und ich kann mit dem eigentlichen Projekt beginnen …

    Update! Nun kann man nicht nur ein Überschreiten des RPC Limits von derzeit 5 vermeiden, sondern zusätzlich ein wait(seconds) zwischen den Shelly.calls vorgeben. In dem Beispiel wird ein Plug s nach definierten Zeiten ein- und ausgeschaltet. Für einen Test bitte nicht die eigene IP in shellyConfig vergessen. Viel Spaß damit!

    Gruß Martin

    Hallo Zusammen,

    mit folgendem beispielhaften Code kann man das RPC Limit umgehen. Die RPCs werden in eine Warteschlange eingereiht und über einen Timer nacheinander abgearbeitet. Eventuell kann es jemand auf seine Bedürfnisse anpassen.

    Gruß Martin

    Auch eine for Schleife läuft nicht durch, wenn die Anzahl der Zyklen groß ist (Siehe Code). Scheint ein grundsätzliches Problem zu sein.

    Also a for loop will crash if the number of cycles is large (see code). Seems to be a fundamental problem.

    [script][/script]

    [script]let n = 0; [/script]

    [script]for (let i=0; i < 500000; i++) { [/script]

    [script]n = n + 1; [/script]

    [script]} [/script]

    [script]print("End");[/script]

    [script][/script]

    Syntax und Semantik einer while Schleife sind dem Interpreter bekannt. Reduziert man die Schleifendurchläufe, läuft es auch durch. Das Problem scheint woanders zu liegen.

    [script][/script]

    [script]let n = 0; [/script]

    [script]while (n < 5000) { [/script]

    [script]n = n + 1; [/script]

    [script]} [/script]

    [script]print("End");[/script]

    [script][/script]

    Hallo Zusammen,

    in einem größeren Projekt benötige ich eine wait bzw. sleep Funktion, damit ich nicht die maximale Anzahl gleichzeitiger RPC's überschreite. Leider funktioniert mein Ansatz (hier reduziert auf das eigentliche Problem) nicht, weil der Code ohne Rückmeldung auf einem Shelly Plus1 (aktuelle Firmware 0.12.0) abstürzt. Wäre toll, wenn jemand eine Erklärung dafür hätte.

    Gruß Martin

    [script][/script]

    [script]let Shellyunixtime = 0; [/script]

    [script]let updateShellytimeInterval = 5 * 1000; [/script]

    [script]
    [/script]

    [script]function getShellyTime(){ [/script]

    [script]Shelly.call("Shelly.GetStatus", {}, [/script]

    [script]function (res, error_code, error_msg, ud ) { [/script]

    [script]Shellyunixtime = res.sys.unixtime; [/script]

    [script]print("Shellyunixtime:",Shellyunixtime); [/script]

    [script]}, [/script]

    [script]null); [/script]

    [script]} [/script]

    [script]
    [/script]

    [script]function wait(seconds) { [/script]

    [script]let start = Shellyunixtime; [/script]

    [script]let now = start; [/script]

    [script]while (now <= (start + seconds)) { [/script]

    [script]now = Shellyunixtime; [/script]

    [script]} [/script]

    [script]} [/script]

    [script]
    [/script]

    [script]function testwait() { [/script]

    [script]print("Start wait"); [/script]

    [script]wait(10); [/script]

    [script]print("End wait"); [/script]

    [script]} [/script]

    [script]
    [/script]

    [script]// Keep ShellyTime up to date [/script]

    [script]Timer.set(updateShellytimeInterval, true, function () { [/script]

    [script]getShellyTime(); [/script]

    [script]}); [/script]

    [script]
    [/script]

    [script]// Test wait [/script]

    [script]Timer.set(updateShellytimeInterval*2, true, function () { [/script]

    [script]testwait(); [/script]

    [script]});[/script]

    [script][/script]