Das Original Script stammt von http://forum.iobroker.net/viewtopic.php?f=21&t=869&p=10992#p6535.
Zeile 10 kann entfallen, da die Anzahl aus der Array-Länge ermittelt werden kann.
Zeile 26 sollte geändert werden in:
++moeglicheLOWBAT; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
Dann muss auch Zeile 31 geändert werden:
log("Anzahl Geräte: " + moeglicheLOWBAT + " # davon LOWBAT erkannt: " + textLOWBAT.length);
Um auch noch abzufangen, dass der State zu Datenpunkten, die noch nie etwas empfangen haben, nicht existiert, sollte Zeile 20 ergänzt werden
if(getState(id)) {
var status = getState(id).val; // Zustand *.LOWBAT abfragen (jedes Element)
}
Hier das korrigierte Skript:
createState('zählenLowbat.möglicheLOWBAT', 0); // wenn benötigt: Anzahl der Geräte mit Batterie
createState('zählenLowbat.anzahlLOWBAT', 0); // wenn benötigt: Anzahl der vorhandenen LOWBAT
createState('zählenLowbat.textLOWBAT', " "); // Namen LOWBAT, die an sind als Variable unter Javascript.0 anlegen
var cacheSelectorLOWBAT = $('channel[state.id=*0.LOWBAT]');
function countLowbat(obj) {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.LOWBAT auf 0
var moeglicheLOWBAT = 0;
var textLOWBAT = [];
if (obj) {
log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat
} else {
log('Ausgelöst bei Timer');
}
cacheSelectorLOWBAT.each(function (id, i) { // Schleife für jedes gefundenen Element *0.LOWBAT
var status = false;
if(getState(id)) {
status = getState(id).val; // Zustand *0.LOWBAT abfragen (jedes Element)
}
var obj = getObject(id);
if (status === true) { // wenn Zustand = true, wird das Array erweitert
textLOWBAT.push(obj.common.name); // Zu Array hinzufügen
}
log("Geräte Nr. " + i + ": " + getObject(id).common.name + ": " + status);
++moeglicheLOWBAT; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
});
// Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon LOWBAT zutreffend) ausgegeben
log("Text: " + textLOWBAT);
log("Anzahl Geräte: " + moeglicheLOWBAT + " # davon LOWBAT erkannt: " + textLOWBAT.length);
// die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
setState("zählenLowbat.textLOWBAT", textLOWBAT.join(',
')); // Schreibt die Namen der Geräte mit LOWBAT Meldung
setState("zählenLowbat.anzahlLOWBAT", textLOWBAT.length); // Schreibt die aktuelle Anzahl der LOWBAT-Meldungen
setState("zählenLowbat.möglicheLOWBAT", moeglicheLOWBAT); // Schreibt die Anzahl der vorhandenen Batterie-Geräte
}
cacheSelectorLOWBAT.on(function(obj) { // bei Zustandänderung *. LOWBAT in allen Gewerken
countLowbat(obj);
});
schedule("*/60 * * * *", function () { //oder!! soll entweder ausgelöst werden alle 10 Minuten
log("===>Will be triggered every 60 minutes!");
countLowbat();
});