NEWS
daten über REST Schnittstelle lesen
-
@ben1983 sagte: kann man eigenlich die callbackfunktion von dem request noch erweitern?
-
@ben1983 sagte: die Variable "MyDevice.Id" wurde auch in der letzten Schleife richtig erkannt.
Auf diese wird nicht in der Callback-Funktion zugegriffen. Die Einschränkung auf lokale Schleifen-Variablen bezieht sich nur auf Variablen, deren Wert in der Schleife verändert wird und auf die in der Callback-Funktion zugegriffen wird.
-
@paul53 OK, ich hatte sie aber einmal zum test einfach dort geloggt und das hatte funktioniert.
-
@ben1983 sagte: dort geloggt und das hatte funktioniert.
Innerhalb der Schleife ist "MyDevice.Id" eine Konstante.
-
@paul53 Warum das denn? Wird doch auch durchlaufen in der obersten schleife.
-
@ben1983 sagte: Wird doch auch durchlaufen in der obersten schleife.
In der äußeren Schleife ist es eine lokale Schleifen-Variable. In der inneren Schleife ist es ein konstanter Wert.
Test:for(let j = 0; j < 3; j++) { for(let i = 0; i < 4; i++) { setState('0_userdata.0.Test.neueZahl'/*neueZahl*/, j , true, function() { log(i + ', ' + j); }); } }
Log:
15:50:17.919 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 0 15:50:17.920 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 0 15:50:17.920 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 0 15:50:17.921 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 0 15:50:17.921 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 1 15:50:17.921 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 1 15:50:17.921 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 1 15:50:17.921 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 1 15:50:17.924 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 2 15:50:17.927 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 2 15:50:17.927 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 2 15:50:17.928 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 2
Gegentest:
let j; for(j = 0; j < 3; j++) { for(let i = 0; i < 4; i++) { setState('0_userdata.0.Test.neueZahl'/*neueZahl*/, j , true, function() { log(i + ', ' + j); }); } }
15:52:42.649 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 3 15:52:42.649 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 3 15:52:42.649 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 0, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 1, 3 15:52:42.650 info javascript.0 (1986) script.js.common.Neuer_Test: 2, 3 15:52:42.655 info javascript.0 (1986) script.js.common.Neuer_Test: 3, 3
-
@paul53 Das ist mir schon klar... fürchte wir reden aneinander vorbei:
Mir geht es um die Werte, wie sie später im Callback zur Verfügung stehen.Habe gerade nochmal einen Test gemacht:
let x = 0; MyDevice.HistoricValue.forEach(function (MyHistoricValue) { let y = 0; MyHistoricValue.Assign.forEach(function (MyAssign) { x = x + 1; y = y + 1; let ax= x; let ay= y; const Url = 'http://localhost:8080/rest/1/projects/EnergieMonitoring/devices/' + MyDevice.Id + '/hist/energy/' + MyHistoricValue.Value + '/' + MyAssign.Type + '/.json?' + MyAssign.Time; request(Url, function(error, response, result) { log("X: " + ax.toString() + "Y: " + ay.toString()); if(error) { log(error, 'warn'); } else { let value = JSON.parse(result).energy if(value != NaN &&value != "NaN") { setState(MyAssign.InternalId,value); } else { log(result); log("Es gab einen fehlerhaften Eintrag in der Response von GridVis: " + MyAssign.InternalId); } } }); x = x + 1; y = y + 1; ax = x; ay =y; }); });
offensichtlich stehen für den Callback NICHT die Werte zum Zeitpunkt des Requests zur Verfügung, sondern die Werte am Ende des Schleifendurchlaufs, denn ich bekam hier diesen Log:
Also immer 2er Schritte. (Addition vor und nachdem Request.
-
@ben1983 sagte: Addition vor und nachdem Request.
Interessant.
-
@paul53 wenn ich das richtig sehe, kann man über die Rest API aber keinen online-Wert schreiben, oder?
-
@ben1983 sagte: kann man über die Rest API aber keinen online-Wert schreiben, oder?
Mit request.post(url) sollte man manualinput schreiben können.
Wozu willst Du schreiben? -
@paul53 Ich habe mit iobroker ein Modbus Gerät simuliert.
Anstatt über Modbus könnte ich ja auch über REST schreiben, oder? -
@ben1983 sagte: Anstatt über Modbus könnte ich ja auch über REST schreiben, oder?
Nur, wenn die REST-API es hergibt.
-
@paul53 Bekomme ichauchirgend wie den HTTP Status Code mit?
habe gerade erfahren, dass nur wenn dieser 200 ist auf json geparst werden kann.Edit:
Den findet man unter:response.statusCode
-
@ben1983 sagte: Bekomme ichauchirgend wie den HTTP Status Code mit?
Zeile 19 ergänzen:
else if(response.statuscode == 200)