99 myUtils anlegen: Unterschied zwischen den Versionen
Fhainz (Diskussion | Beiträge) (nowiki duch pre ersetzt, code einrückungen) |
Krikan (Diskussion | Beiträge) K (Erläuterungen zur Vorlage 'myUtilsTemplate.pm') |
||
Zeile 1: | Zeile 1: | ||
Mit wachsender Anzahl von eigenen Helfer-Programmen wird die Speicherung von perl-code in notify unübersichtlich. Es besteht die Möglichkeit, eine eigene Programmdatei zu erzeugen, in der mehrere kleine Programme gesammelt und dann aus diversen notify- oder at-Anweisungen aufgerufen werden. | Mit wachsender Anzahl von eigenen Helfer-Programmen wird die Speicherung von perl-code in notify unübersichtlich. Es besteht die Möglichkeit, eine eigene Programmdatei zu erzeugen, in der mehrere kleine Programme gesammelt und dann aus diversen notify- oder at-Anweisungen aufgerufen werden. | ||
== Eine neue Programmdatei erzeugen == | == Eine neue Programmdatei erzeugen == | ||
Fhem enthält seit Updatestand 01/2015 eine Vorlage 'myUtilsTemplate.pm', die zur Erzeugung der Programmdatei genutzt werden sollte. | |||
Vorgehensweise: | |||
* Fhem-Menüpunkt {{Taste|Edit files}} anklicken | |||
* Weblink 'myUtilsTemplate.pm' anklicken | |||
* Im Textfeld hinter 'Save as' den gewünschten Dateinamen für die Programmdatei (hier als Beispiel: '99_myUtils.pm') eintragen | |||
* {{Taste|Save as}} anklicken | |||
Nun ist die eigene Programmdatei '99_myUtils.pm' mit der notwendigen Grundstruktur unter dem Menüpunkt 'Edit files' zur Bearbeitung mit dem [[Konfiguration#Integrierter_Editor|Integrierter Editor]] zu finden. Für eine einfache und fehlerminimierende Bearbeitung sollten die [[Konfiguration#Sytaxhervorhebung|Syntaxhervorhebungs-, Befehlsauswahl- und Befehlsvervollständigungsfunktionen]] im Integrierten Editor eingeschaltet sein. | |||
Für Experten ist auch die Nutzung eines [[Konfiguration#Externer Editor|Externen Editors]] zur Bearbeitung möglich, aber nicht empfohlen. | |||
Eine | Eine ‚leere‘ Programmdatei muss grundsätzlich folgenden Grundstruktur besitzen: | ||
package main; | |||
use strict; | |||
use warnings; | |||
use POSIX; | |||
sub | |||
myUtils_Initialize($$) | |||
{ | |||
my ($hash) = @_; | |||
} | |||
1; | |||
Drei Dinge sind für Ihre Programmdatei besonders zu beachten: | Drei Dinge sind für Ihre Programmdatei besonders zu beachten: | ||
# Der Dateiname muss mit 99_ beginnen. Fhem lädt beim Start alle Programmdateien mit dem prefix 99_. Andere Programmdateien werden erst dann geladen, wenn sie durch eine define-Anweisung in | # Der Dateiname muss mit 99_ beginnen. Fhem lädt beim Start alle Programmdateien mit dem prefix 99_. Andere Programmdateien werden erst dann geladen, wenn sie durch eine define-Anweisung in der [[Konfiguration]] angefordert werden. So wird z.B. 10_FS20.pm erst geladen, wenn beim Einlesen der Konfiguration das erste define für ein FS20-device abgearbeitet wird. Da Ihre eigene Programmsammlung wahrscheinlich kein neues Gerät mit einem zugehörigen define-Befehl implementiert, würde sie also nie geladen, wenn ihr Name nicht mit 99_ beginnt. | ||
# Damit die neue Datei bei | # Damit die neue Datei bei 'Edit files' angezeigt wird, muss sie mit Utils.pm enden. Also zum Beispiel 99_meineUtils.pm | ||
# Der Name der Programmdatei muss mit dem Namen der Initialize-Routine übereinstimmen. Wenn Sie Ihr Programm also 99_Werkzeugkasten.pm nennen, muss die im code dargestellte initialize-Routine sub Werkzeugkasten_Initialize heißen. | # Der Name der Programmdatei muss mit dem Namen der Initialize-Routine übereinstimmen. Wenn Sie Ihr Programm also 99_Werkzeugkasten.pm nennen, muss die im code dargestellte initialize-Routine sub Werkzeugkasten_Initialize heißen. | ||
# Die Zeile <code> 1; </code> muss immer die letzte Programmzeile sein. Wenn Sie also eigene Routinen in Ihre Programmsammlung einfügen, tragen Sie diese zwischen dem Ende der Initialize-Routine und der abschließenden Zeile <code> 1; </code> ein. | # Die Zeile <code> 1; </code> muss immer die letzte Programmzeile sein. Wenn Sie also eigene Routinen in Ihre Programmsammlung einfügen, tragen Sie diese zwischen dem Ende der Initialize-Routine und der abschließenden Zeile <code> 1; </code> ein. | ||
Zeile 92: | Zeile 97: | ||
== Eigene Programmdatei laden == | == Eigene Programmdatei laden == | ||
Ihre Programmdatei wird nur bei | Ihre Programmdatei wird nur bei Fhem-start geladen - es sei denn Sie verwenden das Kommando reload. | ||
Also bearbeiten Sie Ihr Programm, speichern die Programmdatei, und weisen | Also bearbeiten Sie Ihr Programm, speichern die Programmdatei, und weisen Fhem dann an, die Programmdatei erneut zu laden. Der Befehl dazu, der in das [[Konfiguration|Befehl-Eingabefeld]] eingegeben wird, lautet: | ||
reload 99_myUtils.pm | reload 99_myUtils.pm | ||
Treten beim Laden (Syntax)fehler auf, werden diese am Bildschirm wie auch im Log angezeigt. Da der Ladevorgang fehlgeschlagen ist, stehen Ihre eigenen Routinen nun nicht zur Verfügung (bzw in der zuletzt erfolgreich geladenen Version). Beheben Sie also alle Fehler, speichern Sie Ihre Programmdatei erneut und führen Sie wieder ein reload aus. | Treten beim Laden (Syntax)fehler auf, werden diese am Bildschirm wie auch im Log angezeigt. Da der Ladevorgang fehlgeschlagen ist, stehen Ihre eigenen Routinen nun nicht zur Verfügung (bzw in der zuletzt erfolgreich geladenen Version). Beheben Sie also alle Fehler, speichern Sie Ihre Programmdatei erneut und führen Sie wieder ein reload aus. | ||
== Links == | == Links == | ||
* | * ... | ||
[[Kategorie:Code Snippets]] | [[Kategorie:Code Snippets]] |
Version vom 22. Februar 2015, 11:44 Uhr
Mit wachsender Anzahl von eigenen Helfer-Programmen wird die Speicherung von perl-code in notify unübersichtlich. Es besteht die Möglichkeit, eine eigene Programmdatei zu erzeugen, in der mehrere kleine Programme gesammelt und dann aus diversen notify- oder at-Anweisungen aufgerufen werden.
Eine neue Programmdatei erzeugen
Fhem enthält seit Updatestand 01/2015 eine Vorlage 'myUtilsTemplate.pm', die zur Erzeugung der Programmdatei genutzt werden sollte. Vorgehensweise:
- Fhem-Menüpunkt Edit files anklicken
- Weblink 'myUtilsTemplate.pm' anklicken
- Im Textfeld hinter 'Save as' den gewünschten Dateinamen für die Programmdatei (hier als Beispiel: '99_myUtils.pm') eintragen
- Save as anklicken
Nun ist die eigene Programmdatei '99_myUtils.pm' mit der notwendigen Grundstruktur unter dem Menüpunkt 'Edit files' zur Bearbeitung mit dem Integrierter Editor zu finden. Für eine einfache und fehlerminimierende Bearbeitung sollten die Syntaxhervorhebungs-, Befehlsauswahl- und Befehlsvervollständigungsfunktionen im Integrierten Editor eingeschaltet sein.
Für Experten ist auch die Nutzung eines Externen Editors zur Bearbeitung möglich, aber nicht empfohlen.
Eine ‚leere‘ Programmdatei muss grundsätzlich folgenden Grundstruktur besitzen:
package main; use strict; use warnings; use POSIX; sub myUtils_Initialize($$) { my ($hash) = @_; } 1;
Drei Dinge sind für Ihre Programmdatei besonders zu beachten:
- Der Dateiname muss mit 99_ beginnen. Fhem lädt beim Start alle Programmdateien mit dem prefix 99_. Andere Programmdateien werden erst dann geladen, wenn sie durch eine define-Anweisung in der Konfiguration angefordert werden. So wird z.B. 10_FS20.pm erst geladen, wenn beim Einlesen der Konfiguration das erste define für ein FS20-device abgearbeitet wird. Da Ihre eigene Programmsammlung wahrscheinlich kein neues Gerät mit einem zugehörigen define-Befehl implementiert, würde sie also nie geladen, wenn ihr Name nicht mit 99_ beginnt.
- Damit die neue Datei bei 'Edit files' angezeigt wird, muss sie mit Utils.pm enden. Also zum Beispiel 99_meineUtils.pm
- Der Name der Programmdatei muss mit dem Namen der Initialize-Routine übereinstimmen. Wenn Sie Ihr Programm also 99_Werkzeugkasten.pm nennen, muss die im code dargestellte initialize-Routine sub Werkzeugkasten_Initialize heißen.
- Die Zeile
1;
muss immer die letzte Programmzeile sein. Wenn Sie also eigene Routinen in Ihre Programmsammlung einfügen, tragen Sie diese zwischen dem Ende der Initialize-Routine und der abschließenden Zeile1;
ein.
Eigene Routinen einfügen
Als Beispiel dient das Umsetzen von FS20 toggle-Events aus dem Artikel "FS20 Toggle Events auf On/Off umsetzen". Das gesamte Programm sieht dann folgendermaßen aus:
package main; use strict; use warnings; use POSIX; sub myUtils_Initialize($$) { my ($hash) = @_; } ########################################################## # Untoggle # toggle-Vorgänge in den Status on/off umsetzen sub Untoggle($) { my ($obj) = @_; if( Value($obj) eq "toggle" ){ if( OldValue($obj) eq "off" ) { fhem( "setstate $obj on" ); } else { fhem( "setstate $obj off" ); } } else { fhem( "setstate $obj ".Value($obj) ); } } 1;
Der Aufruf erfolgt dann z.B. so:
#fhem.cfg define lampe_untoggle notify lampe {Untoggle(„@“)}
Der Aufruf aus einem notify (oder at) erfolgt als Perl-code, muss also in geschweiften Klammern stehen. Der Aufruf erfolgt durch Angabe des Namens der Routine (Untoggle) unter Angabe der zu übergebenden Parameter (hier "@"). Im Programm wurde die Routine Untoggle mit einem Parameter definiert ( Untoggle($) , die Anzahl der $-Zeichen bestimmt die Anzahl der zu übergebenden Parameter). Der Wert des übergebenen Parameters wird in der ersten Programmzeile in die Variable $obj übernommen (my ($obj) = @_; ). Der Aufruf erfolgt mit Untoggle(„@“) . Der Platzhalter @ in fhem steht für den Namen des Geräts. Im o.g. Beispiel erfolgt der Aufruf also eigentlich mit Untoggle(„lampe“). Natürlich können beim Aufruf auch feste Werte ( „lampe1“ ) oder Variablen ( $hour ) übergeben werden.
Routinen mit mehreren Parametern
In der Definition der Routine geben Sie außerdem an, wieviele Parameter übergeben werden sollen, für 2 Parameter z.B. so:
define test at *09:00 { wakeup($we, „Schlafzimmerlampe“) }
Die Deklaration der Routine in Ihrer Programmdatei muss dann so beginnen:
#Nur am Wochenende eingeschaltet sub wakeup($$) { my ($wochenende, $device) = @_; if ($wochenende) { fhem( "set $device on" ); } else { fhem( "set $device off" ); } }
Durch die Anzahl der $-Zeichen in der Routinen-Deklaration wird also die Anzahl der Parameter festgelegt. In der ersten Programmzeile Ihrer Routine übernehmen Sie dann die übergebenen Parameterwerte in lokale Variablen. Wie beim Routinen-Aufruf muss auch hierbei die Anzahl der Parameter mit der Routinen-Deklaration (also Anzahl der $-Zeichen) übereinstimmen.
Routinen ohne Parameter
Auch Routinen ohne Parameter sind natürlich möglich. Definition und Aufruf sehen dann folgendermassen aus:
sub parameterlos() { ... }
{ parameterlos() }
Eigene Programmdatei laden
Ihre Programmdatei wird nur bei Fhem-start geladen - es sei denn Sie verwenden das Kommando reload. Also bearbeiten Sie Ihr Programm, speichern die Programmdatei, und weisen Fhem dann an, die Programmdatei erneut zu laden. Der Befehl dazu, der in das Befehl-Eingabefeld eingegeben wird, lautet:
reload 99_myUtils.pm
Treten beim Laden (Syntax)fehler auf, werden diese am Bildschirm wie auch im Log angezeigt. Da der Ladevorgang fehlgeschlagen ist, stehen Ihre eigenen Routinen nun nicht zur Verfügung (bzw in der zuletzt erfolgreich geladenen Version). Beheben Sie also alle Fehler, speichern Sie Ihre Programmdatei erneut und führen Sie wieder ein reload aus.
Links
- ...