Taupunkt berechnen mit Node-RED

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);
}
1 Gefällt mir

11 Gedanken zu „Taupunkt berechnen mit Node-RED“

  1. 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

    Antworten
  2. 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

    Antworten
  3. 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.

    Antworten
    • 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.

      Antworten
  4. 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

    Antworten
  5. 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.

    Antworten
    • 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

      Antworten

Schreibe einen Kommentar