NEWS
[gelöst] foreach oder andere Lösung für mein Script
-
Ich kämpfe gerade mit einem Script. Und zwar geht es um Sonos.
Dort gibt es im Adapter ein Feld wo Gruppenmitglieder enthalten sind. Je nach Anzahl will ich die Gruppenmitglieder entfernen.
Auf meine einfache Art und Weise habe ich es geschafft. Aber elegant ist anders. Ich vermute das es evtl mit einer foreach-Schleife besser geht?
Leider übersteigt das mein Script-Wissen. Kann mir jemand helfen?
Hier mein Script:
/************************** * Verschiedene Abfragen wegen Sonos * * **************************/ //Einstellungen var logging = true; var debugging = true; var Sonos_IP = '192_168_178_35'; //Schlafzimmer var Ziel_Volume = 16; var Ziel_Playlist = "Meine Lieder"; //Scriptbereich var id_Sonos_Playlist_Set = "sonos.0.root."+Sonos_IP+".favorites_set"; var id_Sonos_Volume = "sonos.0.root."+Sonos_IP+".volume"; var id_Sonos_shuffle = "sonos.0.root."+Sonos_IP+".shuffle"/*Shuffle*/; var id_Sonos_Status = "sonos.0.root."+Sonos_IP+".state"; var id_Sonos_Coordinator = "sonos.0.root."+Sonos_IP+".coordinator"; var id_Sonos_Member = "sonos.0.root."+Sonos_IP+".membersChannels"/*membersChannels*/; var id_Sonos_Coordinator_Status; function func_Sonos(){ var Sonos_Change = false; var Sonos_Coordinator = getState(id_Sonos_Coordinator).val; var Sonos_Status = getState(id_Sonos_Status).val; var id_Sonos_Coordinator_Status = 'sonos.0.root.'+Sonos_Coordinator+'.state'; var Sonos_Coordinator_Status = getState(id_Sonos_Coordinator_Status).val; var Sonos_Member = getState(id_Sonos_Member).val; if(debugging){ log('eigener Status: ' +Sonos_Status); log('eingesteller Coordinator: ' +Sonos_Coordinator); log('Status vom Coordinator: ' +Sonos_Coordinator_Status); log('Member: ' +Sonos_Member); } var Sonos_Member_array = Sonos_Member.split(','); var Sonos_Member_Anzahl = Sonos_Member.split(',').length; var t1 = Sonos_Member_array[0]; var t2 = Sonos_Member_array[1]; var t3 = Sonos_Member_array[2]; var t4 = Sonos_Member_array[3]; log('Array: '+Sonos_Member_array); log('Anzahl Member: '+Sonos_Member_Anzahl ); log(t1); log(t2); log(t3); log(t4); if(t1 != undefined && t1 != Sonos_IP){ log('t1 Coordinator entfernt'); setState('sonos.0.root.'+t1+'.coordinator',t1); } else{ log('t1 nichts gemacht'); } if(t2 != undefined && t2 != Sonos_IP){ log('t2 Coordinator entfernt'); setState('sonos.0.root.'+t2+'.coordinator',t2); } else{ log('t2 nichts gemacht'); } if(t3 != undefined && t3 != Sonos_IP){ log('t3 Coordinator entfernt'); setState('sonos.0.root.'+t3+'.coordinator',t3); } else{ log('t3 nichts gemacht'); } if(t4 != undefined && t4 != Sonos_IP){ log('t4 Coordinator entfernt'); setState('sonos.0.root.'+t4+'.coordinator',t4); } else{ log('t4 nichts gemacht'); } } func_Sonos();
Damit es nachvollziehbarer ist mal ein Teil der Ausgabe:
avascript.0 2019-01-15 21:50:16.290 info script.js.Entwicklung.Sonosteil: t4 nichts gemacht javascript.0 2019-01-15 21:50:16.290 info script.js.Entwicklung.Sonosteil: t3 nichts gemacht javascript.0 2019-01-15 21:50:16.290 info script.js.Entwicklung.Sonosteil: t2 Coordinator entfernt javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: t1 Coordinator entfernt javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: undefined javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: 192_168_178_35 javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: 192_168_178_48 javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: 192_168_178_47 javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: Anzahl Member: 3 javascript.0 2019-01-15 21:50:16.289 info script.js.Entwicklung.Sonosteil: Array: 192_168_178_47,192_168_178_48,192_168_178_35 javascript.0 2019-01-15 21:50:16.288 info script.js.Entwicklung.Sonosteil: Member: 192_168_178_47,192_168_178_48,192_168_178_35 javascript.0 2019-01-15 21:50:16.288 info script.js.Entwicklung.Sonosteil: Status vom Coordinator: stop javascript.0 2019-01-15 21:50:16.288 info script.js.Entwicklung.Sonosteil: eingesteller Coordinator: 192_168_178_35 javascript.0 2019-01-15 21:50:16.288 info script.js.Entwicklung.Sonosteil: eigener Status: stop
-
Den Teil
log(t1); log(t2); log(t3); log(t4); if(t1 != undefined && t1 != Sonos_IP){ log('t1 Coordinator entfernt'); setState('sonos.0.root.'+t1+'.coordinator',t1); } else{ log('t1 nichts gemacht'); } if(t2 != undefined && t2 != Sonos_IP){ log('t2 Coordinator entfernt'); setState('sonos.0.root.'+t2+'.coordinator',t2); } else{ log('t2 nichts gemacht'); } if(t3 != undefined && t3 != Sonos_IP){ log('t3 Coordinator entfernt'); setState('sonos.0.root.'+t3+'.coordinator',t3); } else{ log('t3 nichts gemacht'); } if(t4 != undefined && t4 != Sonos_IP){ log('t4 Coordinator entfernt'); setState('sonos.0.root.'+t4+'.coordinator',t4); } else{ log('t4 nichts gemacht'); }
kann man durch eine for-Schleife ersetzen.
`for(let i = 0; i < 4; i++) { var t = Sonos_Member_array[i]; log(t); if(t != undefined && t != Sonos_IP){ log((i + 1) + ' Coordinator entfernt'); setState('sonos.0.root.' + t + '.coordinator', t); } else log((i + 1) + ' nichts gemacht'); }` [/i]
-
Perfekt genau an diesen Teil hatte ich gedacht. :mrgreen:
Das Script läuft natürlich wie gewünscht.
Beim nächstenmal schaffe ich es dann vielleicht auch selber. Logisch ist es zumindest. Vielen Dank!
geändert habe ich
for(let i = 0; i < 4; i++) {
da ich die Anzahl durch die Abfrage
var Sonos_Member_Anzahl = Sonos_Member.split(',').length;
bestimmen kann. Somit wird die Schleife nur so oft durchlaufen wie es Member Einträge gibt.
Meine Zeile lautet also
for(let i = 0; i < Sonos_Member_Anzahl; i++) {
Ich ergänze es falls mal jemand vor einen ähnlichen Problem steht.
-
Das Script läuft natürlich wie gewünscht. `
Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst].