NEWS
Gibt es ein "For each"? [gelöst]
-
Hallo Gemeinde,
ich habe hier relativ viele (so ca. 25) MiHome Devices, die mit Batterie funktionieren.
Jetzt kam ich auf die Idee, ein Blockly zu erstellen, dass für jedes Device die Baterieladung prüft und falls unter einem bestimmten Wert, 10% oder so, eine Nachricht in der VIS anzeigt, dass am Gerät XY die Batterie getauscht werden muss.
Für ein Gerät gar kein Problem. Für 25 eigentlich auch nicht, aber bei vielen Geräten ist es erstens viel Arbeit und zweitens muss man dran denken, neue Geräte mit in das Script auf zu nehmen.
Von daher kam ich auf die Idee, so etwas mit einer for each Schleife zu lösen. Leider gibt es das in Blockly nicht oder ich bin blind.
Kann mir da einer weiter helfen? Evtl. auch direkt mit JS?
Ich stell mir das so vor, dass man einen Ordner angibt und alle Objekte im Ordner werden in der Schleife behandelt. Wäre so etwas machbar?
LG, Markus
-
Evtl. auch direkt mit JS? `
Dafür gibt es den https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md#–-selector. -
Oh cool. Danke für den Tipp.
Gibts dazu auch irgendwo Beispiele?
Das wäre noch viel cooler
-
In der Doku gibt es bereits einige Beispiele. Wenn Du einen Screenhot mit den Datenpunkten posten würdest, könnte man konkret werden (ich habe kein MiHome).
-
Hy, über die Suche gabs auch schon diverse Treffer.
Hab das Script auch soweit am laufen, allerdings scheint es aktuell mit .Devicename Probleme zu geben.
Den brauch ich aber zwingend, wenn ich wissen will bei welchem Gerät die Batterie leer ist.
Ich behalte das mal im Auge.
Trotzdem Danke für deine Hilfe
-
scheint es aktuell mit .Devicename Probleme zu geben. `
Sind denn die Datenpunkte bei MiHome einem Device-Objekt zugeordnet ?Falls nicht, Vorschlag:
const idVis = 'MiHome.Batterietausch'; const batt = $('mihome.0.*.percent'); createState(idVis, '', {type: 'string'}); function lowBatt() { var low = []; batt.each(function (id, i) { if(getState(id).val < 10) { low.push(id.split('.')[3]); // Geräte-ID } }); setState(idVis, low.join(', '), true); } schedule('0 * * * *', lowBatt); // jede volle Stunde
-
Hy,
dein Script funktioniert soweit. Allerdings gibt es die ID und nicht den Namen aus.
Das Script wirft im Moment magnet_158d0001e62da0 aus, sollte aber "TS Balkontür Außen" zurück liefern.
Geht das auch noch irgendwie?
So sieht das aus:
-
sollte aber "TS Balkontür Außen" zurück liefern.
Geht das auch noch irgendwie? `
Das sollte auch gehen.if(getState(id).val < 10) { id = id.split('.'); id = 'mihome.0.' + id[2] + '.' + id[3]; low.push(getObject(id).common.name); // Geräte-Name }
-
Perfekt. Genau das wars
Tausend Dank!
-
Genau das wars `
Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst].