Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Alexa Devices Generisch Durchlaufen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Alexa Devices Generisch Durchlaufen

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

      Hallo,

      ich möchte gerne über den Telegram Messenger einen Namen eines Alexa Devices senden und in einem JS Skript erkennen, welches Gerät gemeint ist.

      Gibt es eine Möglichkeit alle Geräte generisch zu durchlaufen?
      Es gibt ja die Wildcards mit „*“ kann man hier so etwas nutzen?
      Also würde gerne die Geräte bspw. In einer For Schleife durchlaufen und wenn der Name übereinstimmt, dann die Geräte ID nutzen um einen Text auszugeben.

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

        @ben1983 ich habe jetzt einmal sowas erstellt:

        let AlexaDevices = [
            ['Garage','alexa2.0.Echo-Devices.Gaaaaaxxxxx'],
            ['Wohnzimmer','alexa2.0.Echo-Devices.Gbbbbbxxxxx'],
            ['Kinderzimmer','alexa2.0.Echo-Devices.Gcccccxxxxx']
        ];
        

        und dann so gesucht:

        AlexaDevices.forEach(Device =>
                {
                    if(Textausgabe.indexOf(Device[0].toString()) == 0)
                    {
                        AlexaTelegram = Device[0].toString();
                        AlexaDeviceId = Device[1].toString();
                    }
                });
        

        Das funktioniert zumindest, aber ich muss halt vorher das Array anlegen.
        Gibt es dennoch eine Möglichkeit die Geräte Direkt zu durchlaufen?

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

          @ben1983 Hallo,
          ich weiß nicht genau, was Du machen möchtest, aber ich habe ein ähnliches Problem mit einer globalen Funktion getEcho gelöst:

          /**
           * Gibt die ID des Echos EchoName zurück.
           * bei mehreren Übereinstimmungen wird nur die erste berücksichtigt
           * @param {string} EchoName Name des Echos - wenn leer, dann letzter Echo
           * @return {string} ID des Echos; undefined, wenn nicht gefunden
           */
          function getEcho(EchoName) {
              if(EchoName === undefined) {
                  EchoName=getState('alexa2.0.History.name'/*Echo Device name*/).val;
              }
              let EchoID;
              let IDs=(getIdByName(EchoName, true));
              log("ID: "+IDs);
              if(IDs == undefined) {
                  log("getEcho: "+EchoName+" not registered!");
                  return;
              }
              for (let i=0; i < IDs.length; i++) {
                  if (IDs[i].search("Echo-Devices") != -1) {
                      EchoID=IDs[i];
                  }
              }
              return EchoID;
          }
          

          Der Aufruf erfolgt dann in einem beliebigen Skript z. B. mit

          setState(getEcho("Wohnzimmer")+".Commands.announcement", "Hallo");
          
          Ben1983 1 Reply Last reply Reply Quote 0
          • Ben1983
            Ben1983 @grrfield last edited by Ben1983

            @grrfield

            Ah, Du durchläufst Die Geräte gar nicht, sondern nutzt get IdByName. Sowas suche ich.

            Ich möchte über den Telegram messenger einen Befehl reinsenden, welcher zu Beginn den Device Name eines Echo Geräts beinhaltet.
            Anhand dieses Namens die ID raus finden.

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

              @ben1983 Genau so ist es. Falls es mehrere Treffer gibt (z. B. einen Echo Wohnzimmer und eine Lampe Wohnzimmer, ...), gibt getIDByName() ein Array mit allen IDs aus und Du mußt Dir dann die passende raussuchen. Dazu dient bei mir die for-Schleife, in der eine ID, die "Echo-Devices" enthält, gesucht wird.

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

                @grrfield Super, hat funktioniert.
                Kann man sich denn auch irgendwie alle Namen der Echo-Devices ausgeben lassen?

                Alsowenn ich bspw. eine Anfrage stelle wie heißen die erreichbaren Geräte:

                Dass ich dann was zurück geben kann wie: Wohnzimmer, Flur, Garten... etc.

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

                  @ben1983 Vielleicht so:

                  let echo;
                  let select="state[id='alexa2.0.Echo-Devices.*.online']";
                  $(select).each(function(id, i) {
                      if(getState(id).val) {
                          echo=id.slice(0, id.lastIndexOf('.'));
                          log(getObject(echo).common.name);
                      }
                  });
                  
                  Ben1983 1 Reply Last reply Reply Quote 0
                  • Ben1983
                    Ben1983 @grrfield last edited by

                    @grrfield Ich habe es so ähnlich gelöst, da ich nur Geräte haben wollte, welche aucheine Sprachausgabe ermöglichen:
                    (Bin sogar selbst drauf gekommen 😉 )

                    const IdAlexaDevices = 'alexa2.0.Echo-Devices';   // Hier befinden sich alle echo Geräte
                    const IdAlexaSprachausgabe = 'Commands.speak';    // Mit dieser Endungenden Alleecho Geräte, welche eine Sprachausgabe ermöglichen.
                    
                            // Abfragen, ob eine Übersicht der Geräte ausgegeben werden soll
                            if(Textausgabe.indexOf(IdCAlexaGeraeteuebersicht,0) == 0)
                            {
                                let Devices = $(IdAlexaDevices +  ".*." + IdAlexaSprachausgabe);
                                Ausgabe = "";
                                Devices.each(SendDeviceNames);
                                setState(IdTelegram,Ausgabe);
                    
                                function SendDeviceNames(id,i)
                                {   
                                    // Da das Ende bekannt sind, kann durch Substring die ID erstellt werden.
                                    let AlexaDeviceId = id.toString().substring(0,id.length - IdAlexaSprachausgabe.length - 1);
                                    if(Ausgabe =="")
                                    {
                                        Ausgabe = Ausgabe + getObject(AlexaDeviceId).common.name;
                                    }
                                    else
                                    {
                                        Ausgabe = Ausgabe + "\n" + getObject(AlexaDeviceId).common.name;
                                    }
                                }
                            }
                    
                    
                    Ben1983 1 Reply Last reply Reply Quote 0
                    • Ben1983
                      Ben1983 @Ben1983 last edited by

                      @ben1983 Das funktioniert soweit, aber wenn ich noch zusätzlich wissen möchte, welche geräte online sind, dann bekomme ich über:

                      getState(AlexaDeviceId + ".online").val
                      

                      immer en Wert true raus, obwohl in den objekten false steht.

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

                        @ben1983 sagte in Alexa Devices Generisch Durchlaufen:

                        getState(AlexaDeviceId + ".online").val
                        Ich habe Dein Skript mal so modifiziert, daß es bei mir läuft und Testausgaben eingebaut:

                        const IdAlexaDevices = 'alexa2.0.Echo-Devices';   // Hier befinden sich alle echo Geräte
                        const IdAlexaSprachausgabe = 'Commands.speak';    // Mit dieser Endungenden Alleecho Geräte, welche eine Sprachausgabe ermöglichen.
                         
                        // Abfragen, ob eine Übersicht der Geräte ausgegeben werden soll
                        if(true) // Textausgabe.indexOf(IdCAlexaGeraeteuebersicht,0) == 0)
                        {
                            let Devices = $(IdAlexaDevices +  ".*." + IdAlexaSprachausgabe);
                            Ausgabe = "";
                            Devices.each(SendDeviceNames);
                            //setState(IdTelegram,Ausgabe);
                        
                            function SendDeviceNames(id,i)
                            {   
                                // Da das Ende bekannt sind, kann durch Substring die ID erstellt werden.
                                let AlexaDeviceId = id.toString().substring(0,id.length - IdAlexaSprachausgabe.length - 1);
                                if(Ausgabe =="")
                                {
                                    Ausgabe = Ausgabe + getObject(AlexaDeviceId).common.name;
                                }
                                else
                                {
                                    Ausgabe = Ausgabe + "\n" + getObject(AlexaDeviceId).common.name;
                                }
                                // Testausgaben
                                log(AlexaDeviceId);
                                log(getState(AlexaDeviceId + ".online").val);
                            }
                        }
                        

                        Bei mir funktioniert das:

                        09:44:45.829	info	javascript.0 (13645) Stop script script.js.test
                        09:44:45.849	info	javascript.0 (13645) Start javascript script.js.test
                        09:44:45.923	info	javascript.0 (13645) script.js.test: alexa2.0.Echo-Devices.G090Lxxxxxxxxxxx
                        09:44:45.924	info	javascript.0 (13645) script.js.test: true
                        09:44:45.924	info	javascript.0 (13645) script.js.test: alexa2.0.Echo-Devices.G090Uxxxxxxxxxxx
                        09:44:45.925	info	javascript.0 (13645) script.js.test: false
                        09:44:45.926	info	javascript.0 (13645) script.js.test: registered 0 subscriptions and 0 schedules
                        

                        Der Echo G090Uxxxxxxxxxxx ist nicht online, und es wird auch false angezeigt. Bist Du sicher, daß bei Dir in den Objekten false steht - manchmal muß die Admin-Objekte Seite neu geladen werden, um Änderungen anzuzeigen.?

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

                          @grrfield ja das skript an sich funktioniert ja.
                          Er zeigt nur ein gerät als online an, was nicht online ist.
                          (Wird als fals in den Objekten angezeigt und ist auch wirklich aus

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

                            @ben1983 Das ist ja seltsam. Hast Du mal überprüft, ob das wirklich der gleiche State ist, der angezeigt wird? Ich würde erstmal in Admin-Objekte gehen, den State *.online kopieren und ein log(getState("*.online").val) machen. Danach den kopierten State mit der AlexaDeviceID aus der Schleife (ausgeben lassen) vergleichen.

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

                              @grrfield ich habe hier alle devices durchlaufen und den Namen und online State ausgegeben (mit einem log ) alle Geräte zeigen bei online True an, obwohl in den Objekten false steht.

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

                                @ben1983 Dann laß doch mal den Namen der States, die ausgegeben wurden, anzeigen, also nur log("*.online") und vergleiche sie mit den Namen unter Objekte. Vielleicht ist da ein Fehler drin.
                                Wie läßt Du denn die States ausgeben?

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

                                  @grrfield Heute hat es komischerweise funktioniert.
                                  Habe es jetzt so gelöst um alle Geräte aus zu geben, welche Sprache wiedergeben können und auch online sind.

                                  let AlexaDeviceId = "";
                                              let Devices = $(IdAlexaDevices +  ".*." + IdAlexaSprachausgabe);
                                              Ausgabe = "";
                                              Devices.each(SendDeviceNames);
                                              SendMessage(Ausgabe,UserName);
                                  
                                              function SendDeviceNames(id,i)
                                              {   
                                                  // Da das Ende bekannt sind, kann durch Substring die ID erstellt werden.
                                                  AlexaDeviceId = id.toString().substring(0,id.length - IdAlexaSprachausgabe.length - 1);
                                                  // Abfragen, ob das Gerät online ist (Nur online erreichbare Geräte sollen aufgelistet werden)
                                                  if(getState(AlexaDeviceId + IdSuffixOnline).val == true)
                                                  {
                                                      if(Ausgabe =="")
                                                      {
                                                          Ausgabe = Ausgabe + getObject(AlexaDeviceId).common.name;
                                                      }
                                                      else
                                                      {
                                                          Ausgabe = Ausgabe + "\n" + getObject(AlexaDeviceId).common.name;
                                                      }
                                                  }
                                              }
                                  

                                  Ps. Bis ein Gerät als offline angezeigt wird, dauert es allerdings ewig. Ich habe nun schon 5min eine Alexa vom Strom getrennt und sie wird immer noch als online angezeigt.

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  771
                                  Online

                                  31.8k
                                  Users

                                  80.0k
                                  Topics

                                  1.3m
                                  Posts

                                  2
                                  15
                                  375
                                  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