Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [gelöst] Auf Alexa Routinen in Js "allgemein" reagieren

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    [gelöst] Auf Alexa Routinen in Js "allgemein" reagieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • Gaspode
      Gaspode @Ahnungsbefreit last edited by Gaspode

      @ahnungsbefreit
      Generisch würde das in JS so gehen:

      on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) {
          log("--->"+obj.id);
      });
      

      Aus der ID kann man dann die Serial Number gewinnen und die kryptische Routinen-ID.
      Die kann man natürlich auswerten, aber dann müsste man ja mit der ID jeder Routine, die man behandeln will, vergleichen.

      Oder legst du dir für jede Routine und Gerät einen eigenen Trigger an?

      A 1 Reply Last reply Reply Quote 0
      • A
        Ahnungsbefreit @Gaspode last edited by

        @alexi die Routine hat auf jedem Device die gleiche ID, deswegen ersetzt Du den zweiten Stern gegen die ID der Routine, auf die Du triggern willst

        Gaspode Ben1983 2 Replies Last reply Reply Quote 0
        • Gaspode
          Gaspode @Ahnungsbefreit last edited by

          @ahnungsbefreit
          Ja, das würde gehen. Mir persönlich ist aber der Weg über die History lieber, da muss ich mich nicht mit den kryptischen Routine-Namen rumschlagen. In meinem Fall hätte ich außerdem etwa 70 Trigger, die ich anlegen müsste. Da ist mir der Textvergleich innehalb des Registry Triggers sympatischer.
          Aber evtl. hat @Ben1983 ja damit eine Lösung, die für ihn passt.

          A 1 Reply Last reply Reply Quote 0
          • A
            Ahnungsbefreit @Gaspode last edited by

            @alexi ich habe auch erst über den Text-Vergleich mit History gearbeitet aber bei mir zumindest hat das nicht immer funktioniert, manchmal wurde in der History das Device erst zu spät aktualisiert und dann kommt die Antwort am falschen Device raus. Ich meine mich übrigens zu erinnern, dass auch der Entwickler des Alexa2 Adapters den Weg über Routinen empfohlen hat und von History abrät. Aber wenn es funktioniert, warum nicht?

            Ben1983 1 Reply Last reply Reply Quote 0
            • Gaspode
              Gaspode last edited by

              @ahnungsbefreit said in Auf Alexa Routinen in Js "allgemein" reagieren:

              History das Device erst zu spät aktualisiert und dann kommt die Antwort am falschen Device raus.

              Hast du da die States history.summary und history.serialNumber ausgewertet? Ich nehme ja den state history.json, der beides (und zusätzlich noch den Device-Namen) beinhaltet. Hatte noch nie den Fall, dass im Trigger ein Attribut nicht aktuell war.

              A 1 Reply Last reply Reply Quote 0
              • A
                Ahnungsbefreit @Gaspode last edited by

                @alexi Ja, vielleicht lag's daran.

                1 Reply Last reply Reply Quote 0
                • Ben1983
                  Ben1983 @Ahnungsbefreit last edited by

                  @ahnungsbefreit ich werde es mal die Tage versuchen.
                  Gibts denn auch noch ne Möglichkeit Text auf einem Mobilen Gerät wieder geben zu können?
                  Also bspw. Handy Alexa App. Die Stadt ja nicht als device im iobroker

                  A 1 Reply Last reply Reply Quote 0
                  • Ben1983
                    Ben1983 @Ahnungsbefreit last edited by

                    @ahnungsbefreit bekommt Man aus dem verlinkten Objekt nicht das Objekt der Routine?
                    Wie bekommt man nun das Device raus?

                    A Gaspode 2 Replies Last reply Reply Quote 0
                    • A
                      Ahnungsbefreit @Ben1983 last edited by

                      @ben1983 Nur die Devices, die Du auch in den Objekten siehst.

                      1 Reply Last reply Reply Quote 0
                      • A
                        Ahnungsbefreit @Ben1983 last edited by

                        @ben1983 sagte: Wie bekommt man nun das Device raus?

                        Wenn Du auf eine bestimmte Routine triggerst, dann sieht die Objekt ID so aus:

                        alexa2.0.Echo-Devices.<deviceSerNo>.Routines.<RoutineID>
                        

                        Wenn Du diese Liste auseinandernimmst, kannst Du daraus die OID für die Ausgabe ermitteln. In Blockly sieht das dann z.B. so aus:

                        65e9541e-a2f1-4a34-a1f4-e255df3decc9-image.png

                        1 Reply Last reply Reply Quote 0
                        • Gaspode
                          Gaspode @Ben1983 last edited by

                          @ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:

                          Wie bekommt man nun das Device raus?

                          on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) {
                              log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length));
                          });
                          
                          Ben1983 1 Reply Last reply Reply Quote 0
                          • Ben1983
                            Ben1983 @Gaspode last edited by

                            @alexi said in Auf Alexa Routinen in Js "allgemein" reagieren:

                            obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length)

                            Ich habe es jetzt mal so testweise implementiert.
                            Die Routine wird ausgelöst, aber er springt nicht in die Funktion. (Es wird nichts geloggt und es erfolgt keine Sprachausgabe.

                            
                            const IdRoutineAussentemperatur = 'alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e';
                            
                            on(IdRoutineAussentemperatur,AbfrageAussentemperatur)
                            
                            function AbfrageAussentemperatur(obj)
                            {
                                let ActiveDevice = obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length);
                                log(obj.id);
                                setState("alexa2.0.Echo-Devices." + ActiveDevice + ".Commands.speak", "Das hat funktioniert");
                            }
                            
                            
                            1 Reply Last reply Reply Quote 0
                            • Gaspode
                              Gaspode last edited by Gaspode

                              @ben1983
                              Nimm's mir nicht übel, aber wenn du Beispiele änderst, dann könntest du den Fehler auch selbst suchen.
                              Doku: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md

                              Hinweis: Du definierst in Zeile 2 einen String, willst aber einen regulären Ausdruck:

                              const IdRoutineAussentemperatur = /alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e/;
                              
                              Ben1983 2 Replies Last reply Reply Quote 0
                              • Ben1983
                                Ben1983 @Gaspode last edited by Ben1983

                                @alexi said in Auf Alexa Routinen in Js "allgemein" reagieren:

                                /alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e/

                                Ich dachte das wäre gleich zu behandeln wie das hier... das funktioniert:

                                on('alexa2.0.History.json', AbfrageSpracheingabe);
                                
                                function AbfrageSpracheingabe(json)
                                {
                                    let jsonObj  = JSON.parse(json.state.val); 
                                    let summary  = jsonObj.summary;
                                    let deviceID = jsonObj.serialNumber;
                                 
                                    if(summary =="wie ist die aussentemperatur")
                                    {
                                       setState("alexa2.0.Echo-Devices." + deviceID + ".Commands.speak", "Testausgabe");
                                    }
                                }
                                

                                Da nehme ich doch auch einen String? und übergebe so die funktion.
                                sehe den unterschied nicht, warumdas nicht genauso gehen sollte, oder übersehe ich etwas?
                                Ps. habe auch schon den Ausdruck direkt mit rein genommen und es klappt auch nicht.

                                und beim Einsetzen des Beispiels:

                                on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) {
                                    log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length));
                                });
                                

                                erfolgt auch kein log

                                1 Reply Last reply Reply Quote 0
                                • Ben1983
                                  Ben1983 @Gaspode last edited by Ben1983

                                  @alexi Habe das Problem gefunden. Wenn ich das Sternchen durch ein device ersetze geht es.
                                  irgendwie klappt das mit dem Stern nicht

                                  Es funktioniert sogar so:

                                  const IdRoutineAussentemperatur = "alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e";
                                  
                                  on(IdRoutineAussentemperatur,AbfrageAussentemperatur);
                                  
                                  function AbfrageAussentemperatur(obj)
                                  {
                                      setState(obj.deviceId + ".Commands.speak", "Das hat funktioniert");
                                  }
                                  

                                  Allerdings nur einmal. Wenn man durch eine Spracheingabe die Routine auslöst, dann wird diese auf true gesetzt.
                                  Leider nicht zurück gesetzt.

                                  habe es so gelöst. kann man das so machen, oder spricht was dagegen?

                                  const IdRoutineAussentemperatur = "alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e";
                                  
                                  on(IdRoutineAussentemperatur,AbfrageAussentemperatur);
                                  
                                  function AbfrageAussentemperatur(obj)
                                  {
                                      setState(obj.deviceId + ".Commands.speak", "Das hat funktioniert");
                                      setState('alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e',false);
                                  }
                                  

                                  Jetz müsste ich nur noch wissen, wie ich es generisch hin bekomme. Das mit dem Stern scheint ja nicht zu funktionieren.

                                  Gaspode 1 Reply Last reply Reply Quote 0
                                  • Gaspode
                                    Gaspode last edited by Gaspode

                                    @ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:

                                    irgendwie klappt das mit dem Stern nicht

                                    https://developer.mozilla.org/de/docs/Web/JavaScript/Guide/Regular_Expressions

                                    .* steht in einer RegExp für eine beliebige Anzahl eines beliebigen Zeichens (der Punkt für ein beliebiges Zeichen und der Stern für beliebig viele davon). Warum das bei dir nicht funktioniert, wenn du den Ausdruck in / statt in " einschließt, kann ich dir nicht sagen.

                                    Ganz korrekt müsste der Ausdruck so heißen, und in meinem Test funktioniert sowohl dieser, als auch der einganges genannte:

                                    /^alexa2\.0\.Echo-Devices\..*\.Routines\..*/
                                    
                                    OstfrieseUnterwegs 1 Reply Last reply Reply Quote 0
                                    • Gaspode
                                      Gaspode @Ben1983 last edited by Gaspode

                                      @ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:

                                      habe es so gelöst. kann man das so machen, oder spricht was dagegen?

                                      Ja. Erstens triggerst du den Trigger durch das Rücksetzen erneut und zweitens führt das auch die Routine ein weiteres Mal aus.

                                      Ich würde das so lösen, bin aber kein Experte mit den Routinen. Wie gesagt, ich bevorzuge die History Variante.

                                      on({id: /^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, val:true}, function (obj) {
                                          log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length));
                                          setState (obj.id, {val:false, ack:true});
                                      });
                                      

                                      Erklärung:
                                      "val: true" im Trigger reagiert nur auf den Wert true
                                      "ack: true" in setState verhindert ein erneutes Ausführen der Routine

                                      1 Reply Last reply Reply Quote 0
                                      • OstfrieseUnterwegs
                                        OstfrieseUnterwegs @Gaspode last edited by OstfrieseUnterwegs

                                        Ganz korrekt müsste es wohl so sein:

                                        on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, function (obj) {
                                        

                                        Zufälligerweie funktioniert auch Deine Variante. Aber die würde auch bei einem Objekt mit der ID
                                        alexa2A0BEcho-DevicesBaldistOsternRoutinesUndPfingsten
                                        triggern. der Punbkt soll ja gefunden werden und müsste daher maskiert werden.

                                        Mann kann das prinzipiell auch die Namen der Alexa Routinen benutzen.
                                        Irgendwie so:

                                        on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, function (obj) {
                                            var routine = obj.common.name;
                                            log("--->"+routine);
                                            if (routine == 'Name einer Routine in Alexa App') {
                                                log ("----> zweig 1");
                                            } else if (routine == 'Name einer anderen Routine in Alexa App') {
                                                log ("----> Zweig 2");
                                            } else {
                                                log ("----> Diese Routine wird nicht in ioBroker behandelt");
                                            }
                                        });
                                        

                                        EDIT: Überlappt sich mit Alexis Post

                                        Gaspode Ben1983 3 Replies Last reply Reply Quote 0
                                        • Gaspode
                                          Gaspode @OstfrieseUnterwegs last edited by

                                          @ostfrieseunterwegs said in Auf Alexa Routinen in Js "allgemein" reagieren:

                                          Ganz korrekt müsste es wohl so sein:

                                          Ja, ist mir auch aufgefallen, hatte ich in meinen letzten Beiträgen auch schon so geändert. Im ersten allerdings ohne Code Tag, weshalb die Hälfte nicht dargestellt wurde... 😬
                                          Hab jetzt die Code Tags drumrumgemacht.

                                          Ben1983 1 Reply Last reply Reply Quote 0
                                          • Ben1983
                                            Ben1983 @OstfrieseUnterwegs last edited by

                                            @ostfrieseunterwegs said in Auf Alexa Routinen in Js "allgemein" reagieren:

                                            /^alexa2.0.Echo-Devices...Routines../

                                            Danke habe es jetzt so realisiert und es funktioniert einwandfrei:
                                            Danke das hatte erst nicht funktioniert, da es nur reagiert hat bei einem Zustandswechsel und wenn die Routine vorher schon auf true stand, dann ging es nicht mehr.

                                            on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/,RoutinesChanged);
                                            
                                            // Abfrage der einzelnen Routinen
                                            function RoutinesChanged(obj)
                                            {
                                                // Erzeugen der Routinen ID
                                                let CalledRoutine = obj.common.name;
                                            
                                                // Abfrage der Außentemperatur
                                                if(CalledRoutine == 'Aktuelle Außentemperatur')
                                                {
                                                    // Lese aktuelle Außentemperatur
                                                    let Aussentemperatur =  getState(IdAussentemperatur).val;
                                            
                                                    // Zahl runden
                                                    Aussentemperatur  = Math.round(Aussentemperatur);
                                            
                                                    // Ausgabe der Nachricht an Alexa Device
                                                    var Ausgabe = "";
                                                    Ausgabe = "Die aktuelle Außentemperatur beträgt " + Aussentemperatur + "°C.";
                                                    setState(obj.deviceId + ".Commands.speak", Ausgabe);
                                                    setState (obj.id, {val:false, ack:true});
                                                }
                                            }
                                            

                                            Jetz stellt sich mir nur die Frage, wo finde ich die Struktur, welche hinter dem objekt liegt, welches der Funktion übergeben wird.
                                            --> Damit ich weiß was ich abrufen kann.

                                            Kann man auch die ID Abfragen, falls sich der Name der Routine ändert? (Oder ändert sich dann automatisch auch die ID)?

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            647
                                            Online

                                            32.1k
                                            Users

                                            80.6k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            33
                                            909
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo