NEWS
[gelöst] Alexa Devices Generisch Durchlaufen
-
@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.
-
@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); } });
-
@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 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.
-
@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.?
-
@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 -
@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.
-
@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.
-
@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? -
@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.