NEWS
In Node Red Informationen aus einen Script empfangen und auswerten
-
Hallo
Ich bin auf der Suche nach einer Möglichkeit in Node Red Werte aus mein Schript ( Node js ) zu empfangen und auszuwerten.
Wie stellt man das ohne großen Aufwand an?
Kann man das direkt ohne ioBroker Adpter machen?
Vieleicht über HTTP ?
Gruß NetFritz
-
Hi.
Wenn ich dich richtig verstanden habe, läuft das Skript nicht unter iobroker. Ist das so richtig?
Wenn ja, kannst du du in node red z.b. einfach einen flow für einen http Webservice erstellen und die Parameter als get-Parameter übergeben.
Alternativ bietet dir die simple API von iobroker auch die Möglichkeit, Werte in iobroker mittels http zu setzen. Dann wäre es in node-red einfach ein iobroker in node.
Gesendet von meinem SM-G930F mit Tapatalk
-
Hallo
Das Script läuft nicht in ioBroker.
Gibt es dafür ein Link, wie wird das gemacht.
Ich habe ein Script gefunden ist aber wohl für ioBroker.
`var request = require('request'); var URL = 'http://192.168.2.87:1880'; createState('temperature', { name: 'Temperature', type: 'number', unit: '°C' }); request(URL, function (error, response, result) { if (result) { // 111°F/44°C var temp = result.match(/``\d+°F\/(\d+)°C<\/div>/); if (temp) { setState('temperature', temp[1]); } } });` Wie muss den das Script aussehen das auserhalb von ioBroker läuft und per HTTP in Node Red die Daten auswertet? Gruß NetFritz
-
Hi NetFritz,
die Simple API ist hier beschrieben: https://github.com/ioBroker/ioBroker.simple-api.
Für das Setzen eines Werts ist die SET-Funktion da. Die Parameter werden einfach als get-Parameter an die URL gehängt. Hier das Beispiel hierfür:
http://ip:8087/set/hm-rpc.0.IEQ12345.LEVEL?value=1
Zum Senden der Daten gibt es in node.js mehrere REST-Implementierungen. Aber die einfachste Variante ist es, den String einfach selbst zusammen zu bauen und diesen als http-Request zu senden.
Hier ein Beispiel hierfür:
var request = require('request'); request('http://ip:8087/set/hm-rpc.0.IEQ12345.LEVEL?value=1', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // Print answer from Server } })
Mit https oder Authentifizierung sieht es etwas anders aus.
-
Hallo
Danke für den Hinweiß.
Ich habe es mal versucht ohne ioBroker API.
Gebe ich im Browser fogendes ein
"http://192.168.2.87:1880/test?temperature=22"
dann empfängt Node Red mit "http in" und URL /test den Aufruf vom Browser.
Unter DEBUG kann ich auch temperature: "22" sehen.
Das geht sehr schnell.
Rufe ich folgendes Node Js auf so dauert es lange das das Script durchläuft.
NODE_DEBUG=request node request2.js
var request = require('request'); var value1=22; var URL = "http://192.168.2.87:1880/test?temperature=22"; console.log (URL); request.put(URL, function (error, response, result) { if (result) { console.log(result); } });
Die Ausgabe vom Script ist folgendes
http://192.168.2.87:1880/test?temperature=22 REQUEST { uri: 'http://192.168.2.87:1880/test?temperature=22', callback: [Function], method: 'PUT' } REQUEST make request http://192.168.2.87:1880/test?temperature=22 REQUEST onRequestResponse http://192.168.2.87:1880/test?temperature=22 404 { 'x-powered-by': 'Express', 'content-security-policy': 'default-src \'self\'', 'x-content-type-options': 'nosniff', 'content-type': 'text/html; charset=utf-8', 'content-length': '143', date: 'Tue, 02 Jan 2018 12:07:01 GMT', connection: 'close' } REQUEST reading response's body REQUEST finish init function http://192.168.2.87:1880/test?temperature=22 REQUEST response end http://192.168.2.87:1880/test?temperature=22 404 { 'x-powered-by': 'Express', 'content-security-policy': 'default-src \'self\'', 'x-content-type-options': 'nosniff', 'content-type': 'text/html; charset=utf-8', 'content-length': '143', date: 'Tue, 02 Jan 2018 12:07:01 GMT', connection: 'close' } REQUEST end event http://192.168.2.87:1880/test?temperature=22 REQUEST has body http://192.168.2.87:1880/test?temperature=22 143 REQUEST emitting complete http://192.168.2.87:1880/test?temperature=22 <title>Error</title> ``` Cannot PUT /test ```
Das Script hat 404 Error Cannot PUT als Ausgabe.
Wie bekomme ich das Sript Fehlfrei zum Laufen?
Gruß NetFritz
-
ja, das liegt an der method: 'PUT'.
Es gibt bei Http unterschiedliche Methods, die unterschiedliche Aktionen auf dem HTTP-Server auslösen (https://developer.mozilla.org/en-US/doc … TP/Methods).
Mit PUT kann man eine Datei auf dem Server speichern. Was hier nicht gewünscht ist. Da vom Testskript keine Daten im Body gesendet werden, wird halt bis zum Timeout gewartet und dann der Fehler erzeugt.
Die HTTP-Methode, die für die Simple-API-Aufrufe verwendet werden muss, ist GET, da die Parameter direkt an der URL hängen. Aus HTTP-Sicht ist der REST-API-Aufruf wie ein Abruf einer Website vom Server.
Versuche mal request.get (…) oder einfach nur request (...) wie in meinem Beispiel. Damit sollte es gehen. (Das Request-Object ist hier beschrieben https://github.com/request/request)
-
Hallo
Das habe ich mir schon gedacht das es an PUT liegt.
Füge ich nun request.get ein dann braucht die Übertragung zu Node Red ca. 3 sekunden.
Das Script bricht aber erst nach langer Zeit ab.
Mache ich den curl Aufruf in der Konsole bricht der Aufruf in der Konsole nicht ab.
Die Übertragung erfogt sofort.
curl "http://192.168.2.87:1880/test?temperature=22"
Ach ja der Browser Aufruf läuft auch lange bis zum Abbruch.
Das wird sicherlich daran liegen das GET ein responde erwartet.
Ich habe ja hinter "http in" eine "function" und dann ein "debug"
In der "function" habe ich folgendes eingetragen:
msg.payload.helloText = 'Hello World!'; node.log('Hey There, World!'); return msg;
Es ging schon mal wenn ich den im Browser ausgeführt habe das ich als Rückmeldung im Browser
"Hey There, World" stehen hatte.
Gruß NetFritz
-
Zeig mal deinen node-red-Flow. Hört sich danach an, dass es kein http-response gibt, der den Statuscode auf 200 (=OK) setzt.
Der Request erwartet natürlich eine Antwort vom Server. Wenn du nur einen http-in-Node hast, bekommt das Request-Objekt im Testskript jedoch keine Antwort von node-red und wartet bis zum Timeout.
Damit man den Request korrekt beantworten kann gibt es in node-red nicht nur einen http-in sondern auch einen http-out. Der http-response-Node muss mit dem in-Node verbunden werden, damit dieser die Verbindung übernehmen kann. Dazwischen kann z.B. durch einen Change-Node der zu sendende Inhalt festgelegt werden. In deinem Fall brauchst du das nicht, weil der body bereits leer ist und als statusCode per Default 200 gesendet wird.
Sollte in etwa wie auf dem Bild aussehen.
-
Hallo
Habe jetzt hinter den "http in" noch ein "http request" gesetzt.
Bekomme jetzt im Browser als Request "temperature: "22" " und im Node Red ist sofort nach dem Absenden
die "temperature "22" " zu sehen.
Auch in der Konsole mit "curl "http://192.168.2.87:1880/test?temperature=22" " sofort in Node Red
die "temperature "22" " zu sehen.
Blos das Node js braucht ca. 5 sekunden dafür.
*/ var request = require('request'); var URL = "http://192.168.2.87:1880/test?temperature=22"; request.get(URL, function (error, response, result) { if (error) { //console.log(error); } });
Keine Ahnung warum.
Hier noch die DEBUG Ausgabe:
NODE_DEBUG=request node request2.js REQUEST { uri: 'http://192.168.2.87:1880/test?temperature=22', callback: [Function], method: 'GET' } REQUEST make request http://192.168.2.87:1880/test?temperature=22 REQUEST onRequestResponse http://192.168.2.87:1880/test?temperature=22 200 { 'x-powered-by': 'Express', 'x-content-type-options': 'nosniff', 'content-type': 'application/json; charset=utf-8', 'content-length': '20', etag: 'W/"14-0d4s4gMIkyPp/otqo6vG2W1Qf5M"', date: 'Tue, 02 Jan 2018 16:59:12 GMT', connection: 'close' } REQUEST reading response's body REQUEST finish init function http://192.168.2.87:1880/test?temperature=22 REQUEST response end http://192.168.2.87:1880/test?temperature=22 200 { 'x-powered-by': 'Express', 'x-content-type-options': 'nosniff', 'content-type': 'application/json; charset=utf-8', 'content-length': '20', etag: 'W/"14-0d4s4gMIkyPp/otqo6vG2W1Qf5M"', date: 'Tue, 02 Jan 2018 16:59:12 GMT', connection: 'close' } REQUEST end event http://192.168.2.87:1880/test?temperature=22 REQUEST has body http://192.168.2.87:1880/test?temperature=22 20 REQUEST emitting complete http://192.168.2.87:1880/test?temperature=22 root@raspberrypi:/var/www/html/myhouse/nodejs#
Gruß NetFritz
-
Hallo
Habe jetzt hinter den "http in" noch ein "http request" gesetzt `
Wieso http request? Der ist zum senden von requests.Nimm mal den http Response .
Gesendet von meinem SM-G930F mit Tapatalk
-
Hallo
Schon richtig ist ein "http response".
Habe mich verschrieben.
Gruß NetFritz
-
Mal ausprobiert, ob node.js die 5 Sekunden zum starten braucht?
Gesendet von meinem SM-G930F mit Tapatalk
-
Hallo
Mal am des Node js Script ein "console.log("start");" gesetzt.
Nach Return kommt "start" nach ca. 2sek. und dann nach ca. 3sek.
ist das Script durgelaufen und in Node Red unter DEBUG die Ausgabe.
Gruß NetFritz
-
Hallo
Habe es mal mit
var get = require('simple-get'); get('http://192.168.2.87:1880/test?temperature=22', function (err, res) { if (err) throw err; console.log(res.statusCode); // 200 res.pipe(process.stdout); // `res` is a stream });
versucht.
Geht viel schneller.
Start braucht auch ca 2sek., danach ist das Script sofort durchgelaufen
und Node Red reagiert auch sofort danach.
var request = require('request'); braucht wohl so lange.
Das ganze läuft auf einem RPi Zero W.
Gruß NetFritz