MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Uwe Hahn
Beiträge: 2
Registriert: 28.07.2018, 08:51
Danksagung erhalten: 1 Mal

MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Beitrag von Uwe Hahn » 28.07.2018, 09:32

Hallo zusammen,

nachdem ich viele Tipps über dieses Forum bekommen habe, möchte ich euch gerne Programmierhinweise geben, wie man die min/max-Werte von Temperaturen, Feuchte und Luftdruck ermittelt, den relativen Luftdruck, Taupunkt, Windchill und Hitzeindex berechnet. Die Wetterstation WDC-7000 berechnet zwar einige dieser Werte selbst, gibt sie aber nicht an die CCU2 weiter. Zudem rechnet sie beispielweise den Windchill schlicht falsch aus und der relative Luftdruck weicht auch leicht von der "Wikipedia"-Formel ab.

Ich verwende die CCU2 mit Firmware 2.35.15 und auf dem Smartphone TinyMatic 2.11.1. Also los geht's:

Min/Max-Temperaturen/Feuchte/Luftdruck berechnen

Code: Alles auswählen

! min/max Temperaturen außen / Feuchte außen / rel. Luftdruck innen berechnen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! min. Temperatur heute, Zeichenkette, °C
! max. Temperatur heute, Zeichenkette, °C
! Temperatur heute, Zeichenkette, °C
!
! min. Feuchte heute, Zeichenkette, %
! max. Feuchte heute, Zeichenkette, %
! Feuchte heute, Zeichenkette, %
!
! min. rel. Luftdruck heute, Zeichenkette, hPa
! max. rel. Luftdruck heute, Zeichenkette, hPa
! rel. Luftdruck heute, Zeichenkette, hPa

!**********************************************************************

! Temperatur außen holen *****************************************
!var t = dom.GetObject(3336).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("TEMPERATURE").Value();

! Systemvariablen holen
var tminheute = dom.GetObject("min. Temperatur heute");
var tmaxheute = dom.GetObject("max. Temperatur heute");

! min. Temperatur heute berechnen
if (t < tminheute.Value())
{
  tminheute.Variable(t.ToString(1));
}

! max. Temperatur heute berechnen
if (t > tmaxheute.Value())
{
  tmaxheute.Variable(t.ToString(1));
}

! min./max. Temperatur heute zusammenfasssen
dom.GetObject("Temperatur heute").Variable(dom.GetObject("min. Temperatur heute").Value() # " ... " # dom.GetObject("max. Temperatur heute").Value());


! Feuchte außen holen *****************************************
!var f = dom.GetObject(3332).Value();
var f = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("HUMIDITY").Value();

! Systemvariablen holen
var fminheute = dom.GetObject("min. Feuchte heute");
var fmaxheute = dom.GetObject("max. Feuchte heute");

! min. Feuchte heute berechnen
if (f < fminheute.Value())
{
  fminheute.Variable(f.ToString(1));
}

! max. Feuchte heute berechnen
if (f > fmaxheute.Value())
{
  fmaxheute.Variable(f.ToString(1));
}

! min./max. Feuchte heute zusammenfasssen
dom.GetObject("Feuchte heute").Variable(dom.GetObject("min. Feuchte heute").Value() # " ... " # dom.GetObject("max. Feuchte heute").Value());


! rel. Luftdruck innen holen *****************************************
var q = dom.GetObject("rel. Luftdruck").Value();
var p = q * 1.0;

! Systemvariablen holen
var pminheute = dom.GetObject("min. rel. Luftdruck heute");
var pmaxheute = dom.GetObject("max. rel. Luftdruck heute");

! min. rel. Luftdruck heute berechnen
if (p < pminheute.Value())
{
  pminheute.Variable(p.ToString(1));
}

! max. rel. Luftdruck heute berechnen
if (p > pmaxheute.Value())
{
  pmaxheute.Variable(p.ToString(1));
}

! min./max. Luftdruck heute zusammenfasssen
dom.GetObject("rel. Luftdruck heute").Variable(dom.GetObject("min. rel. Luftdruck heute").Value() # " ... " # dom.GetObject("max. rel. Luftdruck heute").Value());
Min/Max-Temperaturen/Feuchte/Luftdruck in "Gestern" sichern und zurücksetzen

Code: Alles auswählen

! min/max-Temperaturen/Feuchte/Luftdruck in Werte von gestern sichern und zurücksetzen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! min. Temperatur heute, Zeichenkette, °C
! max. Temperatur heute, Zeichenkette, °C
! min. Temperatur gestern, Zeichenkette, °C
! max. Temperatur gestern, Zeichenkette, °C
! Temperatur heute, Zeichenkette, °C
! Temperatur gestern, Zeichenkette, °C
!
! min. Feuchte heute, Zeichenkette, %
! max. Feuchte heute, Zeichenkette, %
! min. Feuchte gestern, Zeichenkette, %
! max. Feuchte gestern, Zeichenkette, %
! Feuchte heute, Zeichenkette, %
! Feuchte gestern, Zeichenkette, %
!
! min. rel. Luftdruck heute, Zeichenkette, hPa
! max. rel. Luftdruck heute, Zeichenkette, hPa
! min. rel. Luftdruck gestern, Zeichenkette, hPa
! max. rel. Luftdruck gestern, Zeichenkette, hPa
! rel. Luftdruck heute, Zeichenkette, hPa
! rel. Luftdruck gestern, Zeichenkette, hPa

!**********************************************************************

! Systemvariablen holen
var tminheute = dom.GetObject("min. Temperatur heute");
var tmaxheute = dom.GetObject("max. Temperatur heute");
var tmingestern = dom.GetObject("min. Temperatur gestern");
var tmaxgestern = dom.GetObject("max. Temperatur gestern");

var fminheute = dom.GetObject("min. Feuchte heute");
var fmaxheute = dom.GetObject("max. Feuchte heute");
var fmingestern = dom.GetObject("min. Feuchte gestern");
var fmaxgestern = dom.GetObject("max. Feuchte gestern");

var pminheute = dom.GetObject("min. rel. Luftdruck heute");
var pmaxheute = dom.GetObject("max. rel. Luftdruck heute");
var pmingestern = dom.GetObject("min. rel. Luftdruck gestern");
var pmaxgestern = dom.GetObject("max. rel. Luftdruck gestern");

! Temperatur außen holen
!var t = dom.GetObject(3336).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("TEMPERATURE").Value();

tmingestern.State(tminheute.Value());
tmaxgestern.State(tmaxheute.Value());
tminheute.State(t.ToString(1));
tmaxheute.State(t.ToString(1));

! min/max Kombiwert nach gestern kopieren
dom.GetObject("Temperatur gestern").Variable(dom.GetObject("Temperatur heute").Value());


! rel. Feuchte außen holen
!var f = dom.GetObject(3332).Value();
var f = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("HUMIDITY").Value();

fmingestern.State(fminheute.Value());
fmaxgestern.State(fmaxheute.Value());
fminheute.State(f.ToString(1));
fmaxheute.State(f.ToString(1));

! min/max Kombiwert nach gestern kopieren
dom.GetObject("Feuchte gestern").Variable(dom.GetObject("Feuchte heute").Value());


! rel. Luftdruck innen holen
var p = dom.GetObject("rel. Luftdruck").Value();

pmingestern.State(pminheute.Value());
pmaxgestern.State(pmaxheute.Value());
pminheute.State(p.ToString(1));
pmaxheute.State(p.ToString(1));

! min/max Kombiwert nach gestern kopieren
dom.GetObject("rel. Luftdruck gestern").Variable(dom.GetObject("rel. Luftdruck heute").Value());
Dieser "Rücksetz-Code" muss zu einem bestimmten Zeitpunkt gestartet werden:
MinMax-Temperaturen, Feuchte, Luftdruck umkopieren und zurücksetzen.png
Man könnte das natürlich auch erweitern, indem man noch ein wöchentliches/monatliches Rücksetzen hinzufügt.

Relativen Luftdruck berechnen
Der relative Luftdruck wird über die Internationale Höhenformel berechnet: prel = f(pabs, h, T). Ihr könnt sie hier finden:
https://de.wikipedia.org/wiki/Barometri ... 6henformel
Die Standorthöhe h eures Luftdrucksensors könnt ihr sehr gut über Google Maps bestimmen (sicherheitshalber auf Plausiblität mit Alternativdaten prüfen) und damit h mit dem korrekten Wert setzen.

Code: Alles auswählen

! relativen Luftdruck berechnen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! rel. Luftdruck, Zeichenkette, hPa

!**********************************************************************

! Höhe des Standorts in m
var h = 255;

! Temperatur innen holen
!var t = dom.GetObject(3120).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Messwerte Wohnzimmer").DPByHssDP("TEMPERATURE").Value();

! abs. Druck innen holen
!var p = dom.GetObject(3118).Value();
var p = dom.GetObject(ID_CHANNELS).Get("Messwerte Wohnzimmer").DPByHssDP("AIR_PRESSURE").Value();

! Systemvariable holen
var pr = dom.GetObject("rel. Luftdruck");

! berechnen
var x = 1.0 - ((0.0065*h)/(273.15+t));
x = (1.0 * p) / x.Pow(5.255);

pr.Variable(x.ToString(1));

Taupunkte berechnen
Der Taupunkt berechnet sich aus der Temperatur und rel. Feuchte. Die Formel findet ihr hier: https://de.wikipedia.org/wiki/Taupunkt
Ich verwende die Näherung anhand der Magnus-Formel (Formel 15 im Artikel ganz unten).
Hier das Beispiel für den Taupunkt innen, ich habe hier zwei Skripte daraus gemacht (entsprechend Kommentare setzen).

Code: Alles auswählen

! Taupunkt innen berechnen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! Taupunkt innen, Zeichenkette, °C

!**********************************************************************

! Temperatur innen holen
!var t = dom.GetObject(3120).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Messwerte Wohnzimmer").DPByHssDP("TEMPERATURE").Value();

! Temperatur außen holen
!var t = dom.GetObject(3336).Value();
!var t = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("TEMPERATURE").Value();

! rel. Feuchte innen holen
!var f = dom.GetObject(3119).Value();
var f = dom.GetObject(ID_CHANNELS).Get("Messwerte Wohnzimmer").DPByHssDP("HUMIDITY").Value();

! rel. Feuchte außen holen
!var f = dom.GetObject(3332).Value();
!var f = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("HUMIDITY").Value();

! Systemvariable holen
var tp = dom.GetObject("Taupunkt innen");
!var tp = dom.GetObject("Taupunkt außen");

! berechnen
var k2 = 17.62;
var k3 = 243.12;
var p = (1.0 * f) / 100;
var z = ((k2*t) / (k3+t)) + p.Log();
var n = ((k2*k3) / (k3+t)) - p.Log();
var x = k3 * (z/n);

if ((t < -45) || (t > 60))
{
  tp.Variable("-----");
}
else 
{
  tp.Variable(x.ToString(1));
}
Hitzeindex berechnen
Die Formel für den Hitzeindex findet ihr hier: https://de.wikipedia.org/wiki/Hitzeindex
Sie gilt nur für Temperaturen größer gleich 26,7°C und einer relativen Feuchte größer gleich 40%.

Code: Alles auswählen

! Hitzeindex berechnen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! Hitzeindex, Zeichenkette, °C

!**********************************************************************

! Temperatur holen
!var t = dom.GetObject(3336).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("TEMPERATURE").Value();

! rel. Feuchte holen
!var f = dom.GetObject(3332).Value();
var f = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("HUMIDITY").Value();

! Systemvariable holen
var h = dom.GetObject("Hitzeindex");

! berechnen
var x = -8.784695 + (1.61139411*t) + (2.338549*f) + (-0.14611605*t*f) + ((-1.2308094/100)*t.Pow(2)) + ((-1.6424828/100)*f.Pow(2)) + ((2.211732/1000)*t.Pow(2)*f) + ((7.2546/10000)*t*f.Pow(2)) + ((-3.582/1000000)*t.Pow(2)*f.Pow(2));

if ((t < 26.7) || (f < 40))
{
  h.Variable("-----");
}
else 
{
  h.Variable(x.ToString(1));
}
Windchill berechnen
Die Formel für die Windchill-Temperatur findet ihr hier: https://de.wikipedia.org/wiki/Windchill
Sie gilt nur für Lufttemperaturen kleiner gleich 10°C und Windgeschwindigkeiten größer gleich 5 km/h. Dies ist im Code berücksichtigt.

Code: Alles auswählen

! Windchill-Temperatur berechnen
! (c) 2018 by Uwe Hahn

! folgende Systemvariablen müssen angelegt sein:
! Name, Variablentyp, Maßeinheit                    
!
! Windchill, Zeichenkette, °C

!**********************************************************************

! Temperatur holen
!var t = dom.GetObject(3336).Value();
var t = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("TEMPERATURE").Value();

! Windgeschwindigkeit holen
!var v = dom.GetObject(3339).Value();
var v = dom.GetObject(ID_CHANNELS).Get("Kombisensor Garten").DPByHssDP("WIND_SPEED").Value();

! Systemvariable holen
var w = dom.GetObject("Windchill");

! berechnen
var x = 13.12 + (0.6215*t) + ((0.3965*t)-11.37)*v.Pow(0.16);

if ((t > 10) || (v < 5))
{
  w.Variable("-----");
}
else 
{
  w.Variable(x.ToString(1));
}
Hier die Übersicht über alle angelegten Variablen:
Variablen.png
Hier der Aufruf der Skripte:
Wetterdaten berechnen.png
So sieht das ganze in der TinyMatic App aus:
TinyMatic Screenshot.jpg
Da die min/max-Berechnungen der Temperatur innen/außen/Feuchte/Luftdruck für heute/gestern/letzte/Woche etc. sehr schnell eine riesige Liste an Werten erzeugen, habe ich die min/max-Werte in einer Variablen in der Form "min...max" zusammengefasst, die Variablen für die Vergleiche aber "im Hintergrund" gelassen.

Die Formatierung aller Werte auf eine Nachkommastelle mit ToString(1) ist völlig ausreichend.

Noch ein Tipp: Bei den Systemvariablen immer die Einheit angeben. Das Grad Celsius (°C) wird in der TinyMatic sonst nicht korrekt dargestellt,
also ein 27°C...35°C ist nicht möglich. Auch eine zweizeilige Darstellung (in den String \n einfügen) funktioniert nur in der Weboberfläche, TinyMatic ignoriert es. Andererseits werden auf der Weboberfläche wohl grundsätzlich keine Einheiten dargestellt.

Die Sensoren werden über den Kanalnamen + Datenpunktbezeichnung angesprochen. Alternativ könnt ihr die ID verwenden (auskommentiert).

Viele Grüße
Uwe
Zuletzt geändert von Uwe Hahn am 10.08.2018, 17:26, insgesamt 8-mal geändert.

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Beitrag von NickHM » 28.07.2018, 11:08

Hallo

vielen Dank für die Beispiele. Das können sicherlich viele brauchen.

3 Anmerkungen

- die Sysvar als Bild gehen zwar auch, wären aber als Kommentar am Anfang des jeweiligen Scriptes schöner. Dann muss man nur das Script abspeicher (aufheben) und nicht noch das Bild zusätzlich. Ausserdem kann man später über "Programme drucken" das Script ausdrucken und die benötigten SysVar sind als Kommentar inclusive :)

- die IDs ... Da steht zwar der Hinweis, dass die IDs angepasst werden müssen, aber das kann den Anfänger überfordern und es passieren Fehler, weil die ID mehrfach im Script benutzt wird.
Besser wäre es aus dem Geräte (Kanalnamen) am Anfang des Sciptes die ID zu ermitteln und dann als Variable im gesamten Script weiter zu benutzen. Gleich am Anfang des Scriptes einen Gerätenamen zu ändern bekommt noch jeder hin. Und bei vielen hier veröffentlichten Scripten ist das auch so gelöst. Nach den einführenden Zeilen kommt dann meist ein --------------- ab hier nichts verändern ---------

- da sind doch "Test" Einträge, die eigentlich weg können.

Danke nochmal für die Veröffentlichung

Uwe Hahn
Beiträge: 2
Registriert: 28.07.2018, 08:51
Danksagung erhalten: 1 Mal

Re: MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Beitrag von Uwe Hahn » 10.08.2018, 11:09

Hallo NickHM,

sorry, dass ich mich erst jetzt melde. Es ist Urlaubszeit und da konnte ich nicht so schnell antworten. Vielen Dank für deine Hinweise!
Dazu hätte ich noch eine Frage, bevor ich den Post korrigiere:

Wie ersetzt man elegant die IDs? Ich verwende die Datenpunkt-IDs eines device. Hier der Ausschnitt über die Datenstruktur meiner WDC-7000 Wetterstation:
Unbenannt.PNG
Ich hole die Innenraumtemperatur derzeit über:

Code: Alles auswählen

var t = dom.GetObject(3120).Value();
Wie würdest du es schreiben?

Viele Grüße
Uwe

nimmnenkeks
Beiträge: 453
Registriert: 30.11.2016, 20:24
Hat sich bedankt: 43 Mal
Danksagung erhalten: 19 Mal

Re: MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Beitrag von nimmnenkeks » 10.08.2018, 13:16

Servus,

bin zwar nicht NickHM, aber

alchy hat dazu mal ein Skript veröffentlicht, um die Datenpunkte auszulesen:
viewtopic.php?f=31&t=30127&p=273730&hil ... en#p273730

Damit benötigt man keine Zusatsoftware auf der CCU.

und mit z.B.

Code: Alles auswählen

var x = dom.GetObject("BidCos-oder-HmIP.xxxxxxxxxxxxxx:Kanal.Datenpunkt").Value();
! Beispiel:
[code]var x = dom.GetObject("HmIP-RF.1234567891011:Kanal.ACTUAL_TEMPERATURE").Value();
holst Du dann den benötigten DP-Wert (im Beispiel aktuelle Temperatur) statt über die ID

Die genutzte SysVar evtl. mit:

Code: Alles auswählen

dom.GetObject(ID_SYSTEM_VARIABLES).Get("SysVar");

Gruß

..

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: MinMax-Temperaturen/Feuchte/Luftdruck, rel. Luftdruck, Taupunkte, Windchill, Hitzeindex berechnen

Beitrag von NickHM » 10.08.2018, 13:18

hallo

falls Du einen Stromzähler oder Gaszähler hast, sieh Dir mal die automatisch generierten SysInternen Scripte an. Da ist am Anfang zu sehen, wie man über Objekte einmalig ein konkretes Gerät definiert und dann im gesamten Script weiter verwendet.
Die ID muss nur ein mal am Anfang des Scriptes eingetragen werden.

Ich komme im Moment nicht an meine CCU.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“