Script MQTT-Fehlertolleranz

  • Ich habe auf einem i4 ein Script laufen das im Normalfall auch immer funktioniert.

    Ab und an steht das Script auf Stop und nach einem erneuten Start per Weboberfläche läuft es wieder.

    Das Script steht auch auf Autostart und sollte bei Spannungsausfall eigentlich auch sofort wieder laufen (nach Test macht es das auch).

    Ich vermute das der MQTT-Server ab und an nicht erreichbar ist (Warum auch immer er ist Intern im ioBroker).

    Das sind aber nur Vermutungen und ich finde den Fehler nicht.

    Hier das Script das Tastendrücke auf den Eingängen Zählt, diese an den MQTT weiter gibt und der Zähler kann vom MQTT beeinflusst werden.

    Könnt Ihr Euch das bitte mal ansehen und Möglicherweise findet Ihr da Verbesserungen so das das Script nicht auf Stop geht.

    Sonst kontrolliere ich das per Blockly ob es läuft und starte es auf dem Wege wieder Neu.

    Das ist aber eigentlich nur eine Übergangslösung und keine Problemlösung.

    mfg

    f.b.

    VG Frank


    System i7-4650U CPU, RAM-8GB,SSD-240GB, ioBroker

    mit :

    150 x z-wave, 28 x Shelly, 10 x ESP32 (Eigenendwicklung), Netatmo Wetterstation,

    8 x Alexa, Fritzbox, LG ESS10

  • Hallo Frank,

    Ich hab dein Skript mal grob überflogen, sieht eigentlich ganz gut aus (bis auf den fehlenden Error Handling Part), vielleicht handelt es sich um nen abgefragten null Wert.

    Man muss immer davon ausgehen, dass jeder Shelly Wert den man abfragt auch null sein kann, das ist bei manchen Werten von den Entwicklern so gewollt, dieser "null" Zustand kann von deiner Logik nicht weiter verarbeitet werden und löst dann einen Fehler aus, der zu einem Stop führt. Sowas passiert meistens nur beim Start, wenn der Shelly weder Zeit noch IP kennt, aber trotzdem versucht dein Skript auszuführen.

    Vielleicht hilft es deinen Config Check etwas anzupassen:

    Code
    function isConfigReady() {
      for (let key in CONFIG) {
        if (CONFIG[key] === "" || typeof CONFIG[key] === 'null') return false; //Auch auf null prüfen.
      }
      return true;
    }

    Wenn das net reicht, kann man immer noch einen Error Handler in jeden Shelly Call einbauen und versuchen den Fehler abzufangen, über das MQTT Debug Log kann man sich dann den abgefangenen Fehler genau ansehen.

    Hier ein Beispiel für nen Call Error Handler:

    Außerdem bedenke das du maximal 10 MQTT topic subscriptions sowie 5 Timer, in einem Skript haben kannst!


    In diesem Sinne sind hier noch weitere Verbesserungsvorschläge von mir:

    18 Mal editiert, zuletzt von _[Deleted]_ (2. Juni 2023 um 19:06)

  • Vielleicht hilft es deinen Config Check etwas anzupassen:

    Ja das mit dem Config hatte ich auch als Fehlerquelle angesehen und habe darum eine Verzögerung eingebaut :

    Das führt dazu das eine weitere Bearbeitung erst nach 3000ms weitergefügrt wird.

    Ohne das läuft das Script fast nicht an.

    VG Frank


    System i7-4650U CPU, RAM-8GB,SSD-240GB, ioBroker

    mit :

    150 x z-wave, 28 x Shelly, 10 x ESP32 (Eigenendwicklung), Netatmo Wetterstation,

    8 x Alexa, Fritzbox, LG ESS10

  • ... dein Satz über deinem Code Ausschnitt war verdeckt,

    Ok, ja du hast recht, aber du prüfst nicht direkt auf Nullwerte, sondern nur auf leere Strings, deswegen solltest du auch zusätzlich auf Nullwerte prüfen und solange deine Timer Schleifen wiederholen bis es funktioniert, deine Timer Schleife solltest du übrigens auch anpassen, da man deinen Timer gerade über 5 mal gleichzeigt aufrufen kann.

    Schau dir bitte die von mir überarbeiten Code Stellen nochmal genau an.

    Meine Verbesserungsvorschläge:

    1. Filtern auf null Werte,

    2. Clear Timer vor dem Timer Call

    3. unsubscribe() topics vor nem neuen subscribe()

    5 Mal editiert, zuletzt von _[Deleted]_ (2. Juni 2023 um 20:02)

  • Ok, ja du hast recht, aber du prüfst nicht direkt auf Nullwerte, sondern nur auf leere Strings, deswegen solltest du auch zusätzlich auf Nullwerte prüfen und solange deine Timer Schleifen wiederholen bis es funktioniert, deine Timer Schleife solltest du übrigens auch anpassen, da man deinen Timer gerade über 5 mal gleichzeigt aufrufen kann.

    Das mit dem Timer ist nicht auf meinem Mist gewachsen, das ist eine Vorlage schau hier :

    shelly-script-examples/mqtt-announce-control.js at main · ALLTERCO/shelly-script-examples · GitHub

    Da ich Probleme mit dem Script abbruch beim Starten hatte, habe ich nach Lösungen gesucht und nachgesehen was ALLTERCO da so bastelt und bin genau darauf gestoßen.

    Ich habe es mal eingebaut wie du geschrieben hast.

    Das klingt logisch, wenn das mehrfach hintereinander aufgerufen wird läuft irgendwann der Stack voll.

    Nur sollte ALLTERCO das in seinen Beispielen dann auch so machen damit nicht Andere das genau so falsch machen.

    VG Frank


    System i7-4650U CPU, RAM-8GB,SSD-240GB, ioBroker

    mit :

    150 x z-wave, 28 x Shelly, 10 x ESP32 (Eigenendwicklung), Netatmo Wetterstation,

    8 x Alexa, Fritzbox, LG ESS10

  • Dieses Thema enthält 5 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind.