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());
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());
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));
}
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));
}
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));
}
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