Hilfe bei Shelly Skript - Skript-Funktionen auf einen Taster beschränken

  • Hallo zusammen,

    ich möchte gerne mit einem i4 via Skript einen RGBW2 steuern und dabei Farbwechsel- und Dimm-Funktionen nutzen. Ich habe hierzu auch bereits ein klasse Skript gefunden (https://github.com/shelly-tools/s…control_rgbw.js).

    Das Skript ist leider für "One-Button" geschrieben. Im Resultat läuft das Skript auf allen 4 Tasten (Shelly Wand-4-Taster mit Shelly i4plus) und erzeugt entsprechende unerwünschte Nebenwirkungen. Hat jemand vielleicht einen Tipp, wie ich das Skript auf einen Kanal beschränke? In einem anderen Skript auf der Seite finde ich zwar einen Hinweis auf "Input" ID (Dimmer-Skript), aber damit nur der emullierte Button des Zielgeräts gemeint. Für Hilfestellungen/Tipps wäre ich sehr dankbar.
    Nachfolgend noch das Originalskript vom Shelly-Tools-Github.

  • Die Id steckt in event.info.

    Code
    Shelly.addEventHandler(
      function (event) {
        if(event.name==="input"){
          let id = event.info.id;
          // Nun kannst du die gewünschte id selektieren.
          // ...
        }
      }
    } 

    So etwas kannst du selbst herausfinden, indem du event per print() ausgeben lässt - weniger Zeilen umfassend per print(JSON.stringify(event)).

    Wenn du den Überblick hast und dich bspw. nur für das interessierst, was in event.info steckt, dann print(JSON.stringify(event.info)).

    ...

    Ich verstehe nicht, warum ich immer wieder diesen user_data als Parameter finde, obwohl nichts dafür oder null übergeben wird. Das ist absoluter Unsinn.

    Wenn du den Code leicht verbessern willst, nimm dieses stereotype, überflüssige Zeug heraus!

    Am Beispiel der Funktion toggleRGBW(ip) gezeigt:

    Code
    function toggleRGBW(ip) {
       Shelly.call(
           "http.get", {
               url: 'http://' + ip + '/light/0?turn=toggle'
           },
           function (response, error_code, error_message, ud) { // ud wird nicht gebraucht.
           }, // Komma weg!
           null // null bedeutet soviel wie "nichts" oder "ungültig", auch weg!
       );
    }

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    3 Mal editiert, zuletzt von eiche (27. Februar 2024 um 19:06)

  • Hallo Eiche,

    danke für deine Hinweise. Ich bin leider noch komplett neu in dem Thema und kenne die Synthax nicht. Über print() habe ich Button und Eingabemethode identifiziert

    ---

    [script] [/script]

    [script]shelly_notification:209 Event from input:2: {"component":"input:2", "id":2, "event":"btn_down", "ts":1709115036.77}
    11:10:36 [/script]

    [script]shelly_notification:209 Event from input:2: {"component":"input:2", "id":2, "event":"btn_up", "ts":1709115037.77}
    11:10:37 [/script]

    [script]shelly_notification:209 Event from input:2: {"component":"input:2", "id":2, "event":"single_push", "ts":1709115037.77}
    11:10:37 [/script]

    [script][/script]

    ---

    … aber wie selektiere ich nun den Inputs. wo, an welcher Stelle ergänze ich input:2 bzw. id:2

  • Shelly Script bzw. mJS ist eine Untermenge von JavaScript mit zusätzlichem API (Application Programming Interface).

    Die API beinhaltet die in der Shelly Dokumentation beschriebenen RPC Methoden (Remote Procedure Call), welche u.a. per HTTP und in einem Skript per Shelly.call(Methode, Parameter, callback) aufgerufen werden können.

    Zum erstellen oder anpassen eines Skript solltest du dich deshalb auch mit JavaScript beschäftigen.

    Eine brauchbare Quelle (Tutorial und Referenz zum Nachschlage) hierfür ist w3schools: https://www.w3schools.com/

    … aber wie selektiere ich nun den Inputs. wo, an welcher Stelle ergänze ich input:2 bzw. id:2

    Wenn du im Skript bspw. alle 4 Tasten unterschiedlich nutzen willst, kannst du eine Fallunterscheidung verwenden.

    Weil die Event Informationen redundant sind, brauchst du hier den Komponentennamen nicht, es genügt deren Id, wenn zuvor der Name auf "input" geprüft wird.

    Kleiner Hinweis:

    Ich nutze nicht selten bei englischsprachigen Begriffen und Abkürzungen mal dieses mal jenes Geschlecht.

    API mit I = Interface kann als das Interface oder als die Schnittstelle gedacht werden, entsprechend das API oder die API.

    Edit:

    Zur Sprache Shelly Script kenne ich kein Tutorial. Dasjenige in der Shelly Dokumentation ist ausschließlich zur Handhabung von Skripten geeignet, nicht zum kennenlernen der Sprache.

    Auch kenne ich keine JavaScript Einführung, die außerhalb von Webseiten angesiedelt ist.

    Da muss man halt durch, wobei die Kenntnis einer C ähnlichen Sprache nützlich ist.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    2 Mal editiert, zuletzt von eiche (28. Februar 2024 um 12:27)

  • Du kannst auch für die callback Funktion eine benannte (mit Namen versehene) Funktion verwenden. Das kann die Übersichtlichkeit eines Skripts verbessern.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

  • Dieses Thema enthält 2 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.