Funktionsaufruf in Skript des Shelly X von Skript in Shelly Y aus

Die Verwendung von Skripten liegt im eigenen Ermessen des Benutzers. Unterstützung für Skripte wird vom Autor des Skripts bereitgestellt.
  • Ich möchte von einem ShellyPlus1 auf einen anderen ShellyPlus1 Daten übertragen. Ich stelle mir das so vor wie mit den Actions, die man z.B. in einem ShellyPlusHT aktivieren kann und damit eine Funktion auf anderen Shellys aufrufen kann.

    Funktionierende Beispiel:

    Action auf HTPlus1: http://192.168.62.17/rpc/script.eval?id=2&code="htTest(${ev.tC})"
    Dies führt auf dem ShellyPlus1 zum Aufruf der Funktion htTest:

    function htTest(Temp)
    {
     console.log ("Temp:"+Temp);
    }


    Jetzt möchte ich aber einen ähnlichen Aufruf (für das Beispiel hier der gleiche Aufruf htTest(Temp)) von einem Skript auf einem anderen ShellyPlus1 aus auslösen.
    Leider habe ich hierfür kein Beispiel im Forum gefunden. Ich habe mich etwas rangetastet mit diesem Code-Schnipsel für das sendende ShellyPlus1:

    function callOtherShelly()
    {
     console.log ("Shelly.call ...");
     try{
       Shelly.call('http.get', {url: 'http://admin:@192.168.62.17/rpc/script.eval?id=2 & code="htTest(21.5)"'});
     }catch(e){print(e);}

     console.log ("... Shelly.call");
    }

    Der Aufruf von callOtherShelly() führt im Debuglog des SenderShelly zu:
    shos_rpc_inst.c:243 script.eval via WS_in 192.168.62.2:63021
    Shelly.call ...
    shelly_ejs_rpc.cpp:41 Shelly.call http.get {"url":"http://admin:@192.168.62.17/rpc/script.eval?id=2 & code=\"htTest(21.5)\""}
    ... Shelly.call
    shos_rpc_inst.c:243 http.get via loopback
    shelly_http_client.:308 0x3ffdfc48: HTTP GET http://admin:@192.168.62.17/rpc/script.eval?id=2 & code="htTest(21.5)"
    shelly_http_client.:611 0x3ffdfc48: Finished; bytes 0, code 0, redir 0/3, auth 0, status -1: Connection error: -14

    Beim EmpfängerShelly gibt es keinen Debuglogeintrag.

    Ich hoffe, die Idee für das was ich machen möchte, kommt rüber.
    Jetzt wäre es super, wenn ich etwas Hilfe bei der Überwindung der Skripthürde bekommen würde.

    Einmal editiert, zuletzt von ToLa62 (3. Dezember 2024 um 12:27)

  • Vielleicht hilft dir diese Code als Beispiel weiter:
    Shelly mit der IP: 192.168.178.150

    Empfänger:
    Shelly IP: 192.168.178.161
    Script 3

    Das Erste Script (IP: 192.168.178.150) abonniert den EventHandler wenn sich der Zustand des Covers ändert. Also betätigt wird.

    Wenn das nach den abgefragten Kriterien erfüllt ist, wird den anderen Shelly (192.168.178.161) per Register.Endpoint ein String zugesandt:

    Wichtig beim ersten Script ist eigentlich nur das Senden:

    Code
    Shelly.call("HTTP.REQUEST", {
              method: "GET",
              url: "http://" + sendIP + "/" + scriptPath + "/raffstoresZustand?" + indexCoverInDictionary + ":" + newState
              });

    Der Empfänger abonniert dann 'raffstoresZustand' und wartet darauf bis etwas gesendet wird.

    Empfängt HTTPServer.registerEndpoint('raffstoresZustand' was wird die function ausgeführt.

    INFO: Es ist nicht nötig den registerEndpoint in einer Timer Schleife zu setzen. der Code wird ausgeführt sobald was empfangen wird.

    So kann man über zwei verschiedene Shelly´s Daten austauschen.

    Das geht auch mit mehreren Shelly´s die auf dem selben Register.Endpoint senden.

    Als Übertragung habe ich "1:open" gewählt.

    Der String wird dann beim Empfänger aufgeschnitten "1" und "open" -> so kann ich auswerten welcher Shelly gesendet hat, in diesem Beispiel "1" und als Daten = "open"

  • Vielen Dank Viedotraum für deine schnelle und ausführliche Antwort.

    Dein Code deckt sicherlich meinen Anwendungsfall ab und ich werde ihn erstmal so für meine Thematik umsetzen.

    Allerdings scheint es noch eine wesentlich einfachere Möglichkeit für die Kommunikation zu geben, wie die Actions zeigen, nur weiß ich leider nicht, wie ich so eine Action im Skript schreiben kann. Aber vielleicht kann mir das ja noch jemand schreiben...

  • Code
    http://192.168.62.17/rpc/script.eval?id=2&code="htTest(${ev.tC})"

    Wenn dein Action auf ein Script verweist das auf dem selben Device ist, darf die IP nicht von sich selbst sein.
    Dann muss die IP: 127.0.0.1 genommen werden.

  • Code
    http://192.168.62.17/rpc/script.eval?id=2&code="htTest(${ev.tC})"

    Wenn dein Action auf ein Script verweist das auf dem selben Device ist, darf die IP nicht von sich selbst sein.
    Dann muss die IP: 127.0.0.1 genommen werden.

    Das Shelly Plus H&T hat die Adresse 192.168.62.15. Dort sende ich die Aktion an das ShellyPlus1 mit Adresse 17.

    Jetzt will ich von einem Shelly Plus 1 auf Adresse .16 was an die .17 senden.

    Übrigens funktioniert dein Code von oben umgesetzt auf meine Anwendung schon grundsätzlich, ging recht flott.

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