Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] Alexa Devices Generisch Durchlaufen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    869

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

[gelöst] Alexa Devices Generisch Durchlaufen

Geplant Angeheftet Gesperrt Verschoben JavaScript
15 Beiträge 2 Kommentatoren 450 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • grrfieldG grrfield

    @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.

    Ben1983B Offline
    Ben1983B Offline
    Ben1983
    schrieb am zuletzt editiert von
    #6

    @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.

    grrfieldG 1 Antwort Letzte Antwort
    0
    • Ben1983B Ben1983

      @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.

      grrfieldG Offline
      grrfieldG Offline
      grrfield
      schrieb am zuletzt editiert von
      #7

      @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);
          }
      });
      
      Ben1983B 1 Antwort Letzte Antwort
      0
      • grrfieldG grrfield

        @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);
            }
        });
        
        Ben1983B Offline
        Ben1983B Offline
        Ben1983
        schrieb am zuletzt editiert von
        #8

        @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;
                        }
                    }
                }
        
        
        Ben1983B 1 Antwort Letzte Antwort
        0
        • Ben1983B Ben1983

          @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;
                          }
                      }
                  }
          
          
          Ben1983B Offline
          Ben1983B Offline
          Ben1983
          schrieb am zuletzt editiert von
          #9

          @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.

          grrfieldG 1 Antwort Letzte Antwort
          0
          • Ben1983B Ben1983

            @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.

            grrfieldG Offline
            grrfieldG Offline
            grrfield
            schrieb am zuletzt editiert von
            #10

            @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.?

            Ben1983B 1 Antwort Letzte Antwort
            0
            • grrfieldG grrfield

              @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.?

              Ben1983B Offline
              Ben1983B Offline
              Ben1983
              schrieb am zuletzt editiert von
              #11

              @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 Antwort Letzte Antwort
              0
              • grrfieldG Offline
                grrfieldG Offline
                grrfield
                schrieb am zuletzt editiert von
                #12

                @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.

                Ben1983B 1 Antwort Letzte Antwort
                0
                • grrfieldG grrfield

                  @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.

                  Ben1983B Offline
                  Ben1983B Offline
                  Ben1983
                  schrieb am zuletzt editiert von
                  #13

                  @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.

                  grrfieldG 1 Antwort Letzte Antwort
                  0
                  • Ben1983B Ben1983

                    @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.

                    grrfieldG Offline
                    grrfieldG Offline
                    grrfield
                    schrieb am zuletzt editiert von
                    #14

                    @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?

                    Ben1983B 1 Antwort Letzte Antwort
                    0
                    • grrfieldG grrfield

                      @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?

                      Ben1983B Offline
                      Ben1983B Offline
                      Ben1983
                      schrieb am zuletzt editiert von
                      #15

                      @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 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      345

                      Online

                      32.6k

                      Benutzer

                      82.1k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe