Cmdalias: Unterschied zwischen den Versionen

Aus FHEMWiki
("Redaktionelle" Überarbeitung)
Zeile 1: Zeile 1:
{{SEITENTITEL:cmdalias}}
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM
|ModType=h
|ModType=cmd
|ModCmdRef=cmdalias
|ModForumArea=FHEM
|ModForumArea=FHEM
|ModTechName=98_cmdalias.pm
|ModTechName=98_cmdalias.pm
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]
|ModOwner={{Link2FU|8|Rudolf König}}
}}
}}


'''cmdalias''' ist ein Modul zum definieren von benutzerdefinierten Befehlen.  
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen.  


== Zielsetzung ==
== Zielsetzung ==
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.
Die jeweiligen Befehlsketten können mit ''cmdalias'' verkürzt oder sogar verändert werden.
Ein schönes Beispiel dafür ist, dass man sogar interne Befehle wie "shutdown restart" ersetzen kann
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie "shutdown restart" ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein "save" ausführt.
durch einen alias der genau so heißt aber noch zusätzlich z.B. ein "save" vorher ausführt.


== Einbindung in Fhem ==
== Einbindung in Fhem ==
 
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler '''ohne''' Zeilenumbrüche einzugeben.}}
<pre>define <name> cmdalias <cmd> [parameter] AS newcommand..."</pre>
:<code>define <name> cmdalias <cmd> [parameter] AS newcommand..."</code>


'''Beispieldefinition'''
'''Beispieldefinition'''
Zeile 23: Zeile 24:


== Aufruf in Fhem ==
== Aufruf in Fhem ==
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]
 
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]


[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]
== Beispiele ==
== Beispiele ==
Verkürzter Aufruf von list mit Wildcard Suche
Verkürzter Aufruf von list mit Wildcard Suche
<pre>define c_ls cmdalias ls .* AS list .*$EVENT.*</pre>
:<code>define c_ls cmdalias ls .* AS list .*$EVENT.*</code>


Auflisten von Geräten die in FHEM das Attribut "ignore" gesetzt haben:
Auflisten von Geräten, die in FHEM das Attribut "ignore" gesetzt haben:
<pre>define c_showignoreddevices cmdalias showignoreddevices AS { join("\n", grep { $attr{$_}{ignore} } sort keys %attr ) }</pre>
:<code>define c_showignoreddevices cmdalias showignoreddevices AS { join("\n", grep { $attr{$_}{ignore} } sort keys %attr ) }</code>


Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):
<pre>define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</pre>
:<code>define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</code>


Setzen des "Verbose Level" in FHEM auf 5
Setzen des "Verbose Level" in FHEM auf 5
<pre>define c_v5 cmdalias v5 .* AS {fhem ("attr ".($EVENT||="global")." verbose 5")}</pre>
:<code>define c_v5 cmdalias v5 .* AS {fhem ("attr ".($EVENT||="global")." verbose 5")}</code>


Setzen des "Verbose Level" in FHEM auf 3
Setzen des "Verbose Level" in FHEM auf 3
<pre>define c_v3 cmdalias v3 .* AS {fhem ("attr ".($EVENT||="global")." verbose 3")}</pre>
:<code>define c_v3 cmdalias v3 .* AS {fhem ("attr ".($EVENT||="global")." verbose 3")}</code>


In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden
<pre>define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off</pre>
:<code>define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off</code>


Verkürzter Befehlsaufruf des TTS Moduls
Verkürzter Befehlsaufruf des TTS Moduls
<pre>define c_say cmdalias say .* AS set MyTTS tts '$EVENT'</pre>
:<code>define c_say cmdalias say .* AS set MyTTS tts '$EVENT'</code>


Umbenennen eines FHEM Raumes '''Aufruf roomrename <oldroom> <newroom>'''
Umbenennen eines FHEM Raumes '''Aufruf roomrename <oldroom> <newroom>'''
<pre>define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array("room=$EVTPART0")){ map {s/$EVTPART0/$EVTPART1/;; fhem("attr $name room $_")} AttrVal($name,'room','') } }</pre>
:<code>define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array("room=$EVTPART0")){ map {s/$EVTPART0/$EVTPART1/;; fhem("attr $name room $_")} AttrVal($name,'room','') } }</code>


Löschen eines FHEM Raumes '''Aufruf: roomdelete <roomName>'''
Löschen eines FHEM Raumes '''Aufruf: roomdelete <roomName>'''
<pre>define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array("room=$EVENT")){ map { /^$EVENT$/ ? fhem("deleteattr $name room") : do{s/,$EVENT|$EVENT,//;; fhem("attr $name room $_")} } AttrVal($name,'room','') } }</pre>
:<code>define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array("room=$EVENT")){ map { /^$EVENT$/ ? fhem("deleteattr $name room") : do{s/,$EVENT|$EVENT,//;; fhem("attr $name room $_")} } AttrVal($name,'room','') } }</code>


Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen (mehrzeiliges Codebeispiel):
<pre>regroup <oldGroup> [<newGroup> [<FILTER>][|<FILTER2>]...]
<pre>regroup <oldGroup> [<newGroup> [<FILTER>][|<FILTER2>]...]


Zeile 86: Zeile 85:
# Devices ohne Gruppe aus dem Raum 'myRoom' mit dem TYPE 'CUL_HM' und welche ebenfalls 'Licht' im Namen enthalten die Gruppe 'myGroup' hinzufügen
# Devices ohne Gruppe aus dem Raum 'myRoom' mit dem TYPE 'CUL_HM' und welche ebenfalls 'Licht' im Namen enthalten die Gruppe 'myGroup' hinzufügen
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*</pre>
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*</pre>
<pre>define c_regroup cmdalias regroup .* AS { my @EVTPART=split(' ',$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array("group=".($EVTPART[0] ? $EVTPART[0] : '.*').($EVTPART[2] ? ":FILTER=$EVTPART[2]" : ''))){ map { ($_ && /^$EVTPART[0]$/ && !$EVTPART[1]) ? fhem("deleteattr $name group") : do{ if(!$EVTPART[1]){$EVTPART[0]=",$EVTPART[0]|$EVTPART[0],";; $EVTPART[1]='';;} s/$EVTPART[0]/$EVTPART[1]/;; fhem("attr $name group $_")} } AttrVal($name,'group',0) } }</pre>


Die zusätzlichen Gruppen in welchen sich die devices sonst noch befinden bleiben unberührt.
:<code><nowiki>define c_regroup cmdalias regroup .* AS { my @EVTPART=split(' ',$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array("group=".($EVTPART[0] ? $EVTPART[0] : '.*').($EVTPART[2] ? ":FILTER=$EVTPART[2]" : ''))){ map { ($_ && /^$EVTPART[0]$/ && !$EVTPART[1]) ? fhem("deleteattr $name group") : do{ if(!$EVTPART[1]){$EVTPART[0]=",$EVTPART[0]|$EVTPART[0],";; $EVTPART[1]='';;} s/$EVTPART[0]/$EVTPART[1]/;; fhem("attr $name group $_")} } AttrVal($name,'group',0) } }</nowiki></code>
Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.
 
Die zusätzlichen Gruppen, in welchen sich die devices sonst noch befinden, bleiben unberührt. Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.


Es sollte nur aufgepasst werden wenn ein "Device" mehrere ähnlichen Gruppenbennungen wie "attr name group test2,test" hat.
Es sollte nur aufgepasst werden, wenn ein "Device" mehrere ähnliche Gruppenbennungen wie "attr name group test2,test" hat. Wenn man hier ein 'regroup test test3' macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe 'test2' nach 'test32' umbenennt.
Wenn man hier ein 'regroup test test3' macht, könnte es passieren dass man dadurch bei diesem device die Gruppe 'test2' nach 'test32' umbenennt.
In dem Beispiel müsste man den Befehl z.B. mit 'regroup test$ test3' angeben, damit das nicht passiert.
In dem Beispiel müsste man den Befehl z.B. mit 'regroup test$ test3' angeben damit das nicht passiert.


== Links ==
== Links ==
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Version vom 18. Oktober 2015, 18:15 Uhr


cmdalias
Zweck / Funktion
Erstellen von Benutzer-definierten Befehlen in FHEM
Allgemein
Typ Befehl
Details
Dokumentation EN / DE
Support (Forum) FHEM
Modulname 98_cmdalias.pm
Ersteller Rudolf König
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Der Fhem-Befehl cmdalias dient zur Erstellung von benutzerdefinierten Befehlen.

Zielsetzung

Die jeweiligen Befehlsketten können mit cmdalias verkürzt oder sogar verändert werden. Ein schönes Beispiel dafür ist, dass sogar interne Befehle wie "shutdown restart" ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein "save" ausführt.

Einbindung in Fhem

Emblem-question-yellow.svgDie folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler ohne Zeilenumbrüche einzugeben.
define <name> cmdalias <cmd> [parameter] AS newcommand..."

Beispieldefinition

define s1 cmdalias shutdown update AS save;;shutdown
define s2 cmdalias set lamp .* AS { Log 1, "$EVENT";; fhem("set $EVENT") }

Aufruf in Fhem

Ausgabe Telnet

Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.

Ausgabe in FHEMWEB

Beispiele

Verkürzter Aufruf von list mit Wildcard Suche

define c_ls cmdalias ls .* AS list .*$EVENT.*

Auflisten von Geräten, die in FHEM das Attribut "ignore" gesetzt haben:

define c_showignoreddevices cmdalias showignoreddevices AS { join("\n", grep { $attr{$_}{ignore} } sort keys %attr ) }

Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):

define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }

Setzen des "Verbose Level" in FHEM auf 5

define c_v5 cmdalias v5 .* AS {fhem ("attr ".($EVENT||="global")." verbose 5")}

Setzen des "Verbose Level" in FHEM auf 3

define c_v3 cmdalias v3 .* AS {fhem ("attr ".($EVENT||="global")." verbose 3")}

In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden

define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off

Verkürzter Befehlsaufruf des TTS Moduls

define c_say cmdalias say .* AS set MyTTS tts '$EVENT'

Umbenennen eines FHEM Raumes Aufruf roomrename <oldroom> <newroom>

define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array("room=$EVTPART0")){ map {s/$EVTPART0/$EVTPART1/;; fhem("attr $name room $_")} AttrVal($name,'room',) } }

Löschen eines FHEM Raumes Aufruf: roomdelete <roomName>

define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array("room=$EVENT")){ map { /^$EVENT$/ ? fhem("deleteattr $name room") : do{s/,$EVENT|$EVENT,//;; fhem("attr $name room $_")} } AttrVal($name,'room',) } }

Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen (mehrzeiliges Codebeispiel):

regroup <oldGroup> [<newGroup> [<FILTER>][|<FILTER2>]...]

# Allen devices ohne group die Gruppe 'myGroup' setzen:
regroup 0 myGroup

# Nur den devices im Raum 'myRoom' welche keine group haben die Gruppe 'myGroup' setzen:
regroup 0 myGroup room=myRoom

# Alle devices aus 'oldGroup' in 'newGroup' verschieben
regroup oldGroup newGroup

# Nur die devices im Raum 'myRoom' aus 'oldGroup' in 'newGroup' verschieben
regroup oldGroup newGroup room=myRoom

# Gruppe 'myGroup' löschen
regroup myGroup

# Nur die devices im Raum 'myRoom' aus der Gruppe 'myGroup' löschen.
regroup myGroup 0 room=myRoom

# Devices aus allen Gruppen welche mit 'licht' beginnen aus Raum 'Obergeschoss' entfernen.
regroup licht.* 0 room=Obergeschoss

# Devices aus dem Raum 'myRoom'  aus allen Gruppen entfernen und in die Gruppe 'myGroup' verschieben.
regroup .* myGroup room=myRoom

# Devices ohne Gruppe aus dem Raum 'myRoom' mit dem TYPE 'CUL_HM' und welche ebenfalls 'Licht' im Namen enthalten die Gruppe 'myGroup' hinzufügen
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*
define c_regroup cmdalias regroup .* AS { my @EVTPART=split(' ',$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array("group=".($EVTPART[0] ? $EVTPART[0] : '.*').($EVTPART[2] ? ":FILTER=$EVTPART[2]" : ''))){ map { ($_ && /^$EVTPART[0]$/ && !$EVTPART[1]) ? fhem("deleteattr $name group") : do{ if(!$EVTPART[1]){$EVTPART[0]=",$EVTPART[0]|$EVTPART[0],";; $EVTPART[1]='';;} s/$EVTPART[0]/$EVTPART[1]/;; fhem("attr $name group $_")} } AttrVal($name,'group',0) } }

Die zusätzlichen Gruppen, in welchen sich die devices sonst noch befinden, bleiben unberührt. Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.

Es sollte nur aufgepasst werden, wenn ein "Device" mehrere ähnliche Gruppenbennungen wie "attr name group test2,test" hat. Wenn man hier ein 'regroup test test3' macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe 'test2' nach 'test32' umbenennt. In dem Beispiel müsste man den Befehl z.B. mit 'regroup test$ test3' angeben, damit das nicht passiert.

Links