Notify: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
= Notify, das mächtige Tool =
== Notify, das mächtige Tool ==
Ein Versuch, die Funktionsweise von Notify verständlich zu erklären.
Ein Versuch, die Funktionsweise von Notify verständlich zu erklären.
Da ich nur ein KNX (EIB) System habe, beziehen sich alle meine Beispiele auf KNX.
Da ich nur ein KNX (EIB) System habe, beziehen sich alle meine Beispiele auf KNX.
Zeile 12: Zeile 12:
Notify ist eine der mächtigsten Funktionen bei fhem. Sie dient dazu, Aktion abhängig von einem anderen Status auszulösen. Es ist damit möglich, Logikfunktionen im fhem abzubilden.
Notify ist eine der mächtigsten Funktionen bei fhem. Sie dient dazu, Aktion abhängig von einem anderen Status auszulösen. Es ist damit möglich, Logikfunktionen im fhem abzubilden.


Z.B.: das Licht in der Küche wird eingeschaltet ==> draus folgt, dass auch das Radio eingeschaltet wird.
Z.B.: das Licht in der Küche wird eingeschaltet ====> draus folgt, dass auch das Radio eingeschaltet wird.


== Syntax von notify ==
==== Syntax von notify ====
define <name> notify <pattern> <command>
define <name> notify <pattern> <command>


Zeile 25: Zeile 25:
Man kann auch mit Platzhaltern arbeiten.
Man kann auch mit Platzhaltern arbeiten.


* Rollo. => das notify reagiert auf alles was mit Rollo und ein weiteres Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg
* Rollo. ==> das notify reagiert auf alles was mit Rollo und ein weiteres Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg
* Rollo.* => das notify reagiert auf alles das mit Rollo...... beginnt.
* Rollo.* ==> das notify reagiert auf alles das mit Rollo...... beginnt.
* *isch => Reagiere auf alles das mit isch aufhört (Tisch, Fisch)
* *isch ==> Reagiere auf alles das mit isch aufhört (Tisch, Fisch)
== Etwas schalten, wenn ein anderes Gerät geschaltet wird ==
==== Etwas schalten, wenn ein anderes Gerät geschaltet wird ====
Wenn man das obige mit KNX abbilden möchte, benötigt man auf der KNX Seite:
Wenn man das obige mit KNX abbilden möchte, benötigt man auf der KNX Seite:


=== Vorbereitung ===
====== Vorbereitung ======
* Gruppenadresse (GA) für die Steckdose vom Radio (0/0/10)
* Gruppenadresse (GA) für die Steckdose vom Radio (0/0/10)
* GA vom Licht (0/0/20)
* GA vom Licht (0/0/20)
Zeile 39: Zeile 39:
* define RadioKueche EIB 0/0/10
* define RadioKueche EIB 0/0/10
* define LichtKueche EIB 0/0/20
* define LichtKueche EIB 0/0/20
=== notify Befehl ===
====== notify Befehl ======
  <nowiki>define LichtamRadioan notify LichtKueche { fhem "set RadioKueche&#160;%" }</nowiki>
  <nowiki>define LichtamRadioan notify LichtKueche { fhem "set RadioKueche&#160;%" }</nowiki>
oder
oder


  <nowiki>define LichtamRadioan notify LichtKueche set RadioKueche&#160;%</nowiki>
  <nowiki>define LichtamRadioan notify LichtKueche set RadioKueche&#160;%</nowiki>
=== Erklärung ===
====== Erklärung ======
* Der Begriff "LichtamRadioan" ist nur ein Platzhalter, damit es im fhem verwaltet werden kann.
* Der Begriff "LichtamRadioan" ist nur ein Platzhalter, damit es im fhem verwaltet werden kann.
* "%" ist ein Platzhalter für den Zustand vom Pattern. % enthält ein "off" wenn das LichtKueche aus ist und ein "on" wenn das Licht eingeschaltet ist.
* "%" ist ein Platzhalter für den Zustand vom Pattern. % enthält ein "off" wenn das LichtKueche aus ist und ein "on" wenn das Licht eingeschaltet ist.
* "{ &lt;perlcode&gt; }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort fhem dient dazu, fhem Befehle auszuführen. Es wird also der fhem Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche fhem Befehl muss in " " stehen.
* "{ &lt;perlcode&gt; }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort fhem dient dazu, fhem Befehle auszuführen. Es wird also der fhem Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche fhem Befehl muss in " " stehen.
== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ==
==== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ====
=== Vorbereitung ===
====== Vorbereitung ======
KNX:
KNX:


Zeile 59: Zeile 59:
* define Steckdose1 EIB 0/0/31
* define Steckdose1 EIB 0/0/31
* define Steckdose2 EIB 0/0/32
* define Steckdose2 EIB 0/0/32
=== notify Befehl ===
====== notify Befehl ======
  <nowiki>define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1&#160;%;;set Steckdose2&#160;%" }</nowiki>
  <nowiki>define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1&#160;%;;set Steckdose2&#160;%" }</nowiki>
oder
oder


  <nowiki>define SteckdoseWZein notify LichtWZ set Steckdose1,Steckdose2&#160;%</nowiki>
  <nowiki>define SteckdoseWZein notify LichtWZ set Steckdose1,Steckdose2&#160;%</nowiki>
=== Erklärung ===
====== Erklärung ======
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Steckdosen (1 und 2) eingeschaltet.
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Steckdosen (1 und 2) eingeschaltet.






== einfache ODER Funktion ==
==== einfache ODER Funktion ====
Eine einfache ODER Funktion kann sehr einfach Realisiert werden
Eine einfache ODER Funktion kann sehr einfach Realisiert werden


=== Vorbereitung ===
====== Vorbereitung ======
KNX:
KNX:


Zeile 82: Zeile 82:
define Steckdose EIB 0/0/42
define Steckdose EIB 0/0/42


=== notify Befehl ===
====== notify Befehl ======
  <nowiki>define SteckdoseWZein notify (Licht1|Licht2) set Steckdose&#160;%</nowiki>
  <nowiki>define SteckdoseWZein notify (Licht1|Licht2) set Steckdose&#160;%</nowiki>
oder
oder


  <nowiki>define SteckdoseWZein notify (Licht.) set Steckdose&#160;%</nowiki>
  <nowiki>define SteckdoseWZein notify (Licht.) set Steckdose&#160;%</nowiki>
=== Erklärung ===
====== Erklärung ======
Die Werte in der Klammer (wichtig ist das&#160;»|«) sind die Rückgabewerte. Alternatitv kann in diesem Beispiel auch&#160;»Licht.«&#160;(zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für ein Zeichen (kommt glaube ich von Perl)  
Die Werte in der Klammer (wichtig ist das&#160;»|«) sind die Rückgabewerte. Alternatitv kann in diesem Beispiel auch&#160;»Licht.«&#160;(zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für ein Zeichen (kommt glaube ich von Perl)  


Zeile 93: Zeile 93:
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"


== einfache UND Funktion ==
==== einfache UND Funktion ====
ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezeifeln.
ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezeifeln.
In fhem fehlen Logigfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).
In fhem fehlen Logigfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).
Zeile 100: Zeile 100:
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.


=== Vorbereitung ===
====== Vorbereitung ======
knx:
knx:


* 3x GDs für die Rückgabewert Rollo geschlossen = 1 (0/0/50 0/0/51 0/0/52)
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)
* GD LED am Lichtschalter (0/0/106)
* GD LED am Lichtschalter (0/0/106)


Zeile 117: Zeile 117:
Durch das Atribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.
Durch das Atribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.


=== notify Befehl ===
====== notify Befehl ======
  <nowiki>define nt.allerolloszu notify (R1ZU|R2ZU|R6ZU) {
  <nowiki>define nt.allerolloszu notify (R1ZU|R2ZU|R6ZU) {
my $r1 = $value{"R1ZU"};;
my $r1 == $value{"R1ZU"};;
my $r2 = $value{"R2ZU"};;
my $r2 == $value{"R2ZU"};;
my $r3 = $value{"R6ZU"};;
my $r3 == $value{"R6ZU"};;
  if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {
  if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {
   fhem "set LEDalleRolloZu on"
   fhem "set LEDalleRolloZu on"
Zeile 129: Zeile 129:
}</nowiki>
}</nowiki>


=== Erklärung ===
====== Erklärung ======
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet
Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }
Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }


  <nowiki>my $r1 =&gt; Variable $r1 definieren
  <nowiki>my $r1 ==&gt; Variable $r1 definieren
= $value{"R1ZU"};; =&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu</nowiki>
== $value{"R1ZU"};; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu</nowiki>


Der doppelte&#160;;; ist ein fhem Thema. Eigendlich würde für Perl ein&#160;; reichen. Aber fhem nutzt selbst das&#160;; und daher wird ein&#160;;; benötigt.
Der doppelte&#160;;; ist ein fhem Thema. Eigendlich würde für Perl ein&#160;; reichen. Aber fhem nutzt selbst das&#160;; und daher wird ein&#160;;; benötigt.
Zeile 145: Zeile 145:
ansonste else schalte die LED aus. {fhem("set LEDalleRolloZu off")
ansonste else schalte die LED aus. {fhem("set LEDalleRolloZu off")


== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ==
==== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ====
Hier ein kleines Beispiel, wie ich mit Hilfe meiner PV-Anlage die Sonneneinstrahlung auf der Südseite ermittele.
Hier ein kleines Beispiel, wie ich mit Hilfe meiner PV-Anlage die Sonneneinstrahlung auf der Südseite ermittele.
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)
Zeile 152: Zeile 152:




=== Vorbereitung ===
====== Vorbereitung ======
PV Anlage mit SolarView abfragen.
PV Anlage mit SolarView abfragen.
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schliesen.
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schliesen.


=== notify Syntax ===
====== notify Syntax ======
fhem:
fhem:


Zeile 174: Zeile 174:


  <nowiki>(sv:currentPower.*) {  
  <nowiki>(sv:currentPower.*) {  
my $hm = sprintf("%%02d:%%02d", $hour, $min);
my $hm == sprintf("%%02d:%%02d", $hour, $min);
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") {  
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") {  
  if (%EVTPART1 &lt; 5000 ) {
  if (%EVTPART1 &lt; 5000 ) {
Zeile 188: Zeile 188:


  <nowiki>(sv:currentPower.*) {  
  <nowiki>(sv:currentPower.*) {  
my $hm = sprintf("%%02d:%%02d", $hour, $min);
my $hm == sprintf("%%02d:%%02d", $hour, $min);
if( $month ge "6" &amp;&amp; $month le "9") {
if( $month ge "6" &amp;&amp; $month le "9") {
  if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") {  
  if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") {  
Zeile 201: Zeile 201:
  }
  }
}</nowiki>
}</nowiki>
=== Erklärung ===
====== Erklärung ======
* Das define wird im der Kommandozeile im Webbroser eingegeben.
* Das define wird im der Kommandozeile im Webbroser eingegeben.
* Anschliessend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl
* Anschliessend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl
* define sv SolarView ... &lt;== ist die Schnittstelle vom SolarView
* define sv SolarView ... &lt;==== ist die Schnittstelle vom SolarView
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &lt;== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { &lt;==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert
  <nowiki>if (%EVTPART1 &lt; 3000 ) {
  <nowiki>if (%EVTPART1 &lt; 3000 ) {
  fhem('set Flur1 Auf');
  fhem('set Flur1 Auf');
Zeile 218: Zeile 218:


Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".
Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".
Jetzt steht im "%EVTPART0 = currentPower:" und im "%EVTPART1 = 6000"
Jetzt steht im "%EVTPART0 == currentPower:" und im "%EVTPART1 == 6000"
Das bedeutet wir müssen uns nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken, das übernimmt fhem.
Das bedeutet wir müssen uns nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken, das übernimmt fhem.


Zeile 225: Zeile 225:
Damit dies nicht dauernd hin und her pendelt, habe ich den Auf Wert sehr klein und den Ab Wert sehr groß gewählt.
Damit dies nicht dauernd hin und her pendelt, habe ich den Auf Wert sehr klein und den Ab Wert sehr groß gewählt.


'''Optional 1:'''Der Block "my $hm = sprintf("%%02d:%%02d", $hour, $min);" erzeugt die Variable $hm mit dem Inhalt $hour:$min.&#160;%02d (wegen fhem besonderheit&#160;%%02d) begrenzt die Ausgabe auf zwei Stellen (hab jetzt hoffentlich nichts Falsches geschrieben).
'''Optional 1:'''Der Block "my $hm == sprintf("%%02d:%%02d", $hour, $min);" erzeugt die Variable $hm mit dem Inhalt $hour:$min.&#160;%02d (wegen fhem besonderheit&#160;%%02d) begrenzt die Ausgabe auf zwei Stellen (hab jetzt hoffentlich nichts Falsches geschrieben).
Danach wird mit "if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") " geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt. lt = kleiner als; gt größer als. Es wäre auch ein le und ge möglich: le = kleiner/gleich als, ge = größer/gleich als.
Danach wird mit "if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") " geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt. lt == kleiner als; gt größer als. Es wäre auch ein le und ge möglich: le == kleiner/gleich als, ge == größer/gleich als.


'''Optional 2:'''if( $month ge "6" &amp;&amp; $month le "9") {
'''Optional 2:'''if( $month ge "6" &amp;&amp; $month le "9") {
Zeile 234: Zeile 234:
Und dann auch nur zwischen 9:31 und 16:59.
Und dann auch nur zwischen 9:31 und 16:59.


== Hinweise ==
==== Hinweise ====
Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreib muss man anscheinend darauf achten, dass keine abschliessende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.
Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreib muss man anscheinend darauf achten, dass keine abschliessende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.
== Weiterführende Links ==
[[Escapen in Perlbefehlen]]
[[Klammerebnen]]


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Version vom 30. November 2013, 19:11 Uhr

Notify, das mächtige Tool

Ein Versuch, die Funktionsweise von Notify verständlich zu erklären. Da ich nur ein KNX (EIB) System habe, beziehen sich alle meine Beispiele auf KNX.

Bitte Fehler verbessern.

WICHTIG: per Web editieren und den DEF Knopf benutzten. Damit wird der Perlcode einfacher.


Was ist notify? Notify ist eine der mächtigsten Funktionen bei fhem. Sie dient dazu, Aktion abhängig von einem anderen Status auszulösen. Es ist damit möglich, Logikfunktionen im fhem abzubilden.

Z.B.: das Licht in der Küche wird eingeschaltet ====> draus folgt, dass auch das Radio eingeschaltet wird.

Syntax von notify

define <name> notify <pattern> <command>

Das Pattern ist sehr wichtig. Hier steht der Name von einer Definition auf den das notify reagiert. Wenn da z.B. Rollo1 steht, dann reagiert notify auf Rollo1 on und off und was es sonst noch alles gibt.

Wenn man mehrere Pattern möchte, so kann man diese in Klammer schreiben (Rollo1|Rollo2|Steckdose5) als Trenner wird dann Pipe (|) genutzt.

Man kann auch mit Platzhaltern arbeiten.

  • Rollo. ==> das notify reagiert auf alles was mit Rollo und ein weiteres Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg
  • Rollo.* ==> das notify reagiert auf alles das mit Rollo...... beginnt.
  • *isch ==> Reagiere auf alles das mit isch aufhört (Tisch, Fisch)

Etwas schalten, wenn ein anderes Gerät geschaltet wird

Wenn man das obige mit KNX abbilden möchte, benötigt man auf der KNX Seite:

Vorbereitung
  • Gruppenadresse (GA) für die Steckdose vom Radio (0/0/10)
  • GA vom Licht (0/0/20)

Auf der fhem Seite wird benötigt:

  • define RadioKueche EIB 0/0/10
  • define LichtKueche EIB 0/0/20
notify Befehl
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche %" }

oder

define LichtamRadioan notify LichtKueche set RadioKueche %
Erklärung
  • Der Begriff "LichtamRadioan" ist nur ein Platzhalter, damit es im fhem verwaltet werden kann.
  • "%" ist ein Platzhalter für den Zustand vom Pattern. % enthält ein "off" wenn das LichtKueche aus ist und ein "on" wenn das Licht eingeschaltet ist.
  • "{ <perlcode> }" alles was zwischen {} steht ist Perl code. Perl kennt das Schlüsselwort fhem. Das Schlüsselwort fhem dient dazu, fhem Befehle auszuführen. Es wird also der fhem Befehl "set RadioKueche on/off" ausgeführt. on oder off ist abhängig vom Pattern. Der eigentliche fhem Befehl muss in " " stehen.

Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird

Vorbereitung

KNX:

  • 3 GAs für drei Geräten bzw Lampen (0/0/30 0/0/31 0/0/32)

fhem:

  • define LichtWZ EIB 0/0/30
  • define Steckdose1 EIB 0/0/31
  • define Steckdose2 EIB 0/0/32
notify Befehl
define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1 %;;set Steckdose2 %" }

oder

define SteckdoseWZein notify LichtWZ set Steckdose1,Steckdose2 %
Erklärung

Wenn das LichtWZ eingeschaltet wird, dann werden auch die Steckdosen (1 und 2) eingeschaltet.


einfache ODER Funktion

Eine einfache ODER Funktion kann sehr einfach Realisiert werden

Vorbereitung

KNX:

  • 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)

fhem: define Licht1 EIB 0/0/40 define Licht2 EIB 0/0/41 define Steckdose EIB 0/0/42

notify Befehl
define SteckdoseWZein notify (Licht1|Licht2) set Steckdose %

oder

define SteckdoseWZein notify (Licht.) set Steckdose %
Erklärung

Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternatitv kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für ein Zeichen (kommt glaube ich von Perl)

Danach folgt der set Befehl. Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"

einfache UND Funktion

ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezeifeln. In fhem fehlen Logigfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ). Dadurch ist fhem zwar mächtig, wird aber für viele sehr kompliziert.

In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.

Vorbereitung

knx:

  • 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)
  • GD LED am Lichtschalter (0/0/106)

fhem:

define R1ZU EIB 0/0/50
attr R1ZU dummy 1

define R2ZU EIB 0/0/51 attr R1ZU dummy 1 define R3ZU EIB 0/0/52 attr R1ZU dummy 1 define LEDalleRolloZu EIB 0/0/106 Durch das Atribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.

notify Befehl
define nt.allerolloszu notify (R1ZU|R2ZU|R6ZU) {
my $r1 == $value{"R1ZU"};;
my $r2 == $value{"R2ZU"};;
my $r3 == $value{"R6ZU"};;
 if ($r1 eq "on" && $r2 eq "on" && $r3 eq "on") {
   fhem "set LEDalleRolloZu on"
 } else {
   fhem "set LEDalleRolloZu off"
 }
}
Erklärung

Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }

my $r1 ==> Variable $r1 definieren
== $value{"R1ZU"};; ==> weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu

Der doppelte ;; ist ein fhem Thema. Eigendlich würde für Perl ein ; reichen. Aber fhem nutzt selbst das ; und daher wird ein ;; benötigt. Mit den ersten drei my Zeilen werden die Rückgabewerte den Variabeln zugewiesen.

Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" && $r2 eq "on" && $r3 eq "on")« kann man so lesen: Wenn $r1 den Wert "on" und (&&) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")} ansonste else schalte die LED aus. {fhem("set LEDalleRolloZu off")

Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig)

Hier ein kleines Beispiel, wie ich mit Hilfe meiner PV-Anlage die Sonneneinstrahlung auf der Südseite ermittele. Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel) Optional: Die Funktion soll nur zwischen dem 6 und 9 Monat funktioneren. (drittes Beispiel)


Vorbereitung

PV Anlage mit SolarView abfragen. Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schliesen.

notify Syntax

fhem:

define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 (ich habe vier Wechselrichter) attr sv event-on-change-reading currentPower (weis nicht ob es wirklich benötigt wird)

define nt.sonnenlichtpersolar notify (sv:currentPower.*) { 
if (%EVTPART1 < 3000 ) {
 fhem('set Flur1 Auf');
}else {
 if (%EVTPART1 > 5000 ) {
 fhem('set Flur1 Ab');
 } 
 }
}

Optional 1: Zeitabhängig

(sv:currentPower.*) { 
my $hm == sprintf("%%02d:%%02d", $hour, $min);
if ( $hm gt "09:30" && $hm lt "17:00") { 
 if (%EVTPART1 < 5000 ) {
  fhem('set Flur1 Auf');
  }else {
  if (%EVTPART1 > 8000 ) {
  fhem('set Flur1 Ab');
  } 
  }
 }
}

Optional 2: Zeit und Datum

(sv:currentPower.*) { 
my $hm == sprintf("%%02d:%%02d", $hour, $min);
if( $month ge "6" && $month le "9") {
 if ( $hm gt "09:30" && $hm lt "17:00") { 
 if (%EVTPART1 < 5000 ) {
  fhem('set Flur1,RBUERO1,RBUERO2 Auf');
  }else {
  if (%EVTPART1 > 8000 ) {
  fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');
  } 
  }
 }
 }
}
Erklärung
  • Das define wird im der Kommandozeile im Webbroser eingegeben.
  • Anschliessend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl
  • define sv SolarView ... <==== ist die Schnittstelle vom SolarView
  • define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert
if (%EVTPART1 < 3000 ) {
 fhem('set Flur1 Auf');
}else {
 if (%EVTPART1 > 5000 ) {
 fhem('set Flur1 Ab');
 } 
 }
}

Diese IF Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, das %EVTPART1 das Splitergebnis vom Rückgabewert ist Beispiel:

Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000". Jetzt steht im "%EVTPART0 == currentPower:" und im "%EVTPART1 == 6000" Das bedeutet wir müssen uns nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken, das übernimmt fhem.

Ergebnis der ganzen Aktion: Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren. Damit dies nicht dauernd hin und her pendelt, habe ich den Auf Wert sehr klein und den Ab Wert sehr groß gewählt.

Optional 1:Der Block "my $hm == sprintf("%%02d:%%02d", $hour, $min);" erzeugt die Variable $hm mit dem Inhalt $hour:$min. %02d (wegen fhem besonderheit %%02d) begrenzt die Ausgabe auf zwei Stellen (hab jetzt hoffentlich nichts Falsches geschrieben). Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00") " geprüft, ob die Uhrzeit zwischen 9:30 und 17:00 liegt. lt == kleiner als; gt größer als. Es wäre auch ein le und ge möglich: le == kleiner/gleich als, ge == größer/gleich als.

Optional 2:if( $month ge "6" && $month le "9") {

Hier frage ich die Default Variable $month (Monath) auf größer/gleich bzw kleiner/gleich ab. Die Funktion arbeitet als nur zwischen dem 6 und 9 Monat. Und dann auch nur zwischen 9:31 und 16:59.

Hinweise

Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreib muss man anscheinend darauf achten, dass keine abschliessende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.

Weiterführende Links

Escapen in Perlbefehlen

Klammerebnen