Hallo Zusammen,
ich versuche mich gerade an dem dynamischen Widget um mir eingeschaltene Lichter, wie im Eingangspost, anzeigen zu lassen.
Hierzu habe ich ein bestehendes "Lichter-zählen-Script" etwas abgespeckt.
Dieses läuft zumindest schon mal und erstellt mir eine Liste mit den Lichternamen in einem Datenpunkt.
4f67253c-01d8-476b-b5bf-1a0ef42d8cd2-image.png
Nachdem ich in Javascript leider überhaupt nicht fit bin, bräuchte ich Unterstützung bei der Umsetzung damit das IconList Widget damit auch was anfangen kann. Hier mal mein Skript:
Spoiler
/* Status Zahl Lichter
zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
Daten kommen vom Gewerk "Licht"
*/
const logging = true;
const idText = 'javascript.0.Vis.IconListLicht';
// Ab hier nix mehr ändern
createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen
type: 'string',
name: 'Eingeschaltete Lichter',
desc: 'Namen der eingeschalteten Lichter',
def: ' ',
role: 'value'
});
// HM Schalter, HM Dimmer und Hue Schalter im Gewerk Licht
const hmSTATE = $('channel[state.id=*.STATE](functions=Licht)');
const hmLEVEL = $('channel[state.id=*.LEVEL](functions=Licht)');
//const hueon = $('state[id=*.on](functions=Licht)[role=switch.light]');
const shelly = $('state[id=*.Switch](functions=Licht)');
var textLichterAn;
function checkLicht(id, vorn, hinten) {
var name = getObject(id).common.name;
var devicename = name.substring(vorn, name.indexOf(hinten)); //Zeichen vorn, State hinten aus Text entfernen
if (getState(id).val) { // wenn Zustand != false / 0, dann wird die Anzahl der Lichter hochgezählt
textLichterAn.push(devicename);
}
}
function checkDevices() {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
textLichterAn = [];
hmSTATE.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
checkLicht(id, 0, '.STATE');
});
shelly.each(function(id, i) { // Schleife für jedes gefundenen Element *.Switch im Gewerk Licht
checkLicht(id, 0, '.Switch');
});
/*hueon.each(function(id, i) { // Schleife für jedes gefundenen Element *.on im Gewerk Licht
checkLicht(id, 6, '.on');
});*/
hmLEVEL.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
checkLicht(id, 0, '.LEVEL');
});
// Array mit Lichternamen sortieren
textLichterAn.sort();
// Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
if (logging) log("Text: " + textLichterAn);
// die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
//setState(idText, textLichterAn.join(',<br>')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
}
// Trigger
hmSTATE.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht
if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
shelly.on(function(obj) { // bei Zustandänderung *.Switch von Shellys im Gewerk Licht
if (logging) log('Auslösender Shelly: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
/*hueon.on(function(obj) { // bei Zustandänderung *.on von HUE Lampen im Gewerk Licht
if (logging) log('Auslösende HUE: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});*/
hmLEVEL.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
// Skriptstart
setTimeout(function() {
if (logging) log('Auslöser Skriptstart');
checkDevices();
}, 500);
Vielleicht kann mir jemand weiterhelfen 😀
Besten Dank!