NEWS
Sql.0 abfrage
-
irgendwie hab ich ein Brett vorm Kopp
ich schreibe mit Betteriewerte in die DB
jetzt hab ich 20 Geräte die ich nicht einzeln klimpern will also :
`// ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- var id = "%attery%" var ind = 0; var arrBatterie = []; var devicename; SQLAbfrage(); //----- alle Geräte lesen function SQLAbfrage () { sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name LIKE \'' + id + '\'', GetResults); } //----- mit diesen den zugehörigen letzten Wert function GetResults (dpoint) { var length = dpoint.result.length; for (var i = 0; i <= length-1; i++) { sendTo('sql.0', 'query', 'SELECT val FROM iobroker.ts_number WHERE id = ' + dpoint.result[i].id + ' ORDER BY ts DESC LIMIT 1',devi); var name = dpoint.result[i].name; name = name.substring(name.indexOf(".0.")+3); devicename = name.substring(0, name.indexOf(".battery")); if (devicename.length < 1) { devicename = name.substring(0, name.indexOf(".percent")); } if (devicename.length < 1) { devicename = name.substring(0, name.indexOf(".BATTERY")); } //------- nur den devicenamen ohne schnickschnak } } function devi(result) { var wert = JSON.stringify(result.result); }` und jetzt komm ich nicht weiter... in der Schleife habe ich die übergabe an die nächste Funktion aber ich brauche noch paar Werte für den Array den ich zusammen bauen will... am ende will ich ein array haben mit "devicename,wert" im arrBatterie[/i][/i]
-
Willkommen in der asynchronen Welt von JavaScript.
In deinem Ansatz machst DU die erste SQL-Abfrage und dann werden die ganzen anderen quasi parallel gefeuert und rufe alle jeweils die "devi"-Funktion auf. Diese setzt immer nur die Variable "wert". Wenn Du bei deiner Query auch die ID immer als ergebnis mit selektierst kannst du in devi deine array-Werte korrekt setzen.
Dann musst Du nur nach der letzten Rückmeldung ggf das tun was Du tun willst wenn alles fertig ist nach dem Füllen.
Das macht man ggf indem man sich eine Zähler merkt der am Anfang =die Anzahl der Datenpunkte ist und mit jeder Antwort vermindert wird. Wenn er mach dem vermindern = 0 ist ist man an sich fertig und kann dann das tun was man noch braucht.
-
ok soweit verstanden aber
function devi(result) { var wert = JSON.stringify(result.result); }
wie bekomme ich aus der Funktion den rückgabewert pro Schleifendruchgang
-
Nimm ein Array oder Objekt und füge alle antworten rein.
Also mit nem Array ein
werte.push(result.result);
Und werte ist eine globale Variable.
Und am besten hierhin ein check wenn die Länge des werte Arrays so lang wie die Anzahl der datenpunkte ist dann gleichbedeutend „Nachbearbeitung“ machen
Gesendet vom Handy …