NEWS
Wert aus callback an Programm übergeben
-
Hallo,
ich möchte gerne historische Daten auslesen und weiter verarbeiten. Das Auslesen klappt auch soweit aber die Funktion sendTo erwartet eine Callback Funktion mit festen Parametern. Wie bekomme ich die Daten von der Callback Funktion an das Programm übergeben? Aktuell verwende ich den Umweg über einen zusätzlichen Datenpunkt aber das führt zu diversen Problemen.// -------------------------------------------------------------------- // Give 7 latest values of variables sendTo('history.0', 'getHistory', {id: 'javascript.0.Solar.DailyTotal', options: {end: new Date().getTime(), count: 20, aggregate: 'onchange'}}, cbSendTo1); function cbSendTo1(result) { let tmpDay = ''; let tmpSTR = ''; let x = 0; for (var i = result.result.length-1; i >= 0; i--) { if (tmpDay != new Date(result.result[i].ts).getDate().toString()) { tmpDay = new Date(result.result[i].ts).getDate().toString(); tmpSTR += "data.setCell(" + x.toString() + ", 0, '" + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + "." + "');\n"; if(result.result[i].val == null) {tmpSTR += "data.setCell(" + x.toString() + ", 1, '0');\n";} else {tmpSTR += "data.setCell(" + x.toString() + ", 1, '" + result.result[i].val + "');\n";} x++; if (x > 6) break; console.log('Total: ' + x.toString() + ' -> ' + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + ' -> ' + result.result[i].val); } } setState('Solar.html1', tmpSTR); } tmpData += getState('Solar.html1').val; console.log(getState('Solar.html1').val);
-
@stephan1827 sagte:
Wie bekomme ich die Daten von der Callback Funktion an das Programm übergeben?
Weshalb willst Du die Daten an das Hauptprogramm übergeben und nicht innerhalb der Callback-Funktion weiter verarbeiten ?
Eine Möglichkeit, den Wert eines Datenpunktes zu verarbeiten, ist ein Trigger.var tmpData = ''; on({id: 'Solar.html1'}, function(dp) { tmpData += dp.state.val; log(dp.state.val); });
-
@stephan1827 was genau meinst du mit übergeben?
Du könntest daraus auch ein Promise machen und dann in einer asynchronen Funktion auf den Wert warten, dann musst du das nicht in einen State schreiben.
Oder du verarbeitest es direkt in deinem Callback.
-
Ich muss diese Funktion mehrfach aufrufen und die Daten dann weiter verarbeiten. Ich habe es jetzt so gelöst.
Funktionsaufruf
const history = await GetData('javascript.0.Solar.DailyTotal');
Funktion
async function GetData(strID) { return new Promise(function (resolve, reject) { sendTo('history.0', 'getHistory', { id: strID, options: { end: new Date().getTime(), count: 20, aggregate: 'onchange' } }, (result) => { if (result.error) { reject('Error: ' + result.error); } else { let retData = ''; let tmpDay = ''; let x = 0; for (var i = result.result.length - 1; i >= 0; i--) { if (tmpDay != new Date(result.result[i].ts).getDate().toString()) { tmpDay = new Date(result.result[i].ts).getDate().toString(); retData += "data.setCell(" + x.toString() + ", 0, '" + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + "." + "');\n"; if (result.result[i].val == null) { retData += "data.setCell(" + x.toString() + ", 1, '0');\n"; } else { retData += "data.setCell(" + x.toString() + ", 1, '" + result.result[i].val + "');\n"; } x++; if (x > 6) break; console.log('Total: ' + x.toString() + ' -> ' + new Date(result.result[i].ts).getDate() + "." + new Date(result.result[i].ts).getMonth() + ' -> ' + result.result[i].val); } //console.log('1---->' + retData + '<----'); }; resolve(retData); } }); }); }