NEWS
[gelößt] Frage zu Rückgabewert/Callback nach request
-
Hallo,
ich will eine Netzwerksteckdose Netio230B per Javascript steuern (ich weiß es gibt da schon einen fertigen Node-Red-Flow, der auch funktioniert, ich wollte es trotzdem per Script probieren) was auch grundsätzlich funktioniert. An einer Sache beiße ich mir jedoch die Zähne aus. Ich bekomme das mit dem Rückgabewert nicht gebacken, was wohl daran liegt, das request die Antwort asynchron liefert, sprich bis die Antwort da ist ist das Script schon weiter und es gibt nur ein undefinded als Rückmeldung.
Im Prinzip habe ich das gleiche Problem wie @ruhr70 hier –> viewtopic.php?t=1073#p8488 , ich habe aber nicht wirklich verstanden wie das denn letztendlich gelöst wurde.
So sieht mein Script aus, aktuell nur für eine Steckdose:
! ````
// Variablen deklarieren / ID´s einlesen
var request = require ('request');
var bSetAusgang1 = "javascript.0.Netio230B.Set_Ausgang_1";
! // Ausgang 1 behandeln
on({id: bSetAusgang1, val: true}, function() {
log("1. Ausgang 1 soll geschaltet werden");
let result = LeseStatus (1); // Aufrufendes Script mit Nummer des zu lesenden Ausgangs
log("3. In der aufrufenden Funktion kommt an: " + result);
// weitere Anweisungen
setState(bSetAusgang1, false); // VIS-Variable wieder zurücksetzen
});
! // Status der Ausgänge lesen
function LeseStatus (Out) {
var url = "http://192.168.0.190/cgi/control.cgi?login=p:USER:PASSWORD&p=l";
var OutStatus;
request(url, function (error, state, body) {
if (body) {
var abody = body.slice(6, 13).split(' '); // Status der 4 Ausgänge extrahieren und in Array splitten
OutStatus = abody[Out-1]; // Übergebener Wert ist vom Typ string!!
log("2. Ausgang " + Out + " hat Zustand " + OutStatus);
}
});
// Hier soll nun als Rückgabewert der Status des Ausgangs (0 oder 1) zurückgegeben werden
}Kann mir vielleicht jemand einen Schubs geben oder erklären, wie ich das mit dem Rückgabewert anpacken muss. Gruß Steffen
-
Was möchtest Du mit
// weitere Anweisungen
machen, das Du nicht auch in der Callback-Funktion von request() erledigen kannst ?
-
Hallo paul53,
da soll dann je nach Rückmeldung der Ausgang ein oder ausgeschaltet werden.
Der Gedanke war folgender:
Die Steckdosenleiste hat 4 Ausgänge ich wollte zum Schalten des jeweiligen Ausgangs immer die Funktion LeseStatus aufrufen und dann eben wie oben geschrieben je nach Rückmeldung den Ausgang ein oder ausschalten.
Aber je mehr ich darüber nachdenke, so glaube ich, das ich zu kompliziert denke!
> das Du nicht auch in der Callback-Funktion von request() erledigen kannst ?
Vor allem nach dem was du geschrieben hast - ich schau mal ob ich das was ich machen will dort unterkriege!Gruß Steffen
-
Hallo paul53,
danke, du hast mich mit deiner Frage auf den richtigen weg gebracht! Habe das was ich will nun im Script unter request gepackt und es funktioniert einwandfrei. Habe mal wieder viel zu kompliziert gedacht!
Danke nochmals,
Gruß Steffen
-
Hier noch meine Lösung, falls jemand ein ähnliches Problem hat:
! ````
// Variablen deklarieren / ID´s einlesen
var request = require ('request');
var bSetAusgang1 = "javascript.0.Netio230B.Set_Ausgang_1";
var bAusgang1 = "javascript.0.Netio230B.Ausgang_1";
! // Ausgang 1 behandeln
on({id: bSetAusgang1, val: true}, function() {
log("1. Ausgang 1 soll geschaltet werden");
LeseStatus (1);
setState(bSetAusgang1, false); // VIS-Variable wieder zurücksetzen
});
! // Status der Ausgänge lesen
function LeseStatus (Out) {
var url = "http://192.168.0.190/cgi/control.cgi?login=p:USER:PASSWORD&p=l";
var OutStatus;
request(url, function (error, state, body) {
if (body) {
var abody = body.slice(6, 13).split(' '); // Status der 4 Ausgänge extrahieren und in Array splitten
OutStatus = abody[Out-1]; // Übergebener Wert ist vom Typ string!!
log("2. Ausgang " + Out + " hat Zustand " + OutStatus);
if (OutStatus === "1") {
log("3. Ausgang " + Out + " wird ausgeschaltet");
SchalteAusgang ("0uuu");
setState(bAusgang1, false);
}
if (OutStatus === "0") {
log("3. Ausgang " + Out + " wird eingeschaltet");
SchalteAusgang ("1uuu");
setState(bAusgang1, true);
}
}
});
}
! // Ausgänge schalten
function SchalteAusgang (befehl) {
var url = "http://192.168.0.190/cgi/control.cgi?login=p:USER:PASSWORD&p=" + befehl;
log ("4. Sende Befehl: " + url);
request(url, function(error, state, body) {
log("5. Rückmeldung: " + state);
});
}Gruß Steffen