RPC cb error: type error

  • Hallo, ich bin leider nicht so fit in javascript, vlt. kann mir wer helfen.

    Script Beschreibung:

    Shelly I4, input 1 triggert auf button down die Abfrage von 4 shelly Plus1

    wenn alle 4 shelly's aus sind schaltet er shelly 1 ein.

    wenn einer oder mehrere shelly's an sind schaltet er alle aus.

    Sozusagen ein alles aus und wenn alles aus ist schalte nur definierte Shelly's ein.

    Mein script läuft, es ist gruselig aber es läuft.

    Zu meinem Problem:

    Wenn einer der shelly's nicht erreichbar ist oder z.B. weil die Authentication an ist oder der response nicht ankommt wegen Timeout etc. dann bleibt das script stehen.

    Da ich es gerne ein wenig stabiler bekommen würde sollte das Script weiterlaufen.

    Folgende Fehlermeldung bekomme ich in der Debug Console:


    shelly_http.cpp:99 0x3ffe16a0 HTTP Request timeout

    at script_6.js:80

    at api_rpc.js:8

    RPC cb error: type error

    shelly_notification:161 Status change of script:6: {"id":6,"errors":["type_error"],"running":false}

    idealerweise sollte er einen nicht erreichbaren shelly als "false" sprich aus annehmen, irgendwie ist mir nicht ganz klar welche Parameter da die funktion in script_6.js:80 erwartet.

    Das Script sollte hald einfach bei einem Fehler weiterlaufen, irgendwann kommt der shelly wieder.


    Hier als Beispiel das Script:

    ich weis console.log und print kommen auf das gleiche raus.

    Vielen Dank für eure Kommentare.

    Einmal editiert, zuletzt von perlscrip (23. Februar 2023 um 00:15)

  • puh, das ist verdammt schwierig zu lesen.. das Problem wird sein, dass der Timeout dafür sorgt, dass die _cb: function (result..) im weiteren zwingend ein result voraussetzt was aber im Fehlerfall nicht vorhanden ist..

    was helfen könnte: die folgeverarbeitung nur dann vorzunehmen, wenn der error_code entsprechend 0 ist.

    Code
    if (error_code === 0) {
     // hier den Code
    
    }


    wenn du so Sachen wie console.log("rpcresult" rpcResult); dann sollten Strings und Variablen durch ein + Zeichen verbunden werden. ich würde es der Lesbarkeit halber wie folgt formatieren console.log("rpcresult: " + rpcResult);

    Ohne das + geht es zwar aktuell noch, aber das wird sich demnächst irgendwann ändern weil es nicht Javascript-Konform ist.

    >100 Shellies, darunter so gut wie alles was der Hersteller produziert hat. ;)
    :!: ich beantworte grundsätzlich keine Fragen per persönlicher Nachricht:!:

  • Vielleicht hilft es auch, ein Timeout für http-Anfragen hinzuzufügen.

    Also:

    Code
        call: function (rpc, data, callback) {
          let postData = {
            url: this.composeEndpoint(rpc),
            body: data,
            timeout: 15
          };


    Statt:

    Code
        call: function (rpc, data, callback) {
          let postData = {
            url: this.composeEndpoint(rpc),
            body: data
          };

    Außerdem solltest du dir das hier mal anschauen, die Probleme dort ähneln deinen, nur bei dir ist nicht das Internet ausgefallen sondern ein Shelly, was dann zum Abbruch fuhren kann da die folgende Logik andere Werte erwartet/benötigt.

    viliv
    2. März 2023 um 07:27


    Eine kurze Frage aus reiner neugier, warum willst du einen Shelly einschalten wenn alle aus sind, als Status Rückmeldung?

    5 Mal editiert, zuletzt von _[Deleted]_ (4. März 2023 um 20:15)

  • stell dir 1 zimmer vor mit 4 lichtstromkreisen an der zimmertüre, wenn du den raum verlässt ist dort nur ein Taster über den i4 der entweder alles aus und wenn alles aus ist dann nur ein bestimmtes licht anschaltet, die anderen lichter kann man dann über schalter direkt im raum über andere taster direkt am shelly verdrahtet schalten

    vorteil wäre man braucht keine 4 taster am eingang

    Einmal editiert, zuletzt von perlscrip (23. September 2023 um 18:03)

  • Dieses Thema enthält einen weiteren Beitrag, der nur für registrierte Benutzer sichtbar ist.