AT um eine Temperaturabhängige Nachtabsenkung zu realisieren: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
K (Wikifiziert)
Zeile 1: Zeile 1:
'''Für die Grundlegende Funktion von ''AT''bitte einen Blick in die [http://fhem.de/commandref.html#at Commandref] werfen'''
'''Für die Grundlegende Funktion von [[at]] bitte einen Blick in die [http://fhem.de/commandref.html#at Commandref] werfen'''


<ins>Zielvorgabe:</ins>
<ins>Zielvorgabe:</ins>
Zeile 5: Zeile 5:
Jeden Tag um 22:30 soll die Temperatur auf 17° abgesenkt werden (hier das FHEM-Gerät "wz_Heizung") wenn die Temperatur vorher über 17° eingestellt war - war die Temperatur vorher niedriger eingestellt war soll nichts passieren.
Jeden Tag um 22:30 soll die Temperatur auf 17° abgesenkt werden (hier das FHEM-Gerät "wz_Heizung") wenn die Temperatur vorher über 17° eingestellt war - war die Temperatur vorher niedriger eingestellt war soll nichts passieren.


Der Befehl für die [[Konfiguration]] lautet dazu wie folgt:


Der Befehl für die ''fhem.cfg'' lautet dazu wie folgt:
Einzeiler:


Einzeiler:
:<code>define wz_HeizungNachtabsenkung at 22:30:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0) {fhem(&quot;set wz_Heizung desired-temp 17.0&quot;)} }</code>


<pre>
define wz_HeizungNachtabsenkung at 22:30:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0) {fhem(&quot;set wz_Heizung desired-temp 17.0&quot;)} }
</pre>
Mehrzeiler:
Mehrzeiler:


Zeile 26: Zeile 24:
* ''if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0'' =&gt; ... ob ''(ReadingsVal -&gt; lese Werte)'' ...<br>''('wz_Heizung', 'desired-temp', 0)''=&gt; ... ob am Gerät ''wz_Heizung''der Wert ''desired-temp''...<br>''&gt; 17.0''=&gt; ... größer als 17.0 ist, wenn ja dann ...
* ''if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0'' =&gt; ... ob ''(ReadingsVal -&gt; lese Werte)'' ...<br>''('wz_Heizung', 'desired-temp', 0)''=&gt; ... ob am Gerät ''wz_Heizung''der Wert ''desired-temp''...<br>''&gt; 17.0''=&gt; ... größer als 17.0 ist, wenn ja dann ...
* ''fhem("set wz_Heizung desired-temp 17.0")'' =&gt; ... soll FHEM am Gerät ''wz_Heizung'' den Wert ''desired-temp'' auf 17.0° setzen.
* ''fhem("set wz_Heizung desired-temp 17.0")'' =&gt; ... soll FHEM am Gerät ''wz_Heizung'' den Wert ''desired-temp'' auf 17.0° setzen.


'''Anmerkung zu ReadingsVal:'''
'''Anmerkung zu ReadingsVal:'''

Version vom 23. Mai 2014, 11:16 Uhr

Für die Grundlegende Funktion von at bitte einen Blick in die Commandref werfen

Zielvorgabe:

Jeden Tag um 22:30 soll die Temperatur auf 17° abgesenkt werden (hier das FHEM-Gerät "wz_Heizung") wenn die Temperatur vorher über 17° eingestellt war - war die Temperatur vorher niedriger eingestellt war soll nichts passieren.

Der Befehl für die Konfiguration lautet dazu wie folgt:

Einzeiler:

define wz_HeizungNachtabsenkung at 22:30:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) > 17.0) {fhem("set wz_Heizung desired-temp 17.0")} }

Mehrzeiler:

define wz_HeizungNachtabsenkung at 22:30:00 {\
 if(ReadingsVal('wz_Heizung', 'desired-temp', 0) > 17.0) {\
  fhem("set wz_Heizung desired-temp 17.0")\
 }\
}

Im Detail:

  • define wz_HeizungNachtabsenkung => lege ein neues Objekt wz_HeizungNachtabsenkung und ...
  • at *22:30:00 => ... prüfe täglich um 22:30 Uhr ...
  • if(ReadingsVal('wz_Heizung', 'desired-temp', 0) > 17.0 => ... ob (ReadingsVal -> lese Werte) ...
    ('wz_Heizung', 'desired-temp', 0)=> ... ob am Gerät wz_Heizungder Wert desired-temp...
    > 17.0=> ... größer als 17.0 ist, wenn ja dann ...
  • fhem("set wz_Heizung desired-temp 17.0") => ... soll FHEM am Gerät wz_Heizung den Wert desired-temp auf 17.0° setzen.

Anmerkung zu ReadingsVal:

ReadingsVal(<DeviceName>, <ReadingsName>, <Defaultwert>)

Damit wird das entsprechende Reading am entsprechenden Device ausgelesen. Gibt es das Reading nicht, wird Defaultwert zurückgegeben.

Man kann Prozedurergebnisse (wie dieses von ReadingsVal) und Variablen bei Vergleichen natürlich mischen, und muss diese Ergebnisse nicht unbedingt in Variablen zwischenspeichern. Das tut man meistens nur, wenn das Ermitteln viel Zeit in Anspruch nimmt und man diesen mehrfach benötigt, oder der Wert durch Überschreiben verloren geht.

Perl hat als Besonderheit, dass man einer Variablen nicht ansieht, ob sie eine Zahl oder einen String enthält. Das sind alles sogenannte Skalare (im Gegensatz zu Arrays oder Hashlisten). Um bei einem Vergleich aber die durchaus unterschiedlichen Ergebnisse erzwingen zu können, gibt es eben unterschiedliche Operatoren dafür:

<, >, <=, >=, ==, != sind numerische Operatoren
lt, gt, le, ge, eq, ne sind die entsprechenden Stringvergleichsoperatoren

Beispiel:

my $var1 = '10';
my $var2 = '2';
# Ergibt true:
if ($var1 > $var2)...
# Ergibt false:
if ($var1 gt $var2)...

Für weitere Beispiele bietet es sich an auch mal einen Blick in die fhem.pl zu werfen.