Meine Sensordaten verarbeite ich zu 95% mittels Node-RED. Nun wollte ich den Taupunkt, für meinen Außensensor, berechnen. Der Taupunkt ist die Temperatur ab der sich Nebel bildet, da die Luft mit Wasserdampf gesättigt ist und keinen weiteren mehr aufnehmen kann (ich hoffe das passt). Somit könnt ihr also abschätzen ob sich eventuell Nebel bildet. Dieses ist zum Beispiel interessant bei Temperaturen unter dem Gefrierpunkt, bei denen der Nebel sich als Eisschicht auf der Straße niederlegen kann. Jedenfalls ist für jeden der sich für Wetter interessiert, der Taupunkt eine interessante Messgröße.
Berechnung Taupunkt
Den folgenden Code, könnt ihr in einen Funktions-Node in Node-RED einfügen. msg1.payload ist dabei die Temperatur und msg3.payload die Luftfeuchtigkeit. Als Ergebnis erhaltet ihr den Taupunkt als td.payload, welchen ihr dann in euren Flows weiterverarbeiten könnt. Die Daten gehen danach in meine InfluxDB und werden mit Grafana dargestellt. Somit habe ich auf meinem Wetter-Panel nun auch einen weiteren nützlichen Wert. Somit baut sich langsam das Mosaik aus Wetterdaten zusamen. Neben dem korrekten Luftdruck habe ich nun auch einen Taupunkt. Als nächstes Projekt steht ein Blitzdetektor an, aber davon mehr in einem anderen Beitrag.
var es = { };
var ed = { };
var eln = { };
var td = { };
if (msg1.payload >= 0)
{
es.payload = 6.1078*Math.pow(10,((7.5*msg1.payload)/(237.3 + msg1.payload)));
ed.payload = msg3.payload/100.0*es.payload;
eln.payload = Math.log10(ed.payload/6.1078);
td.payload = 237.3*eln.payload/(7.5 - eln.payload);
}
else
{
es.payload = 6.1078*Math.pow(10,((7.6*msg1.payload)/(240.7 + msg1.payload)));
ed.payload = msg3.payload/100.0*es.payload;
eln.payload = Math.log10(ed.payload/6.1078);
td.payload = 240.7*eln.payload/(7.6 - eln.payload);
}
Hallo Björn,
habe gerade Nodered entdeckt und es macht auch viel Spaß, weil ich keine Programmierkentnisse habe.
Mein Regenmesser übermittelt mir als playload die totale Regenmenge – aber mich interessiert eher nur, die Veränderung zum letzten Regen. Kannst Du mir da weiterhelfen?
Das wäre super!
Viele Grüße,
Markus
Hallo, vielen Dank fürs teilen des Syntax. Ich bin Anfänger in Node Red und würde aber auch gern den Taupunkt irgendwie darstellen. Das Problem oder woran ich schon scheitere ist wie ich die zwei Werte msg1.payload und msg3.payload erhalte. Bei mir ist alles was rein kommt msg.payload, also kein Unterschied. Kannst du mir vielleicht den Flow davor mal zeigen, wie du die Daten in diese Berechnung bekommst?
Vielen Dank
Grüße
Christian
Hi,
kannst du mal den Inhalt deiner msg.payload schicken. Darin sollte dann ja eigentlich alles enthalten sein.
Grüße,
Björn
Hallo
ich extrahier aus meinem Smarthome diese Daten mit der Function.
var attribute = msg.payload.attribute;
if(!attribute){ return }
else if( attribute.id === 972)
{return {payload:attribute.current_value}}
Das mach ich einmal mit der Temperatur und dann in einer anderenFunction das gleiche nochmal für die Luftfeuchtigkeit. Einziger Unterschied im script ist die ID.
Jetzt steh ich auf dem Schlauch wie ich diese beiden Daten als var in deine function zum Taupunkt bekomme.
Danke schonmal.
Moin,
es ist schwer ohne dein System es zu testen, aber es könnte so funktionieren:
Funktion für Temperatur und Luffeuchtigkeit: (msg1.topic anpassen für Luftfeuchtigkeit)
var attribute = msg.payload.attribute;
var msg1 = {};
if(!attribute){ return }
else if( attribute.id === 972)
{msg1 = {payload:attribute.current_value}}
msg1.topic=“temperatur“;
return msg1;
Beide Funktionen mit diesem Node verknüpfen:
context.data = context.data || {};
msg1 = {};
msg3 = {};
switch (msg.topic) {
case „temperatur“:
context.data.temperatur = msg.payload;
msg = null;
break;
case „luftfeuchtigkeit“:
context.data.luftfeuchtigkeit = msg.payload;
msg = null;
break;
default:
msg = null;
break;
}
if(context.data.temperatur != null && context.data.luftfeuchtigkeit != null) {
msg1.payload = context.data.temperatur;
msg3.payload = context.data.luftfeuchtigkeit;
context.data=null;
var sdd = { };
var dd = { };
var eln = { };
var td = { };
if (msg1.payload >= 0) {
sdd.payload = 6.1078*Math.pow(10,((7.5*msg1.payload)/(237.3 + msg1.payload)));
dd.payload = msg3.payload/100.0*sdd.payload;
eln.payload = Math.log10(dd.payload/6.1078);
td.payload = 237.3*eln.payload/(7.5 – eln.payload);
} else {
sdd.payload = 6.1078*Math.pow(10,((7.6*msg1.payload)/(240.7 + msg1.payload)));
dd.payload = msg3.payload/100.0*sdd.payload;
eln.payload = Math.log10(dd.payload/6.1078);
td.payload = 240.7*eln.payload/(7.6 – eln.payload);
}
return td;
}
Ich bin mir bei den ersten beiden Funktionen nicht sicher, aber der letzte Block funktioniert wenn ich zwei Werte hinein werfe.
Ich hoffe es hilft.
Hallo Björn,
bei der Verwendung deines Codes in einer Funktion von node-red bekomme ich ab der 5ten Zeile einige Fehlermeldungen. Als Laie bin ich ziemlich überfragt. Kannst du mir vielleicht sagen, woran das liegen kann?
Fehlermeldungen:
Expected ‚)‘ to macht ‚(‚ from line 6 and instead saw ‚;‘.
Expected an identifier and instead saw ‚=‘.
Missing ‚;‘ before statement
Missing semicolon.
Expected an identifier and instead saw ‚)‘.
Viele Grüße
Martin
Hallo Martin,
der Fehler lag nicht bei dir, sondern bei mir. Leider war die Formatierung kaputt, nun sollte es klappen.
Grüße,
Björn
Hallo Björn,
jetzt ergibt die Formel auch einen Sinn! Vielen Dank.
Gleiches „Problem“ gibt es wohl auch im folgenden Beitrag von dir:
https://www.bjoerns-techblog.de/2018/07/ttn-und-node-red-2nd-stage/
Beste Grüße
Martin
Danke, hab ich angepasst.
Hallo,
danke erstmal für die tolle Anleitung!
Ich hätte da mal ein kleines Problem, und zwar, ich bekomme die Temperatur übern msg.payload, und die Luftfeuchtigkeit auch per msg.payload.
Ich würde gerne (Temp) msg.payload in msg1.payload wandeln, das selbe wäre (%H) msg.payload in msg3.payload, mit einerfunction sicherlich, komme da aber leider nich weiter, danke schon mal.
Hi,
das sollte etwa so laufen:
msg1.payload = msg.payload.temp
msg3.payload = msg.payload.humidity
Kommt halt darauf an, wie das entsprechende Feld bei dir benannt ist.
Grüße,
Björn
Hallo,
hab deinen Code für mich angepasst,a ber irgendwas hats hier. Hab temp und Feuchte als „numbers“, aber ich bekomme als Resultat immer „undefined“. Kann mir jemand sagen, woran es scheitert?
Hier der Expoert meines Flows:
[
{
„id“: „df744e750e5a9e81“,
„type“: „tab“,
„label“: „Taupunkte“,
„disabled“: false,
„info“: „“,
„env“: []
},
{
„id“: „589a22c4f044264e“,
„type“: „function“,
„z“: „df744e750e5a9e81“,
„name“: „Td außen“,
„func“: „var es = { };\nvar ed = { };\nvar eln = { };\nvar td = { };\nvar msg1 = {};\nvar msg3 = {};\nmsg1.payload = msg.payload.tempout;\nmsg3.payload = msg.payload.humidityout;\nif (msg1.payload >= 0)\n{\n\t\t es.payload = 6.1078*Math.pow(10,((7.5*msg1.payload)/(237.3 + msg1.payload)));\n\t\t ed.payload = msg3.payload/100.0*es.payload;\n\t\t eln.payload = Math.log10(ed.payload/6.1078);\n\t\t\ttd.payload = 237.3*eln.payload/(7.5 – eln.payload);\n}\nelse\n{\n\t\t es.payload = 6.1078*Math.pow(10,((7.6*msg1.payload)/(240.7 + msg1.payload)));\n\t\t ed.payload = msg3.payload/100.0*es.payload;\n\t\t eln.payload = Math.log10(ed.payload/6.1078);\n\t\t\ttd.payload = 240.7*eln.payload/(7.6 – eln.payload);\n}\nreturn [msg1,msg3];“,
„outputs“: 1,
„timeout“: 0,
„noerr“: 0,
„initialize“: „“,
„finalize“: „“,
„libs“: [],
„x“: 500,
„y“: 120,
„wires“: [
[
„a4cc9938fa255750“
]
]
},
{
„id“: „e3019f3175327953“,
„type“: „link in“,
„z“: „df744e750e5a9e81“,
„name“: „Humidity out“,
„links“: [
„995f7c2d3ba33d99“
],
„x“: 65,
„y“: 140,
„wires“: [
[
„da8bfa18928117f9“
]
]
},
{
„id“: „33412de7df28bca2“,
„type“: „link in“,
„z“: „df744e750e5a9e81“,
„name“: „Temp out“,
„links“: [
„ffc8b882aa95a7cd“
],
„x“: 65,
„y“: 100,
„wires“: [
[
„f860fc114b0a2b09“
]
]
},
{
„id“: „a4cc9938fa255750“,
„type“: „debug“,
„z“: „df744e750e5a9e81“,
„name“: „debug 11“,
„active“: true,
„tosidebar“: true,
„console“: false,
„tostatus“: false,
„complete“: „payload“,
„targetType“: „msg“,
„statusVal“: „“,
„statusType“: „auto“,
„x“: 1100,
„y“: 100,
„wires“: []
},
{
„id“: „da8bfa18928117f9“,
„type“: „change“,
„z“: „df744e750e5a9e81“,
„name“: „“,
„rules“: [
{
„t“: „set“,
„p“: „topic“,
„pt“: „msg“,
„to“: „humidityout“,
„tot“: „str“
}
],
„action“: „“,
„property“: „“,
„from“: „“,
„to“: „“,
„reg“: false,
„x“: 200,
„y“: 140,
„wires“: [
[
„54d2c21d96f0c541“,
„589a22c4f044264e“
]
]
},
{
„id“: „35bcef6655a8a3ca“,
„type“: „debug“,
„z“: „df744e750e5a9e81“,
„name“: „tempout“,
„active“: true,
„tosidebar“: true,
„console“: false,
„tostatus“: true,
„complete“: „payload“,
„targetType“: „msg“,
„statusVal“: „payload“,
„statusType“: „auto“,
„x“: 400,
„y“: 40,
„wires“: []
},
{
„id“: „54d2c21d96f0c541“,
„type“: „debug“,
„z“: „df744e750e5a9e81“,
„name“: „humidityout“,
„active“: true,
„tosidebar“: true,
„console“: false,
„tostatus“: true,
„complete“: „payload“,
„targetType“: „msg“,
„statusVal“: „payload“,
„statusType“: „auto“,
„x“: 410,
„y“: 200,
„wires“: []
},
{
„id“: „f860fc114b0a2b09“,
„type“: „change“,
„z“: „df744e750e5a9e81“,
„name“: „“,
„rules“: [
{
„t“: „set“,
„p“: „topic“,
„pt“: „msg“,
„to“: „tempout“,
„tot“: „str“
}
],
„action“: „“,
„property“: „“,
„from“: „“,
„to“: „“,
„reg“: false,
„x“: 200,
„y“: 100,
„wires“: [
[
„35bcef6655a8a3ca“,
„589a22c4f044264e“
]
]
}
]