http://wiki.fhem.de/w/api.php?action=feedcontributions&user=MKleine&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-29T13:42:23ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=Notify&diff=27811Notify2018-09-08T17:18:34Z<p>MKleine: /* notify Befehl */</p>
<hr />
<div>{{SEITENTITEL:notify}}<br />
{{Infobox Modul<br />
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse<br />
|ModType=h<br />
|ModCmdRef=notify<br />
|ModForumArea=Automatisierung<br />
|ModTechName=91_notify.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
== Einführung ==<br />
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}<br />
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit ''notify'' und anderen [[Eventhandler|Eventhandlern]] <ref>hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]</ref> ist es möglich, Logikfunktionen im FHEM abzubilden.<br />
<br />
'''Beispiele:''' <br />
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. <br />
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. <br />
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt<ref>vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]</ref>.<br />
<br />
== Syntax ==<br />
<br />
define <name> notify <Suchmuster> <command> <br />
<br />
Das ''[[Regulärer Ausdruck|Suchmuster]]'' (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) <code>Gerätename:Event</code>. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. <code>Rollo1</code> steht, dann reagiert ''notify'' auf <code>Rollo1 on</code> und <code>Rollo1 off</code> usw.<br />
<br />
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: <code>(Rollo1|Rollo2|Steckdose5)</code>.<br />
<br />
'''Auch die Verwendung von Platzhaltern ist möglich''':<br />
* <code>Rollo.</code> → das notify reagiert auf alles was mit Rollo und '''einem''' weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg<br />
* <code>Rollo.*</code> → notify reagiert auf alles das mit Rollo beginnt<br />
* <code>.*isch</code> → auf alles das mit isch aufhört (Tisch, Fisch)<br />
* <code>Schalter(1|2|3)</code> → hört auf Schalter1, Schalter2 und Schalter3<br />
* <code>dimmer:pct:.(100|7[6-9]|[89][0-9])</code> → reagiert, wenn pct einen Wert über 75 annimmt.<br />
<br />
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.<br />
<br />
{{Hinweis|Das '''Suchmuster''' wird notify intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt<ref>Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.</ref>.<br />
<br />
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|'''Regulären Ausdruck''']], wie er in Perl<ref>https://perldoc.perl.org/perlre.html</ref> verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}<br />
<br />
'''Beispiel für das unterschiedliche Verhalten von ''Suchmuster'' und ''regulären Ausdruck'''''<br />
<br />
Für einen '''regulären Audruck''' gilt: Wenn der reguläre Ausdruck ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' zueinander.<br />
<br />
Für das '''Suchmuster''' gilt: Wenn das Suchmuster ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' '''nicht''' zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf ''lampe'' matcht (passt).<br />
<br />
== FHEMWEB-unterstützte Anlage eines notify ==<br />
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die "Befehl-Eingabezeile", die "Objektdetails" oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}<br />
<br />
=== Event Monitor ===<br />
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.<br />
<br />
=== Regexp wizard ===<br />
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:<br />
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) <br />
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten<br />
<br />
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines "notify":<br />
<br />
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:<br />
define ntest notify a b<br />
Als Beispiel wird ein notify mit <name> "ntest" angelegt. "a" und "b" sind beliebige Platzhalter für <Suchmuster> und <Command>, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.<br />
Der Regexp wizard öffnet sich:<br />
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]<br />
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das "notify" bei Eintritt jedes dieser Events ausgeführt:<br />
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]<br />
Anschließend den Platzhalter "a" mit Klick auf den Link "removeRegexpPart" löschen:<br />
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]<br />
Den Link "DEF" anklicken, damit sich der DEF-Editor öffnet:<br />
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]<br />
Jetzt den auszuführenden Befehl im "DEF"-Bereich durch Überschreiben des Platzhalters "b" eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:<br />
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]<br />
Das fertige und sofort aktive "notify" sieht abschließend folgendermaßen aus:<br />
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]<br />
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.<br />
<br />
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==<br />
<br />
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: <br />
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder<br />
* die Anweisung enthält einen Fehler. <br />
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.<br />
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.<br />
<br />
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel was nicht wie gewünscht funktioniert:<br />
<source lang="perl"> define n_test notify n_test:muster Ausführungsteil</source><br />
Zum debuggen benötigen wir <br />
* den [[Event monitor]]<br />
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.<br />
* die FHEM Kommandozeile<br />
* den [[DEF-Editor]]<br />
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.<br />
<br />
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt '''muster''' ausgelöst werden, Beispiel:<br />
2018-07-14 14:31:03 notify n_test muster bild<br />
<br />
=== Suchmuster ===<br />
Sollte das notify nicht funktionieren:<br />
* keine Reaktion wie gewünscht<br />
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile<br />
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit<br />
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste ":" im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]<br />
*Im Beispiel: Event: n_test muster -> Suchmuster n_test:muster<br />
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.<br />
<br />
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf '''muster'''. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:<br />
trigger n_test muster<br />
2018-07-13 11:52:08 notify n_test muster<br />
Das Suchmuster für unsere Anforderung muss in <code>n_test:muster.*</code> geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.<br />
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.<br />
<br />
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit [http://regexpal.com/| http://regexpal.com/] getestet werden.<br />
<br />
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigiertem Beispiel<br />
<source lang="perl"> defmod n_test notify n_test:muster.* Ausführungsteil</source><br />
folgt beim Kommando <code>trigger n_test muster bild</code> ein Eintrag im Log:<br />
2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.<br />
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. <br />
<br />
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!<br />
<br />
=== Anweisung ===<br />
Wird das notify getriggert, oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:<br />
<source lang="perl">{Log 1, "Das Notify n_test hat ausgeloest."}<br />
{Log 1, "Das Notify $NAME hat ausgeloest, der Event sah so aus: $EVENT"}</source><br />
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:<br />
2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster<br />
Unsere Anweisung <code>Ausführungsteil</code> liefert in der Kommandozeile selbst einen Fehler:<br />
<code>Unknown command Ausführungsteil, try help.</code><br />
Ein Versuch mit geschweiften Klammern <code>{Ausführungsteil}</code> liefert wieder einen Fehler:<br />
<code>Unrecognized character \xC3; marked by <-- HERE after {Ausf<-- HERE near column 6 at (eval 5977) line 1.</code><br />
Diese Variante <code>{"Ausführungsteil"}</code> liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet Fehler- aber Sinnfrei.<br />
Der fertige Code:<br />
defmod n_test notify n_test:muster.* {"Ausführungsteil"}<br />
<br />
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.<br />
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. <br />
<br />
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. <br />
<br />
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings ("TestWort") ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.<br />
<br />
== Beispiele ==<br />
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}<br />
<br />
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===<br />
<br />
==== Vorbedingungen ====<br />
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:<br />
<br />
define RadioKueche IT 000000FFFF 0F F0<br />
define LichtKueche CUL_HM 3A37D6<br />
Beachte: beide kennen als Event bzw. Schaltbefehle ''on'' und ''off''.<br />
<br />
==== notify Befehl ====<br />
<br />
define LichtamRadioan notify LichtKueche set RadioKueche $EVENT <br />
oder alternativ: <br />
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche $EVENT" }<br />
<br />
<br />
==== Erklärung ====<br />
* Der Name des ''notify'' "LichtamRadioan" kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.<br />
* "$EVENT" ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein "off" wenn das LichtKueche aus- und ein "on" wenn das Licht eingeschaltet wird.<br />
* "{ &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.<br />
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? <br />
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.<br />
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln <ref>In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.</ref>. <br />
<br />
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===<br />
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen<ref>Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module</ref> in den Stehlampen:<br />
==== Vorbedingungen ====<br />
<br />
FHEM:<br />
define LichtWZ CUL_HM 3A37D8<br />
define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5<br />
define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6<br />
<br />
==== notify Befehl ====<br />
<br />
define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT<br />
oder ''in Perl''<br />
define SteckdoseWZein notify LichtWZ { fhem "set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT " } <br />
==== Erklärung ====<br />
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.<br />
<br />
=== Einfache ODER Funktion ===<br />
Eine einfache ODER Funktion kann sehr einfach realisiert werden<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)<br />
<br />
FHEM:<br />
define Licht1 CUL_HM 3A37D8<br />
define Licht2 CUL_HM 1B7EC3<br />
define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT <br />
oder<br />
define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT<br />
<br />
==== Erklärung ====<br />
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.<br />
<br />
Danach folgt der set Befehl.<br />
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Einfache UND Funktion ===<br />
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezeifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).<br />
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.<br />
<br />
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)<br />
* GD LED am Lichtschalter (0/0/106)<br />
<br />
FHEM:<br />
define R1ZU KNX 0/0/50:dpt1.009<br />
attr R1ZU dummy 1<br />
define R2ZU KNX 0/0/51:dpt1.009<br />
attr R2ZU dummy 1<br />
define R3ZU KNX 0/0/52:dpt1.009<br />
attr R3ZU dummy 1<br />
define LEDalleRolloZu KNX 0/0/106:dpt1<br />
Durch das Atribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.<br />
<br />
==== notify Befehl ====<br />
define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {<br />
my $r1 = Value("R1ZU");;<br />
my $r2 = Value("R2ZU");;<br />
my $r3 = Value("R3ZU");;<br />
if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {<br />
fhem("set LEDalleRolloZu on");;<br />
} else {<br />
fhem("set LEDalleRolloZu off");;<br />
}<br />
}<br />
<br />
==== Erklärung ====<br />
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }<br />
<br />
my $r1 =&gt; Variable $r1 definieren<br />
= Value("R1ZU");; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu <br />
<br />
Der doppelte ;; ist ein FHEM Thema. Eigentlich 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.<br />
<br />
Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on")«&#160;kann man so lesen: Wenn $r1 den Wert "on" und (&amp;&amp;) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")}<br />
ansonsten else schalte die LED aus. {fhem("set LEDalleRolloZu off")<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Zeitverzögert schalten ===<br />
{| class="wikitable"<br />
| '''Aufgabe:''' || Zeitverzögert schalten<br />
|- <br />
| '''Beschreibung:''' || Mit einem Notify zeitverzögert eine Aktion auslösen.<br />
|- <br />
| '''Vorbereitung:''' || Gerät "Lampe" ist definiert und es gibt eine Situation, die ein Ereignis "Fernbedienung:.*" generiert.<br />
|-<br />
| '''Befehl:''' || <code>define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT</code><br />
|-<br />
| '''Erläuterungen:''' || Bei Eintreten eines Ereignisses "Fernbedienung*" wird nach einer Pause von siebeneinhalb Sekunden der Befehl <set Lampe ??> ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.<br />
:''Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}''<br />
|}<br />
<br />
<br />
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===<br />
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.<br />
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)<br />
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)<br />
<br />
==== Vorbereitung ====<br />
PV Anlage mit SolarView abfragen.<br />
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
<br />
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 <----vier Wechselrichter<br />
attr sv event-on-change-reading currentPower <br />
<br />
define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
<br />
Optional 1: Zeitabhängig<br />
<br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") { <br />
if ($EVTPART1 &lt; 5000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 8000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
}<br />
<br />
Optional 2: Zeit und Datum<br />
<br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ($month >= 6 &amp;&amp; $month <= 9) {<br />
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") { <br />
if ($EVTPART1 &lt; 5000 ) {<br />
fhem('set Flur1,RBUERO1,RBUERO2 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 8000 ) {<br />
fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');<br />
} <br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Erklärung ====<br />
* Das define wird in der Kommandozeile im Webbrowser eingegeben.<br />
* Anschliessend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl<br />
* define sv SolarView ... <==== ist die Schnittstelle vom SolarView<br />
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert<br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Splitergebnis vom Rückgabewert ist<br />
<br />
Beispiel: Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".<br />
Jetzt steht im "$EVTPART0 == currentPower:" und im "$EVTPART1 == 6000"<br />
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.<br />
<br />
Ergebnis: <br />
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.<br />
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.<br />
<br />
'''Optional 1:''' Der Block "my $hm = sprintf("%02d:%02d", $hour, $min);" erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.<br />
Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00")" mit stringvergleichende Operatoren 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.<br />
<br />
'''Optional 2:'''if( $month >= 6 && $month <= 9) {<br />
<br />
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.<br />
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.<br />
<br />
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===<br />
<br />
==== Vorbereitung ====<br />
Es ist je ein Fensterkontakt der ''open'' oder ''closed'' meldet, oben und unten am Fenster angebracht.<br />
Die Namen der beiden FHEM-Devices sind ''fensterKontaktOben'' und ''fensterKontaktUnten''.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')<br />
{ fhem 'set Terrassentuer open' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')<br />
{ fhem 'set Terrassentuer closed' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')<br />
{ fhem 'set Terrassentuer tilted' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')<br />
{ fhem 'set Terrassentuer undef' }<br />
}<br />
<br />
== Weitere Hinweise ==<br />
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.<br />
* Wird der Perl-Code in einem <code>notify</code> immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.<br />
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschliessende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.<br />
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen ''notify'' Definitionen bzw. bei deren Fehlerbehebung.<br />
<br />
== Weiterführende Links ==<br />
* [[Escapen in Perlbefehlen]]<br />
* [[Klammerebenen]]<br />
<br />
== Hinweise ==<br />
<references /><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Hilfsmodul]]</div>MKleinehttp://wiki.fhem.de/w/index.php?title=Notify&diff=27810Notify2018-09-08T17:17:42Z<p>MKleine: /* notify Befehl */</p>
<hr />
<div>{{SEITENTITEL:notify}}<br />
{{Infobox Modul<br />
|ModPurpose=Ausführung von Anweisung(en) als Reaktion auf Ereignisse<br />
|ModType=h<br />
|ModCmdRef=notify<br />
|ModForumArea=Automatisierung<br />
|ModTechName=91_notify.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
== Einführung ==<br />
{{Hinweis|Weitere grundlegende Informationen/Beispiele zu notify enthält [http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM]}}<br />
Das Hilfsmodul notify dient dazu [[Ereignis|Ereignisse]] über ein Suchmuster zu erkennen und bei einem Treffer eine Aktion auszulösen. Mit ''notify'' und anderen [[Eventhandler|Eventhandlern]] <ref>hierzu gehören u.a. auch [[DOIF]], [[THRESHOLD]] und [[watchdog]]</ref> ist es möglich, Logikfunktionen im FHEM abzubilden.<br />
<br />
'''Beispiele:''' <br />
* Wird das Licht in der Küche eingeschaltet, soll FHEM dort auch das Radio einschalten. <br />
* Bei Druck auf einen Taster soll die Umwälzpumpe für das Warmwasser eingeschaltet werden. <br />
* Erweiterte Möglichkeiten: Aber nur, wenn das Radio aus ist bzw. die Temperatur im Rücklauf des Warmwassers unterhalb einer bestimmten Schwelle liegt<ref>vgl. hierzu z.B. {{Link2CmdRef|Anker=devspec|Label=FILTER}} und [[if-condition]]</ref>.<br />
<br />
== Syntax ==<br />
<br />
define <name> notify <Suchmuster> <command> <br />
<br />
Das ''[[Regulärer Ausdruck|Suchmuster]]'' (häufig als Regexp = regular expression = regulärer Ausdruck bezeichnet) ist sehr wichtig: Es ist entweder der Name des auslösenden ("triggernden") Gerätes oder die Kombination aus Gerät und auslösendem Ereignis (Event) <code>Gerätename:Event</code>. Die Events kann man dem [[Event_monitor|Event-Monitor]] entnehmen. Wenn dort z.B. <code>Rollo1</code> steht, dann reagiert ''notify'' auf <code>Rollo1 on</code> und <code>Rollo1 off</code> usw.<br />
<br />
Wenn man mehrere Suchmuster kombinieren möchte, kann man diese in Klammer schreiben, als Trenner wird dann Pipe (|) genutzt: <code>(Rollo1|Rollo2|Steckdose5)</code>.<br />
<br />
'''Auch die Verwendung von Platzhaltern ist möglich''':<br />
* <code>Rollo.</code> → das notify reagiert auf alles was mit Rollo und '''einem''' weiteren beliebigen Zeichen anfängt. Also auf Rollo1 wie auch auf RolloG, aber nicht auf Rollo_wischundweg<br />
* <code>Rollo.*</code> → notify reagiert auf alles das mit Rollo beginnt<br />
* <code>.*isch</code> → auf alles das mit isch aufhört (Tisch, Fisch)<br />
* <code>Schalter(1|2|3)</code> → hört auf Schalter1, Schalter2 und Schalter3<br />
* <code>dimmer:pct:.(100|7[6-9]|[89][0-9])</code> → reagiert, wenn pct einen Wert über 75 annimmt.<br />
<br />
Suchmuster/Regex kann man im Internet beispielsweise auf [http://regexpal.com/| http://regexpal.com/] testen.<br />
<br />
{{Hinweis|Das '''Suchmuster''' wird notify intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt<ref>Der Eventhandler [[DOIF]] verwendet die in Perl übliche Syntax für reguläre Ausdrücke als DOIF-Suchmuster.</ref>.<br />
<br />
Deshalb darf das Suchmuster nicht mit einem üblichen [[Regulärer Ausdruck|'''Regulären Ausdruck''']], wie er in Perl<ref>https://perldoc.perl.org/perlre.html</ref> verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.}}<br />
<br />
'''Beispiel für das unterschiedliche Verhalten von ''Suchmuster'' und ''regulären Ausdruck'''''<br />
<br />
Für einen '''regulären Audruck''' gilt: Wenn der reguläre Ausdruck ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' zueinander.<br />
<br />
Für das '''Suchmuster''' gilt: Wenn das Suchmuster ''lampe'' ist und das [[Ereignis]] ''tischlampe'' dann passen ''tischlampe'' und ''lampe'' '''nicht''' zueinander, weil das Suchmuster zu ^lampe$ ergänzt wird und damit exakt nur auf ''lampe'' matcht (passt).<br />
<br />
== FHEMWEB-unterstützte Anlage eines notify ==<br />
{{Hinweis|Die Erstellung eines notify und insbesondere die korrekte Angabe des Suchmusters (Regex) führt gerade bei Einsteigern immer wieder zu Schwierigkeiten. Zur Fehlerminimierung empfiehlt es sich zum einen, die [[Konfiguration]] nicht direkt zu bearbeiten, sondern die "Befehl-Eingabezeile", die "Objektdetails" oder den [[Import von Code Snippets|Import von RAW-Definitionen]] zur Bearbeitung zu nutzen.}}<br />
<br />
=== Event Monitor ===<br />
Die komfortabelste Möglichkeit, die häufigsten Event-Handler zu erstellen, bietet der [[Event monitor|Event-Monitor]]. Die Vorgehensweis ist in dem zugehörigen Artikel dargestellt.<br />
<br />
=== Regexp wizard ===<br />
Zudem enthält FHEM einen Regexp wizard mit dem Regex anhand der in FHEM vorhandenen Devices und deren Events aus einer Auswahlbox selektiert werden können. Voraussetzungen sind:<br />
* Aktivierung des Hilfsmoduls [[eventTypes]] (bei allen Neuinstallationen Standard) <br />
* das gesuchte Ereignis (Event) ist nach Aktivierung des Hilfsmoduls bereits mindestens einmal eingetreten<br />
<br />
Schrittweise Darstellung der Nutzung des Regexp wizard zur Anlage eines "notify":<br />
<br />
In das [[Konfiguration#Befehl-Eingabefeld|Befehls-Eingabefeld]] eingeben und mit {{Taste|Enter}} bestätigen:<br />
define ntest notify a b<br />
Als Beispiel wird ein notify mit <name> "ntest" angelegt. "a" und "b" sind beliebige Platzhalter für <Suchmuster> und <Command>, die bei der weiteren Bearbeitung mit dem endgültigen Werten ersetzt werden.<br />
Der Regexp wizard öffnet sich:<br />
[[Datei:Regexp wizard1.JPG|400px|thumb|center]]<br />
Nun in der Auswahlbox das auslösende Event (Ereignis) auswählen; zunächst das Device und dann das gewünschte Regex. Hier soll das notify bei jeder Veränderung der Temperatur (temperature.*) des Device BTHR918N reagieren. Abschließend mit einem Mausklick auf {{Taste|set}} bestätigen. Wählt man mehrere Regex in dieser Weise aus, so wird das "notify" bei Eintritt jedes dieser Events ausgeführt:<br />
[[Datei:Regexp wizard2.JPG|400px|thumb|center]]<br />
Anschließend den Platzhalter "a" mit Klick auf den Link "removeRegexpPart" löschen:<br />
[[Datei:Regexp wizard3.JPG|400px|thumb|center]]<br />
Den Link "DEF" anklicken, damit sich der DEF-Editor öffnet:<br />
[[Datei:Regexp wizard4.JPG|400px|thumb|center]]<br />
Jetzt den auszuführenden Befehl im "DEF"-Bereich durch Überschreiben des Platzhalters "b" eintragen und mit Klick auf {{Taste|modify ntest}} abschließen:<br />
[[Datei:Regexp wizard5.JPG|400px|thumb|center]]<br />
Das fertige und sofort aktive "notify" sieht abschließend folgendermaßen aus:<br />
[[Datei:Regexp wizard6.JPG|400px|thumb|center]]<br />
Am Schluss das Speichern über {{Taste|Save config}} nicht vergessen.<br />
<br />
== Mein notify geht nicht - wie kann ich mir selbst helfen: Debugging ==<br />
<br />
Funktioniert ein notify nicht wie gewünscht, kann es nur zwei Hauptursachen haben: <br />
* Entweder das Suchmuster paßt nicht zum gewünschten Auslöser (FHEM Device), und/oder<br />
* die Anweisung enthält einen Fehler. <br />
Sollte kein Fehler im Logfile auftauchen aber das notify ausgelöst werden, stimmt meist der Übertragungsweg zum Zieldevice nicht.<br />
Der STATE des notify zeigt normalerweise mit Datum/Uhrzeit die letzte Auslösung an.<br />
<br />
Beim Debuggen sollte man daher beide Elemente getrennt untersuchen. Hier ein Beispiel was nicht wie gewünscht funktioniert:<br />
<source lang="perl"> define n_test notify n_test:muster Ausführungsteil</source><br />
Zum debuggen benötigen wir <br />
* den [[Event monitor]]<br />
* das [https://fhem.de/commandref.html#trigger trigger-Kommando] - kann man jederzeit verwenden um das Suchmuster als Event unabhängig vom Auslöser zu erzeugen.<br />
* die FHEM Kommandozeile<br />
* den [[DEF-Editor]]<br />
* eventuell einen Texteditor um Codeblöcke zwischen zu lagern und Notizen zu machen.<br />
<br />
Das Suchmuster im Beispiel notify triggert auf sich selbst, es soll auf jeden Event mit dem Inhalt '''muster''' ausgelöst werden, Beispiel:<br />
2018-07-14 14:31:03 notify n_test muster bild<br />
<br />
=== Suchmuster ===<br />
Sollte das notify nicht funktionieren:<br />
* keine Reaktion wie gewünscht<br />
* keine Fehlermeldung in der Weboberfläche beim Anlegen, keine Fehlermeldung im Logfile<br />
* STATE ist unverändert auf active oder einem altem Datum/Uhrzeit<br />
liegt der Fehler mit Sicherheit im Suchmuster. Man hat die Chance das Suchmuster mit dem trigger Befehl zu erzeugen und zu schauen ob die Anweisung ausgeführt wird. Dabei ist zu beachten: Der erste ":" im Suchmuster ist zusätzlich zwischen Gerät und Event als Trennung. Jeder weiter : ist, wenn vorhanden, Bestandteil des Events! Siehe dazu den Abschnitt [https://fhem.de/commandref_DE.html#notify Hinweise in der commandref]<br />
*Im Beispiel: Event: n_test muster -> Suchmuster n_test:muster<br />
Um aus dem [[Event]] ein passendes Suchmuster zu erzeugen kann der [[Event monitor|Event-Monitor]] direkt verwendet werden. Man kann ein neues notify erzeugen oder ein Bestehendes modifizieren lassen.<br />
<br />
Unser Regex im Beispiel ist zu spezifisch, es triggert nur exakt auf '''muster'''. Dieser Trigger erzeugt den folgenden Eintrag im Eventmonitor, entspricht exakt dem Suchmuster und löst das notify aus:<br />
trigger n_test muster<br />
2018-07-13 11:52:08 notify n_test muster<br />
Das Suchmuster für unsere Anforderung muss in <code>n_test:muster.*</code> geändert werden, damit jeder Event der mit muster beginnt das notify auslöst.<br />
Der . im Regex steht für jedes beliebige Zeichen und der * für eine beliebige Anzahl des Zeichens davor: also beliebig viele beliebige Zeichen nach muster.<br />
<br />
Das Suchmuster wird häufig in ein komplizierteres Regex umgewandelt um im notify mehrere Aktionen zu starten. Das eigene Regex kann z.B. mit [http://regexpal.com/| http://regexpal.com/] getestet werden.<br />
<br />
Funktioniert der Auslöser, das notify tut aber noch nicht was es soll, müssen wir die Anweisung untersuchen. In unserem korrigiertem Beispiel<br />
<source lang="perl"> defmod n_test notify n_test:muster.* Ausführungsteil</source><br />
folgt beim Kommando <code>trigger n_test muster bild</code> ein Eintrag im Log:<br />
2018.07.13 11:47:57 3: n_test return value: Unknown command Ausführungsteil, try help.<br />
Das notify wurde zwar getriggert aber die Anweisung war nicht ausführbar. <br />
<br />
Ein richtiges Suchmuster und eine fehlerhafte Anweisung wird also normalerweise einen Fehlereintrag im Logfile erzeugen!<br />
<br />
=== Anweisung ===<br />
Wird das notify getriggert, oder will man ganz schnell mal ein notify testen, kann man die Anweisung durch folgenden Code ersetzen, man öffnet also einfach nur die DEF, kopiert den ursprünglichen Inhalt an einen sicheren Ort und ersetzt die Anweisung durch eine der beiden Zeilen. Die erste Zeile kann man auch einfach mal in der Kommandozeile testen:<br />
<source lang="perl">{Log 1, "Das Notify n_test hat ausgeloest."}<br />
{Log 1, "Das Notify $NAME hat ausgeloest, der Event sah so aus: $EVENT"}</source><br />
Wird das notify ausgelöst, muss anschließend im Logfile ein Eintrag zu finden sein:<br />
2018.07.13 10:28:57 1: Das Notify n_test hat ausgeloest, der Event sah so aus: muster<br />
Unsere Anweisung <code>Ausführungsteil</code> liefert in der Kommandozeile selbst einen Fehler:<br />
<code>Unknown command Ausführungsteil, try help.</code><br />
Ein Versuch mit geschweiften Klammern <code>{Ausführungsteil}</code> liefert wieder einen Fehler:<br />
<code>Unrecognized character \xC3; marked by <-- HERE after {Ausf<-- HERE near column 6 at (eval 5977) line 1.</code><br />
Diese Variante <code>{"Ausführungsteil"}</code> liefert den String Ausführungsteil ohne Fehler: Das notify arbeitet Fehler- aber Sinnfrei.<br />
Der fertige Code:<br />
defmod n_test notify n_test:muster.* {"Ausführungsteil"}<br />
<br />
Man kann die Anweisung, normalerweise so wie sie ist, in der FHEM Kommandozeile testen. Sind im Perl Code (in geschweiften Klammern) im DEF Editor Semikolon enthalten muss man diese für den Test in der Kommandozeile (oder Raw Def) verdoppeln.<br />
Laufzeitabhängige Variablen sind in der Kommandozeile meist nicht verfügbar, diese sollte man für den Test einfach durch passende Inhalte austauschen. So kann man die komfortable Variante (loggt den Namen und das komplette Event) nicht in der Kommandozeile ausführen. <br />
<br />
Funktioniert ein FHEM Befehl in der Kommandozeile nicht (z.B. Lampe geht nicht an) kann es im notify auch nicht funktionieren, dann muss die Fehlersuche an anderer Stelle fortgeführt werden. <br />
<br />
Komplexeren Code im Ausführungsteil sollte man beim Testen in Teilabschnitte aufteilen, von der Laufzeit abhängige Variable ($NAME, $EVENT, $EVTPART) durch Strings ("TestWort") ersetzen, die Teilabschnitte separat testen und anschließend schrittweise wieder komplettieren.<br />
<br />
== Beispiele ==<br />
{{Hinweis|Für die nachfolgenden Beispiele wurden einige unterschiedliche Technologien verwendet. Sie können aber recht einfach auf alle anderen Systeme übertragen werden, dabei sollte ggf. darauf geachtet werden, dass sich Schaltbefehle und Events teilweise je nach konkret eingesetzter Technologie unterscheiden können. Dann ist ggf. eine Erweiterung, z.B. durch eine [[if-condition|if-Abfrage]] erforderlich.}}<br />
<br />
=== Etwas schalten, wenn ein anderes Gerät geschaltet wird ===<br />
<br />
==== Vorbedingungen ====<br />
Dieses Beispiel verwendet eine einfache InterTechno-kompatible Funksteckdose für das Radio und einen HM-Aktor für das Licht:<br />
<br />
define RadioKueche IT 000000FFFF 0F F0<br />
define LichtKueche CUL_HM 3A37D6<br />
Beachte: beide kennen als Event bzw. Schaltbefehle ''on'' und ''off''.<br />
<br />
==== notify Befehl ====<br />
<br />
define LichtamRadioan notify LichtKueche set RadioKueche $EVENT <br />
oder alternativ: <br />
define LichtamRadioan notify LichtKueche { fhem "set RadioKueche $EVENT" }<br />
<br />
<br />
==== Erklärung ====<br />
* Der Name des ''notify'' "LichtamRadioan" kann frei gewählt werden, er dient nur dazu, das notify in FHEM eindeutig zu identifizieren.<br />
* "$EVENT" ist ein Platzhalter für den Zustand vom Pattern. $EVENT enthält ein "off" wenn das LichtKueche aus- und ein "on" wenn das Licht eingeschaltet wird.<br />
* "{ &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.<br />
* Wann ist ein Wechsel auf die Perl-Ebene erforderlich? <br />
** einfache FHEM-Befehle sollten in der Regel direkt verwendet werden, dies ist ressourcenschonender.<br />
** Immer dann, wenn dies nicht möglich ist, weil z.B. komplexerer Code ausgeführt werden soll, (blockierende) Prozesse ausgelagert werden sollten oder Systembefehle ausgeführt werden, ist es günstiger, auf die Perl-Ebene zu wechseln <ref>In diesem {{Link2Forum|Topic=88398|Message=808685|LinkText=Forenbeitrag}} wird z.B. erläutert, wie man nichtblockierend externe scripte aufrufen kann, die dann ihre Ergebnisse wieder an FHEM übergeben.</ref>. <br />
<br />
=== Einschalten von mehreren Geräten/Lampen, wenn das Licht eingeschaltet wird ===<br />
Dieses Beispiel verwendet einen HM-Aktor für das Licht sowie zwei Milight-Birnen, die einzeln geschaltet werden sollen<ref>Dies ist ausdrücklich keine Empfehlung für diese Technologie und der Module</ref> in den Stehlampen:<br />
==== Vorbedingungen ====<br />
<br />
FHEM:<br />
define LichtWZ CUL_HM 3A37D8<br />
define Stehlampe1 MilightDevice RGBW Milight_Wohnzimmer 5<br />
define Stehlampe2 MilightDevice RGBW Milight_Wohnzimmer 6<br />
<br />
==== notify Befehl ====<br />
<br />
define SteckdoseWZein notify LichtWZ set Stehlampe1,Stehlampe2 $EVENT<br />
oder ''in Perl''<br />
define SteckdoseWZein notify LichtWZ { fhem "set Stehlampe1 $EVENT;;set Stehlampe2 $EVENT " } <br />
==== Erklärung ====<br />
Wenn das LichtWZ eingeschaltet wird, dann werden auch die Stehlampen (1 und 2) eingeschaltet.<br />
<br />
=== Einfache ODER Funktion ===<br />
Eine einfache ODER Funktion kann sehr einfach realisiert werden<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GAs der abzufragende Werte (0/0/40 0/0/41 0/0/42)<br />
<br />
FHEM:<br />
define Licht1 CUL_HM 3A37D8<br />
define Licht2 CUL_HM 1B7EC3<br />
define Stehlampe MilightDevice RGBW Milight_Wohnzimmer 7<br />
<br />
==== notify Befehl ====<br />
define SteckdoseWZein notify (Licht1|Licht2) set Stehlampe $EVENT <br />
oder<br />
define SteckdoseWZein notify (Licht.) set Stehlampe $EVENT<br />
<br />
==== Erklärung ====<br />
Die Werte in der Klammer (wichtig ist das »|«) sind die Rückgabewerte. Alternativ kann in diesem Beispiel auch »Licht.« (zu beachten ist der Punkt) geschrieben werden. Der Punkt ist ein Platzhalter für (genau) ein beliebiges Zeichen.<br />
<br />
Danach folgt der set Befehl.<br />
Wenn also das Licht1 oder Licht2 den Wert "on" hat, dann hat auch die Steckdose den Wert "on"<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Einfache UND Funktion ===<br />
Ob man dieses Konstrukt noch als einfach bezeichnen kann, wage ich mal zu bezeifeln. In FHEM fehlen Loggingfunktionen, die man alle selber mit Perl Code erstellen kann (Danke an MAZ).<br />
Dadurch ist FHEM zwar mächtig, wird aber für viele sehr kompliziert.<br />
<br />
In diesem Beispiel soll - wenn drei Rollos geschlossen sind - am Taster eine LED eingeschaltet werden.<br />
<br />
==== Vorbereitung ====<br />
KNX:<br />
* 3x GDs für die Rückgabewert Rollo geschlossen == 1 (0/0/50 0/0/51 0/0/52)<br />
* GD LED am Lichtschalter (0/0/106)<br />
<br />
FHEM:<br />
define R1ZU KNX 0/0/50:dpt1.009<br />
attr R1ZU dummy 1<br />
define R2ZU KNX 0/0/51:dpt1.009<br />
attr R2ZU dummy 1<br />
define R3ZU KNX 0/0/52:dpt1.009<br />
attr R3ZU dummy 1<br />
define LEDalleRolloZu KNX 0/0/106:dpt1<br />
Durch das Atribut dummy werden keine Schaltfunktion angeboten. Es kann nur Werte anzeigen.<br />
<br />
==== notify Befehl ====<br />
define nt.allerolloszu notify (R1ZU|R2ZU|R3ZU) {<br />
my $r1 = Value("R1ZU");<br />
my $r2 = Value("R2ZU");<br />
my $r3 = Value("R3ZU");<br />
if ($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on") {<br />
fhem("set LEDalleRolloZu on");<br />
} else {<br />
fhem("set LEDalleRolloZu off");<br />
}<br />
}<br />
<br />
==== Erklärung ====<br />
Es werden die drei Rückgabewerte R1ZU, R2ZU und R3ZU ausgewertet. Danach folgt Perl Code, deswegen beginnt das ganze mit einer { und endet mit }<br />
<br />
my $r1 =&gt; Variable $r1 definieren<br />
= Value("R1ZU");; ==&gt; weist den Rückgabewert (on oder off) von R1ZU der Variable $r1 zu <br />
<br />
Der doppelte ;; ist ein FHEM Thema. Eigentlich 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.<br />
<br />
Danach erfolgt ein normales "if then else" Konstrukt. Die Zeile »($r1 eq "on" &amp;&amp; $r2 eq "on" &amp;&amp; $r3 eq "on")«&#160;kann man so lesen: Wenn $r1 den Wert "on" und (&amp;&amp;) $r2 den Wert "on" und $r3 den Wert "on" dann schalte die LEDalleRolloZu ein {fhem("set LEDalleRolloZu on")}<br />
ansonsten else schalte die LED aus. {fhem("set LEDalleRolloZu off")<br />
<br />
Alternative: [[structure]]<br />
<br />
=== Zeitverzögert schalten ===<br />
{| class="wikitable"<br />
| '''Aufgabe:''' || Zeitverzögert schalten<br />
|- <br />
| '''Beschreibung:''' || Mit einem Notify zeitverzögert eine Aktion auslösen.<br />
|- <br />
| '''Vorbereitung:''' || Gerät "Lampe" ist definiert und es gibt eine Situation, die ein Ereignis "Fernbedienung:.*" generiert.<br />
|-<br />
| '''Befehl:''' || <code>define ntfy1 notify Fernbedienung:.* sleep 7.5;; set Lampe $EVENT</code><br />
|-<br />
| '''Erläuterungen:''' || Bei Eintreten eines Ereignisses "Fernbedienung*" wird nach einer Pause von siebeneinhalb Sekunden der Befehl <set Lampe ??> ausgeführt, wobei der eigentliche Befehl aus dem auslösenden Ereignis übernommen wird.<br />
:''Quelle: {{Link2Forum|Topic=17161|LinkText=FHEM Forum}}''<br />
|}<br />
<br />
<br />
=== Eine PV-Anlage (Solarstrom) zur Steuerung der Rollos nutzen (optional Zeit und Datums abhängig) ===<br />
Hier ein kleines Beispiel, wie man mit Hilfe einer PV-Anlage die Sonneneinstrahlung auf der Südseite ermittelt und dies zur Rolladensteuerung nutzt.<br />
Optional: Die Funktion soll allerdings nur zwischen 9:30 und 17:00 stattfinden. (zweites Beispiel)<br />
Optional: Die Funktion soll nur zwischen dem 6. und 9. Monat funktioneren. (drittes Beispiel)<br />
<br />
==== Vorbereitung ====<br />
PV Anlage mit SolarView abfragen.<br />
Per Hand ermitteln, ab wieviel erzeugtem Strom es sinnvoll ist die Rollos zu schließen.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
<br />
define sv SolarView solarview 15000 wr1 wr2 wr3 wr4 <----vier Wechselrichter<br />
attr sv event-on-change-reading currentPower <br />
<br />
define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
<br />
Optional 1: Zeitabhängig<br />
<br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") { <br />
if ($EVTPART1 &lt; 5000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 8000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
}<br />
<br />
Optional 2: Zeit und Datum<br />
<br />
(sv:currentPower.*) { <br />
my $hm = sprintf("%02d:%02d", $hour, $min);<br />
if ($month >= 6 &amp;&amp; $month <= 9) {<br />
if ( $hm gt "09:30" &amp;&amp; $hm lt "17:00") { <br />
if ($EVTPART1 &lt; 5000 ) {<br />
fhem('set Flur1,RBUERO1,RBUERO2 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 8000 ) {<br />
fhem('set Flur1,Flur2,RBUERO1,RBUERO2 Ab');<br />
} <br />
}<br />
}<br />
}<br />
}<br />
<br />
==== Erklärung ====<br />
* Das define wird in der Kommandozeile im Webbrowser eingegeben.<br />
* Anschliessend wird im Webbrowser die DEF bearbeitet, das erspart uns Probleme mit Perl<br />
* define sv SolarView ... <==== ist die Schnittstelle vom SolarView<br />
* define nt.sonnenlichtpersolar notify (sv:currentPower.*) { <==== hier wird ein notify angelegt, der auf das "define sv" Wert "currentPower.*" (.* ist irgendwas) reagiert<br />
if ($EVTPART1 &lt; 3000 ) {<br />
fhem('set Flur1 Auf');<br />
}else {<br />
if ($EVTPART1 &gt; 5000 ) {<br />
fhem('set Flur1 Ab');<br />
} <br />
}<br />
}<br />
Diese if-Funktion wertet den Rückgabewert von currentPower aus. Hierbei muss man wissen, dass $EVTPART1 das Splitergebnis vom Rückgabewert ist<br />
<br />
Beispiel: Der Rückgabewert (wie im Beispiel) ist "currentPower: 6000".<br />
Jetzt steht im "$EVTPART0 == currentPower:" und im "$EVTPART1 == 6000"<br />
Das bedeutet, dass man sich nicht selbst den richtigen split (Perl Befehl) Aufruf ausdenken muss, dies übernimmt vielmehr FHEM.<br />
<br />
Ergebnis: <br />
Das Rollo wird abhängig von der erzeugten IST_Strommenge auf und zu gefahren.<br />
Damit dies nicht dauernd hin und her pendelt, wurde der Auf Wert sehr klein und den Ab Wert sehr groß gewählt.<br />
<br />
'''Optional 1:''' Der Block "my $hm = sprintf("%02d:%02d", $hour, $min);" erzeugt die String-Variable $hm mit dem Inhalt $hour:$min. %02d begrenzt die Ausgabe auf zwei Stellen.<br />
Danach wird mit "if ( $hm gt "09:30" && $hm lt "17:00")" mit stringvergleichende Operatoren 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.<br />
<br />
'''Optional 2:'''if( $month >= 6 && $month <= 9) {<br />
<br />
Hier wird die numerische FHEM-Standard-Variable $month (Monat) auf größer/gleich bzw kleiner/gleich mit den binären Operatoren überprüft.<br />
Die Funktion arbeitet also nur zwischen dem 6. und dem 9. Monat und dann auch nur zwischen 9:31 und 16:59.<br />
<br />
=== Status eines Kippfensters mit 2 Fensterkontakten abbilden ===<br />
<br />
==== Vorbereitung ====<br />
Es ist je ein Fensterkontakt der ''open'' oder ''closed'' meldet, oben und unten am Fenster angebracht.<br />
Die Namen der beiden FHEM-Devices sind ''fensterKontaktOben'' und ''fensterKontaktUnten''.<br />
<br />
==== notify Syntax ====<br />
FHEM:<br />
define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')<br />
{ fhem 'set Terrassentuer open' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')<br />
{ fhem 'set Terrassentuer closed' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')<br />
{ fhem 'set Terrassentuer tilted' }<br />
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')<br />
{ fhem 'set Terrassentuer undef' }<br />
}<br />
<br />
== Weitere Hinweise ==<br />
* Entsprechend zu $EVENT gibt es auch noch $NAME und $TYPE. $NAME und $TYPE enthalten den Namen bzw. Typ des Ereignis auslösenden Gerätes.<br />
* Wird der Perl-Code in einem <code>notify</code> immer länger, lagere den Code wegen der Übersichtlichkeit in eine eigene Programmdatei aus, wie in [[99_myUtils anlegen]] beschrieben.<br />
* Achtung! Wenn man das Skript für den notify-Befehl über mehrere Zeilen schreibt, muss man anscheinend darauf achten, dass keine abschliessende Leerzeile mitgespeichert wird. Sonst wird der notify-Befehl ignoriert.<br />
* Dieser {{Link2Forum|Topic=38520|Message=307325}} enthält Vorschläge zur Vorgehensweise bei der Erstellung von komplexen ''notify'' Definitionen bzw. bei deren Fehlerbehebung.<br />
<br />
== Weiterführende Links ==<br />
* [[Escapen in Perlbefehlen]]<br />
* [[Klammerebenen]]<br />
<br />
== Hinweise ==<br />
<references /><br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Hilfsmodul]]</div>MKleinehttp://wiki.fhem.de/w/index.php?title=Update&diff=22212Update2017-08-12T16:28:09Z<p>MKleine: Link auf restore korrigiert (vorher 404)</p>
<hr />
<div>{{SEITENTITEL:update}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Aktualisierung der FHEM-Installation<br />
|ModType=cmd<br />
|ModCmdRef=update<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_update.pm<br />
|ModOwner=rudolfkoenig ([http://forum.fhem.de/index.php?action=profile;u=8 Forum] / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
[[update]] ist ein Befehl zur Aktualisierung der FHEM-Installation direkt über das FHEM [[FHEMWEB|Webfrontend]]. Von den Entwicklern bis zu einem bestimmten Zeitpunkt freigegebene Änderungen sind jeweils morgens ab 8:00 Uhr über die Update Funktion verfügbar. Änderungen, die später freigegeben werden, werden dementsprechend erst am nächsten Tag verfügbar.<br />
<br />
== Syntax ==<br />
:<code><nowiki>update [<fileName>|all|check|force] [http://.../controlfile]</nowiki></code><br />
oder<br />
:<code><nowiki>update [add source|delete source|list|reset]</nowiki></code><br />
<br />
'''Hinweise:'''<br />
* FHEM sichert mit den Standardeinstellungen während des Updates "nur" die aktualisierten Modul(Installations-)dateien und bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) ab Updatestand 29.10.2016 die [[Konfiguration]] und fhem.save, aber beispielsweise nicht [[Plots erzeugen|Plots]] oder [[FileLog]]s. Soll vor dem Update ein vollständiges Backup von FHEM erstellt werden, muss das mit dem Attribut <code>[[#backup_before_update|backup_before_update]]</code> eingeschaltet werden.<br />
* Lesen Sie aufmerksam die nach dem Update auf dem Monitor erscheinenden Meldungen zu Neuerungen und Änderungen.<br />
* Nach einem Update ist immer ein ''shutdown restart'' erforderlich.<br />
* geänderte und neu eingecheckte Module werden grundsätzlich erst am Folgetag ab ca. 8.00 Uhr durch den Update-Befehl verteilt.<br />
* Mit dem Befehl [[version]] lässt sich die Version einzelner oder aller benutzten Module bestimmen.<br />
<br />
== Parameter ==<br />
Details zu Parametern des update Befehls:<br />
<br />
=== Standardaufrufe ===<br />
==== update ====<br />
Die ganze FHEM-Installation wird auf die neueste Version gebracht. Vorhandene Module werden akualisiert und neue Module installiert.<br />
<br />
==== update check ====<br />
Es werden alle Module aufgelistet, von denen eine neuere als die bereits installierte Version verfügbar ist. Es wird nicht installiert.<br />
<br />
==== update force ====<br />
Das Update wird erzwungen (falls es beim regulären ''update'' Probleme geben sollte). Dieser Befehl ist nur mit Bedacht und ausschließlich im Notfall einzusetzen. Sollte ein reproduzierbares Problem existieren, dies bitte im FHEM-Forum berichten, damit dem nachgegangen werden kann.<br />
<br />
==== update &lt;Dateiname&gt; ====<br />
Mit z.B. <code>update 02_HTTPSRV.pm</code> wird nur von der Datei ''02_HTTPSRV.pm'' eine neue Version installiert. Alle anderen FHEM-Dateien werden nicht angetastet.<br />
<br />
==== update all ====<br />
Alle [[Systemübersicht#Module|offiziellen Module]] von FHEM sind in einem gemeinsamen Repository gespeichert. Nur diese Module werden in der Standardeinstellung durch den update-Befehl mit den bisher aufgeführten [[#Standardaufrufe|Standardaufrufen]] aktualisiert bzw. installiert. Einige Entwickler stellen ihre Module jedoch aus verschiedensten Gründen nicht im gemeinsamen Repository zur Verfügung, sondern nutzen eigene, separate Repositorys. Diese sogenannten "Thirdparty-Module" (auch bezeichnet als inoffizielle Module) können ebenfalls über update installiert und aktualisiert werden, wenn der Entwickler eine sogenannte Kontrolldatei (controlfile) in seinem Repository zur Verfügung stellt.<br />
<br />
Zur Installation bzw. Update jedes einzelnen Thirdparty-Moduls ist nachfolgender Befehl aufzurufen (Webadresse und Kontrolldateiname sind modulabhängig passend zu ersetzen):<br />
<code><nowiki>update all http://thirdparty.com/controls_funnymodule.txt</nowiki></code><br />
<br />
Die in den vorherigen Abschnitten erläuterten Standardaufruf (bis auf <code>update</code>) können durch Ergänzung um Webadresse und Kontrolldateiname (<nowiki>http://.../controlfile</nowiki> beim Befehls-Aufruf für das Update von einzelnen Thirdparty-Modulen genutzt werden.<br />
<br />
=== Repository-Verwaltung ===<br />
In den Standardeinstellungen von FHEM ist für jedes einzelne Repository ein separater Aufruf der [[#Standardaufrufe|Standardaufrufe]] zur Aktualiserung/Installation notwendig. Zur Vereinfachung des Update-Prozesses hat der update-Befehl eine eingebaute Repository-Verwaltung. Mittels der Repository-Verwaltung lassen sich die Standardaufrufe so beeinflußen, dass mit einem einzigen Aufruf sowohl die Module aus dem FHEM-Repository als auch aus verschiedenen Thirdparty-Repositorys beim Update berücksichtigt werden.<br />
<br />
==== update add ====<br />
Fügt ein zusätzliches Repository zur vereinfachten Nutzung über die Standardaufrufe hinzu. Ein Aufruf von <code><nowiki>update <Dateiname>|all|check|force</nowiki></code> berücksichtigt dann automatisch neben dem FHEM-eigenen Repository auch das hinzugefügte "Thirdparty-Repository". <br />
<br />
Nach dem Hinzufügen durch beispielsweise <code><nowiki>update add http://thirdparty.com/controls_funnymodule.txt</nowiki></code> entfällt somit der manuelle Aufruf der Form <code><nowiki>update all http://thirdparty.com/controls_funnymodule.txt</nowiki></code> zur Aktualiserung. Er kann aber weiterhin genutzt werden, um ausschließlich für ein bestimmtes Repository ein Update zu erhalten und und nicht für alle.<br />
<br />
Die Liste der Repositorys wird in der Verwaltungsdatei FHEM/controls.txt gespeichert.<br />
<br />
==== update delete ====<br />
Entfernt eine Repository aus der Verwaltungsdatei.<br />
<br />
==== update list ====<br />
Listet alle in der Verwaltungsdatei enthaltenen Repositorys auf.<br />
<br />
==== update reset ====<br />
Entfernt alle Fremd-Repositorys aus der Verwaltungsdatei. Nur das eigene Repository von FHEM wird noch von den Standardparametern berücksichtigt.<br />
<br />
==== Syntax controlfile ====<br />
Das Controlfile, welches durch thirdparty Module angelegt wird unterliegt einer Syntax.<br />
Im Controlfile steht in jeder Zeile ein Dateiname und ein Befehl, was damit passieren soll. Ein Zeilenumbruch wird durch ein \n dargestellt<br />
<br />
Es können zwei Befehle verwendet werden<br />
UPD zum Aktualisieren einer Datei, MOV zum Verschieben einer Datei.<br />
<br />
Aufbau der Befehle:<br />
<br />
Zum Aktualisieren einer Datei. Die Aktualisierung wird nur ausgeführt, wenn das Datum von der lokalen Datei unterschiedlich ist und die Dateigröße der heruntergeladenen Datei übereinstimmt:<br />
<br />
<code>UPD <Datum> <Dateigröße> <Datei inkl. Pfad> </code><br />
<br />
<br />
Zum Verschieben oder umbenennen einer Datei. <br />
<br />
<code>MOV <quelldatei inkl. Pfad> <Zieldatei inkl. Pfad> </code><br />
<br />
Dateien lassen sich mit dem MOV Befehl auch in einen speziellen Ordner "unused" verschieben. Ein vollständiges Löschen der Datei ist nicht möglich:<br />
<br />
<code>MOV <quelldatei inkl. Pfad> unused </code><br />
<br />
Bei Verwendung des Befehls UPD ist wichtig, dass das Datum inklusive Uhrzeit übergeben wird.<br />
<br />
<syntaxhighlight lang="perl"><br />
my $date = POSIX::strftime("%Y-%d-%m", localtime( $fi->{mtime} ));<br />
my $time = POSIX::strftime("%H:%M:%S", localtime( $fi->{mtime} ));<br />
</syntaxhighlight> <br />
<br />
Erzeugt ''2016_14_10_23:50:13''.<br />
<br />
Die Dateigröße ist exakt zu bestimmen:<br />
<br />
<syntaxhighlight lang="perl"><br />
@line_parts[2] = fileparse($file,"");<br />
@line_parts[3] = $fi->{size};<br />
$modifiy_line = join(" ",@line_parts)."\n"; <br />
</syntaxhighlight><br />
<br />
Komplettes Beispiel:<br />
<br />
<code>UPD 2016_14_10_23:50:13 40341 FHEM/98_Dooya.pm</code><br />
<br />
== Attribute ==<br />
Zur weiteren Beeinflussung der Funktionsweise des update Befehls können Attribute verwendet werden. Diese müssen für das Objekt ''global'' gesetzt werden, also mit einem Konfigurationsbefehl der Art<br />
:<code>attr global ...</code><br />
<br />
=== backup_before_update ===<br />
siehe auch [[backup]]<br />
<br />
=== restoreDirs ===<br />
siehe [[#Rücksichern beim Update überschriebener Dateien|Rücksichern beim Update überschriebener Dateien]]<br />
<br />
=== exclude_from_update ===<br />
Mit der Definition <br />
:<code>attr global exclude_from_update ...</code><br />
kann eine Liste von Dateien spezifiziert werden, die bei der Ausführung des update Befehls '''nicht''' aktualisiert werden sollen. Dateien können auch über reguläre Ausdrücke definiert werden, die einzelnen Einträge werden durch Leerzeichen voneinander getrennt.<br />
<br />
Einen Spezialfall stellt die ''commandref'' dar, die seit einer Modifikation des Update Prozesses (März 2015, beschrieben in dieser {{Link2Forum|Topic=34450|LinkText=Forendiskusion}}) nicht mehr heruntergeladen wird, sondern auf dem Benutzersystem durch Extraktion der Dokumentation aus den einzelnen Modulen generiert wird, angezeigt durch die Meldung im fhem.log: <br />
:''Calling /usr/bin/perl ./contrib/commandref_join.pl, this may take a while''. <br />
Sollte dieser Prozess (z.B. auf einem langsamen Rechner) zu lange dauern, bleibt die Meldung <br />
:''update finished, "shutdown restart" is needed to activate the changes.'' <br />
aus. Wird ''commandref'' in das <code>exclude_from_update</code> Attribut eingetragen, entfällt dieser Schritt, die lokale ''commandref'' wird allerdings dann auch nicht mehr aktualisiert. Die modulspezifische Hilfe, die z.B. über <code>help modulname</code> aufgerufen werden kann, ist davon nicht betroffen.<br />
<br />
== Anwendungsbeispiel ==<br />
=== Durchführung eines Updates ===<br />
Zunächst kann mit dem Befehl<br />
:<code>update check</code><br />
überprüft werden, ob es überhaupt ein neues Update gibt und welche Dateien hierbei ausgetauscht würden (die angezeigten Infos sollten in einer Textdatei gesichert werden. Mit diesen Infos kann gezielter nach Problemen, die vielleicht nach einem Update auftreten, gesucht werden). Anschließend kann mittels:<br />
:<code>update</code><br />
das Update eingespielt werden. Hierbei ist zu beachten, dass die Befehle auf der FHEM Webseite oben ([[Konfiguration|Befehls-Eingabefeld]]) eingegeben werden und anschließend die "Enter" Taste auf der Tastatur gedrückt werden muss.<br />
<br />
Gibt es kein Update für FHEM, sieht die Ausgabe z.B. nach "update check" wie folgt aus:<br />
<br />
:<code>List of new / modified files since last update:</code><br />
:<code>nothing to do...</code><br />
<br />
=== Rücksichern beim Update überschriebener Dateien ===<br />
Per default werden vor dem Überschreiben alle Dateien in einem neuen Verzeichnis (restoreDir/Datum) gesichert. Diese Dateien kann man einzeln oder komplett mit dem Befehl [https://fhem.de/commandref.html#restore restore] zuruecksichern (z.Bsp.: <code>restore 2014-08-19</code> oder <code>restore 2014-08-19/fhem.pl</code>). Mit dem restoreDirs Attribut kann man die Anzahl der aufgehobenen Sicherungen (== Datum-Verzeichnisse) bestimmen, die Voreinstellung ist 3. Mit 0 kann man das Feature komplett abschalten.<br />
<br />
Ab Updatestand 29.10.2016 können bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) die fhem.cfg und fhem.save mit der Option -a des restore-Befehl wiederhergestellt werden.</div>MKleine