AT um eine Temperaturabhängige Nachtabsenkung zu realisieren

Aus FHEMWiki
Zur Navigation springen Zur Suche springen

Für die Grundlegende Funktion von at bitte einen Blick in die commandref/at 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, 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.