Dewpoint: Unterschied zwischen den Versionen
JoeAll (Diskussion | Beiträge) (Code korrigiert) |
K (Link auf "Modul patch" korrigiert) |
||
(9 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
|ModPurpose=Berechnung des Taupunkts | |ModPurpose=Berechnung des Taupunkts | ||
|ModType=h | |ModType=h | ||
|ModForumArea=Automatisierung | |||
|ModCmdRef=dewpoint | |ModCmdRef=dewpoint | ||
|ModTechName=98_dewpoint.pm | |ModTechName=98_dewpoint.pm | ||
|ModOwner= | |ModOwner={{Link2FU|25475|hotbso}}}} | ||
Das Modul [[dewpoint]] bietet Funktionen im Zusammenhang mit der Taupunktberechnung an. Die verfügbaren Funktionen, über einen Parameter bei der Definition gesteuert, sind | |||
* dewpoint (Taupunkt) | |||
* fan (erzeugt ein Event, das zur Lüftersteuerung verwendet werden kann) | |||
* alarm (erzeugt einen "Schimmel-Alarm", wenn eine Referenztemperatur unter den Taupunkt fällt) | |||
== Voraussetzungen == | |||
{{Randnotiz|RNTyp=y|RNText='''Änderungen ab 10/2017''' | |||
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul | Es wurden einige Änderungen an der Funktionsweise des Moduls vorgenommen, u. A. damit das Modul nicht mehr den Status anderer Devices ändern muss. | ||
Darüber hinaus wird mittlerweile empfohlen, die über '''"T H D"''' gesteuerten "Sonderfunktionen" nicht mehr zu benutzen, sondern die gewünschten Werte im Internal ''STATE'' über das Attribut '''stateFormat''' zu bewirken. | |||
Die Auswirkungen dieser Änderungen sind (Stand Nov. 2022) noch nicht vollständig in diese Seite übernommen!}} | |||
Es muss ein Device geben, das die zur Berechnung erforderlichen Basisdaten ''Temperatur'' und ''Feuchte'' liefert. Die Namen der entsprechenden Readings können bei der Definition des ''dewpoint'' Device angegeben werden. | |||
== Anwendung == | |||
=== Define === | |||
Ein ''dewpoint'' Device (siehe auch {{Link2CmdRef|Anker=dewpoint}}) wird definiert mit: | |||
:<code>define <name> dewpoint <type> ...</code> | |||
Mögliche Werte und Bedeutung von | |||
;type | |||
*dewpoint - aus ''temp_name'' und ''hum_name'' wird der Taupunkt berechnet und als Reading mit dem Namen ''new_name'' an die durch ''devicename-regex'' spezifizierten Devices hinzugefügt | |||
*fan - | |||
*alarm - | |||
Die vollständige Syntax für den Typ ''dewpoint'': | |||
:<code>define <name> dewpoint '''dewpoint''' <devicename-regex> [<temp_name> <hum_name> <new_name>]</code> | |||
wobei die Platzhalter folgende Bedeutung haben: | |||
;name | |||
:der Name des definierten ''dewpoint'' Device | |||
;devicename-regex | |||
:Spezifikation des Geräts / der Geräte, von denen ''temp_name'' und ''hum_name'' gelesen und ''new_name'' geschrieben werden soll | |||
;temp_name | |||
:Name des Readings, das den Temperaturwert enthält; wenn dieser Parameter nicht angegeben ist, wird ''temperature'' angenommen | |||
;hum_name | |||
:Name des Readings, das den Feuchtewert enthält; wenn dieser Parameter nicht angegeben ist, wird ''humidity'' angenommen | |||
;new_name | |||
:Name des Readings, das den berechneten Taupunkt aufnehmen soll; wenn dieser Parameter nicht angegeben ist, wird ''dewpoint'' angenommen | |||
==== Statuszeile ==== | |||
Will man den Taupunkt nicht als einzelnes Reading ''dewpoint'', sondern in Kurzform zusammen mit den anderen Werten in der Statuszeile anzeigen lassen, so muss man für ''temp_name'' und ''hum_name'' die Spezialwerte ''T'' und ''H'' angeben: | |||
:<code>define dew_state dewpoint dewpoint .* T H D</code> | |||
Dies bewirkt, dass bei allen abgefragten Geräten die Werte ''T'' und ''H'' aus der Statuszeile ausgelesen werden und selbige dann wie folgt um den Taupunkt mit dem Buchstaben ''D'' erweitert wird: | |||
<pre>T: 18.2 H: 55 D: 9.0</pre> | |||
=== Attribute === | |||
;absoluteHumidity | |||
:Beim Setzen dieses Attributs wird zusätzlich die absolute Luftfeuchtigkeit (in Gramm Wasser pro Kubikmeter Luft) berechnet und als Reading mit dem Namen ''absoluteHumidity'' ausgegeben. Hat man das Dewpoint-Device vorher so definiert, dass es den Taupunkt an den Status anhängt: | |||
:<code>define dew_state dewpoint dewpoint .* T H D</code> | |||
:<code>attr dew_state absoluteHumidity 1</code> | |||
:dann braucht man nichts weiter zu tun, die absolute Feuchtigkeit wird ab sofort unter dem Buchstaben ''A'' an den Status angehängt: | |||
:<pre>T: 18.2 H: 55 D: 9.0 A: 8.5</pre> | |||
:Für den Taupunkt konnte man mit dem Parameter ''new_name'' einen eigenen Namen für das erzeugten Reading festlegen. Für die absolute Luftfeuchte ist dieser Parameter nicht vorhanden, das Reading hat immer den Standardnamen ''absoluteHumidity'' bzw. ''A'' in der Statuszeile. | |||
== Anwendungsbeispiele == | |||
== Alternativen zu diesem Modul == | |||
=== Berechnung direkt im userReading === | |||
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul ''dewpoint'' auch das folgende userReading gesetzt werden (der Code dazu wurde direkt aus dem Modul entnommen und ist so über das Webinterface einzugeben). | |||
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten. | Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten. | ||
<syntaxhighlight lang="perl"> | |||
attr <Device> userReadings dew:temperature.* { | |||
my $dp; | |||
my $temperature = ReadingsVal($name,"temperature",0); | |||
my $humidity = ReadingsVal($name,"humidity",0); | |||
my $A = 17.2694; | |||
my $B = ($temperature > 0) ? 237.3 : 265.5; | |||
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) ); | |||
my $e = $humidity/ 100 * $es; | |||
if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity"; | |||
return 0; | |||
} | |||
my $e1 = $e / 610.78; | |||
my $f = log( $e1 ) / $A; | |||
my $f1 = 1 - $f; | |||
if ($f1 == 0) { | |||
Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity"; | |||
return 0; | |||
} | |||
$dp = $B * $f / $f1 ; | |||
sprintf "%.2f", $dp; | |||
}</syntaxhighlight> | |||
=== Variante über 99_myUtils === | |||
Noch besser ist es, die im vorigen Abschnitt durchgeführte Berechnung nicht für jedes Device per userReading wieder neu einzugeben, sondern diese einmalig als Funktion in der 99_myUtils zu hinterlegen und diese dann im jeweiligen Device im userReading nur noch aufzurufen. | |||
Dazu ist in der 99_myUtils folgende sub anzulegen: | |||
<syntaxhighlight lang="perl"> | |||
sub urDewpoint | |||
{ | |||
my ($dname,$tname,$hname) = @_; | |||
#Prüfen, ob überhaupt ein Device(-name) als Parameter übergeben wurde | |||
if(!defined($dname)) { | |||
Log3 undef,1,"Error: urDewpoint - No device specified!"; | |||
return 0; | |||
} | |||
#Prüfen, ob das angegebene Device überhaupt existiert | |||
if(!$defs{$dname}) { | |||
Log3 undef,1,"Error: urDewpoint - Device $dname is not defined!"; | |||
return 0; | |||
} | |||
#Wenn keine Readingsnamen für die Temperatur oder Luftfeuchtigkeit | |||
#übergebenwurde wird per default temperature oder humidity verwendet | |||
$tname='temperature' if(!defined($tname)); | |||
$hname='humidity' if(!defined($hname)); | |||
my $dp; | |||
#Auslesen der Readingswerte für Temperatur und Luftfeuchtigkeit aus den | |||
#entsprechenden Readings des Devic | |||
my $temperature = ReadingsVal($dname,$tname,0); | |||
my $humidity = ReadingsVal($dname,$hname,0); | |||
#Magische Berechnung :) | |||
my $A = 17.2694; | |||
my $B = ($temperature > 0) ? 237.3 : 265.5; | |||
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) ); | |||
my $e = $humidity/ 100 * $es; | |||
if ($e == 0) { | |||
Log3 undef,1, "Error: urDewpoint: $dname - e==0: temp=$temperature, hum=$humidity"; | |||
return 'ERR'; | |||
} | |||
my $e1 = $e / 610.78; | |||
my $f = log( $e1 ) / $A; | |||
my $f1 = 1 - $f; | |||
if ($f1 == 0) { | |||
Log3 undef,1, "Error: urDewpoint: $dname - (1-f)==0: temp=$temperature, hum=$humidity"; | |||
return 'ERR'; | |||
} | |||
$dp = $B * $f / $f1 ; | |||
#Rückgabe der Taupunkt-Temperatur | |||
return sprintf "%.2f", $dp; | |||
} | |||
</syntaxhighlight> | |||
Anschließend kann dann im jeweiligen Device ganz einfach ein userReading definiert werden: | |||
<syntaxhighlight lang="perl"> | |||
attr <Device> userReadings dew:temperature.* {urDewpoint($name)} | |||
</syntaxhighlight> | |||
Die Readings-Namen für Temperatur und Luftfeuchtigkeit bei Device können bei Bedarf auch abweichend angegeben werden. Bei den HomeMatic-Wandthermostaten heißt das Reading für die tatsächlich gemessene Temperatur measured-temp und nicht temperature, dann würde die Definition des userReading wie folgt aussehen: | |||
<syntaxhighlight lang="perl"> | |||
attr <Device> userReadings dew:measured-temp.* {urDewpoint($name,'measured-temp')}</syntaxhighlight> | |||
== Links == | == Links == | ||
* ab 10/2017: {{Link2Forum|Topic=78359|LinkText=Änderungen im Modul}} | |||
* Forendiskussion um {{Link2Forum|Topic=8576|LinkText=Lüften oder nicht}} | * Forendiskussion um {{Link2Forum|Topic=8576|LinkText=Lüften oder nicht}} | ||
* Forendiskussion um {{Link2Forum|Topic=23080|LinkText=Temperaturdifferenz}} | * Forendiskussion um {{Link2Forum|Topic=23080|LinkText=Temperaturdifferenz}} | ||
[[Kategorie:HOWTOS]] | [[Kategorie:HOWTOS]] |
Aktuelle Version vom 6. November 2022, 16:28 Uhr
dewpoint | |
---|---|
Zweck / Funktion | |
Berechnung des Taupunkts | |
Allgemein | |
Typ | Hilfsmodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | Automatisierung |
Modulname | 98_dewpoint.pm |
Ersteller | hotbso |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das Modul dewpoint bietet Funktionen im Zusammenhang mit der Taupunktberechnung an. Die verfügbaren Funktionen, über einen Parameter bei der Definition gesteuert, sind
- dewpoint (Taupunkt)
- fan (erzeugt ein Event, das zur Lüftersteuerung verwendet werden kann)
- alarm (erzeugt einen "Schimmel-Alarm", wenn eine Referenztemperatur unter den Taupunkt fällt)
Voraussetzungen
Es wurden einige Änderungen an der Funktionsweise des Moduls vorgenommen, u. A. damit das Modul nicht mehr den Status anderer Devices ändern muss.
Darüber hinaus wird mittlerweile empfohlen, die über "T H D" gesteuerten "Sonderfunktionen" nicht mehr zu benutzen, sondern die gewünschten Werte im Internal STATE über das Attribut stateFormat zu bewirken.
Die Auswirkungen dieser Änderungen sind (Stand Nov. 2022) noch nicht vollständig in diese Seite übernommen!Es muss ein Device geben, das die zur Berechnung erforderlichen Basisdaten Temperatur und Feuchte liefert. Die Namen der entsprechenden Readings können bei der Definition des dewpoint Device angegeben werden.
Anwendung
Define
Ein dewpoint Device (siehe auch commandref/dewpoint) wird definiert mit:
define <name> dewpoint <type> ...
Mögliche Werte und Bedeutung von
- type
- dewpoint - aus temp_name und hum_name wird der Taupunkt berechnet und als Reading mit dem Namen new_name an die durch devicename-regex spezifizierten Devices hinzugefügt
- fan -
- alarm -
Die vollständige Syntax für den Typ dewpoint:
define <name> dewpoint dewpoint <devicename-regex> [<temp_name> <hum_name> <new_name>]
wobei die Platzhalter folgende Bedeutung haben:
- name
- der Name des definierten dewpoint Device
- devicename-regex
- Spezifikation des Geräts / der Geräte, von denen temp_name und hum_name gelesen und new_name geschrieben werden soll
- temp_name
- Name des Readings, das den Temperaturwert enthält; wenn dieser Parameter nicht angegeben ist, wird temperature angenommen
- hum_name
- Name des Readings, das den Feuchtewert enthält; wenn dieser Parameter nicht angegeben ist, wird humidity angenommen
- new_name
- Name des Readings, das den berechneten Taupunkt aufnehmen soll; wenn dieser Parameter nicht angegeben ist, wird dewpoint angenommen
Statuszeile
Will man den Taupunkt nicht als einzelnes Reading dewpoint, sondern in Kurzform zusammen mit den anderen Werten in der Statuszeile anzeigen lassen, so muss man für temp_name und hum_name die Spezialwerte T und H angeben:
define dew_state dewpoint dewpoint .* T H D
Dies bewirkt, dass bei allen abgefragten Geräten die Werte T und H aus der Statuszeile ausgelesen werden und selbige dann wie folgt um den Taupunkt mit dem Buchstaben D erweitert wird:
T: 18.2 H: 55 D: 9.0
Attribute
- absoluteHumidity
- Beim Setzen dieses Attributs wird zusätzlich die absolute Luftfeuchtigkeit (in Gramm Wasser pro Kubikmeter Luft) berechnet und als Reading mit dem Namen absoluteHumidity ausgegeben. Hat man das Dewpoint-Device vorher so definiert, dass es den Taupunkt an den Status anhängt:
define dew_state dewpoint dewpoint .* T H D
attr dew_state absoluteHumidity 1
- dann braucht man nichts weiter zu tun, die absolute Feuchtigkeit wird ab sofort unter dem Buchstaben A an den Status angehängt:
T: 18.2 H: 55 D: 9.0 A: 8.5
- Für den Taupunkt konnte man mit dem Parameter new_name einen eigenen Namen für das erzeugten Reading festlegen. Für die absolute Luftfeuchte ist dieser Parameter nicht vorhanden, das Reading hat immer den Standardnamen absoluteHumidity bzw. A in der Statuszeile.
Anwendungsbeispiele
Alternativen zu diesem Modul
Berechnung direkt im userReading
Um den Taupunkt einfach berechnen zu können, kann neben dem Modul dewpoint auch das folgende userReading gesetzt werden (der Code dazu wurde direkt aus dem Modul entnommen und ist so über das Webinterface einzugeben).
Das Userreading hat den Vorteil, nicht mit anderen Modulen in Konflikt zu geraten.
attr <Device> userReadings dew:temperature.* {
my $dp;
my $temperature = ReadingsVal($name,"temperature",0);
my $humidity = ReadingsVal($name,"humidity",0);
my $A = 17.2694;
my $B = ($temperature > 0) ? 237.3 : 265.5;
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );
my $e = $humidity/ 100 * $es;
if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";
return 0;
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";
return 0;
}
$dp = $B * $f / $f1 ;
sprintf "%.2f", $dp;
}
Variante über 99_myUtils
Noch besser ist es, die im vorigen Abschnitt durchgeführte Berechnung nicht für jedes Device per userReading wieder neu einzugeben, sondern diese einmalig als Funktion in der 99_myUtils zu hinterlegen und diese dann im jeweiligen Device im userReading nur noch aufzurufen.
Dazu ist in der 99_myUtils folgende sub anzulegen:
sub urDewpoint
{
my ($dname,$tname,$hname) = @_;
#Prüfen, ob überhaupt ein Device(-name) als Parameter übergeben wurde
if(!defined($dname)) {
Log3 undef,1,"Error: urDewpoint - No device specified!";
return 0;
}
#Prüfen, ob das angegebene Device überhaupt existiert
if(!$defs{$dname}) {
Log3 undef,1,"Error: urDewpoint - Device $dname is not defined!";
return 0;
}
#Wenn keine Readingsnamen für die Temperatur oder Luftfeuchtigkeit
#übergebenwurde wird per default temperature oder humidity verwendet
$tname='temperature' if(!defined($tname));
$hname='humidity' if(!defined($hname));
my $dp;
#Auslesen der Readingswerte für Temperatur und Luftfeuchtigkeit aus den
#entsprechenden Readings des Devic
my $temperature = ReadingsVal($dname,$tname,0);
my $humidity = ReadingsVal($dname,$hname,0);
#Magische Berechnung :)
my $A = 17.2694;
my $B = ($temperature > 0) ? 237.3 : 265.5;
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );
my $e = $humidity/ 100 * $es;
if ($e == 0) {
Log3 undef,1, "Error: urDewpoint: $dname - e==0: temp=$temperature, hum=$humidity";
return 'ERR';
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
Log3 undef,1, "Error: urDewpoint: $dname - (1-f)==0: temp=$temperature, hum=$humidity";
return 'ERR';
}
$dp = $B * $f / $f1 ;
#Rückgabe der Taupunkt-Temperatur
return sprintf "%.2f", $dp;
}
Anschließend kann dann im jeweiligen Device ganz einfach ein userReading definiert werden:
attr <Device> userReadings dew:temperature.* {urDewpoint($name)}
Die Readings-Namen für Temperatur und Luftfeuchtigkeit bei Device können bei Bedarf auch abweichend angegeben werden. Bei den HomeMatic-Wandthermostaten heißt das Reading für die tatsächlich gemessene Temperatur measured-temp und nicht temperature, dann würde die Definition des userReading wie folgt aussehen:
attr <Device> userReadings dew:measured-temp.* {urDewpoint($name,'measured-temp')}
Links
- ab 10/2017: Änderungen im Modul
- Forendiskussion um Lüften oder nicht
- Forendiskussion um Temperaturdifferenz