Cmdalias: Unterschied zwischen den Versionen

Aus FHEMWiki
K (hmdead hinzugefügt)
(→‎grep: Ergänzung zu grep eingefügt)
 
(8 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 13: Zeile 13:
== Zielsetzung ==
== Zielsetzung ==
Die jeweiligen Befehlsketten können mit ''cmdalias'' verkürzt 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 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.
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FHEM Befehl|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 ==
== Einbindung in FHEM ==
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler '''ohne''' Zeilenumbrüche einzugeben.}}
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler '''ohne''' Zeilenumbrüche einzugeben.}}
<source lang="perl">define <name> cmdalias <cmd> [parameter] AS newcommand..."</source>
<syntaxhighlight lang="perl">define <name> cmdalias <cmd> [parameter] AS newcommand..."</syntaxhighlight>


'''Beispieldefinition'''
'''Beispieldefinition'''
<source lang="perl">define s1 cmdalias shutdown update AS save;;shutdown</source>
<syntaxhighlight lang="perl">define s1 cmdalias shutdown update AS save;;shutdown</syntaxhighlight>
<source lang="perl">define s2 cmdalias set lamp .* AS { Log 1, "$EVENT";; fhem("set $EVENT") }</source>
<syntaxhighlight lang="perl">define s2 cmdalias set lamp .* AS { Log 1, "$EVENT";; fhem("set $EVENT") }</syntaxhighlight>


== Aufruf in Fhem ==
== Aufruf in FHEM ==
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]
<div class="tleft" style="clear:none">[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]</div>
<div class="tleft" style="clear:none">[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]</div>
<onlyinclude><div style="clear:both;"></div></onlyinclude>
<onlyinclude>
<div style="clear:both;"></div>
</onlyinclude>


== Beispiele ==
== Beispiele ==
=== setex ===
=== setex ===
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist
<source lang="perl">define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1</source>
<syntaxhighlight lang="perl">define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1</syntaxhighlight>


=== ls ===
=== ls ===
Verkürzter Aufruf von list mit Wildcard Suche
Verkürzter Aufruf von list mit Wildcard Suche
<source lang="perl">define c_ls cmdalias ls .* AS list .*$EVENT.*</source>
<syntaxhighlight lang="perl">define c_ls cmdalias ls .* AS list .*$EVENT.*</syntaxhighlight>




=== grep ===
=== grep ===
Durchsuchen der FHEM Dateien nach einem Schlüsselwort
Durchsuchen der FHEM Dateien nach einem Schlüsselwort
<source lang="perl">define c_grep cmdalias grep .* AS {qx(grep -i \'$EVENT\' *.cfg FHEM/99*.pm)}</source>
<syntaxhighlight lang="perl">define c_grep cmdalias grep .* AS {qx(grep -i \'$EVENT\' *.cfg FHEM/99*.pm)}</syntaxhighlight>Mit Anzeige des zugehörigen define<syntaxhighlight lang="perl">
defmod c_grep cmdalias grep .* AS {qx(grep -inE \'$EVENT|define\' *.cfg FHEM/99*.pm|grep -i -B 1 \'$EVENT\')}
</syntaxhighlight>


=== hostname ===
=== hostname ===
Hostname des FHEM Rechners anzeigen
Hostname des FHEM Rechners anzeigen
<source lang="perl">define c_hostname cmdalias hostname AS {(split('\.', qx(hostname)))[0]}</source>
<syntaxhighlight lang="perl">define c_hostname cmdalias hostname AS {(split('\.', qx(hostname)))[0]}</syntaxhighlight>


=== svnupdate ===
=== svnupdate ===
{{Randnotiz|RNTyp=Warn|RNText='''Warnhinweis zu svnupdate'''<br>Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen "svn update" werden die Funktionen des FHEM-Befehls update nicht aufgerufen (Anzeige CHANGE.txt, Backup, Generierung aktuelle commandref, Aufräum- und Verschiebeaktionen bei der FHEM-Installation,..). Funktioneinschränkungen und -störungen von FHEM könnten die Folge sein. Bitte svn-update nur bei genauer Kenntnis der Folgewirkungen nutzen. Bei Anfragen im Forum ist auf die Nutzung von svn-update hinzuweisen. }}
{{Randnotiz|RNTyp=Warn|RNText='''Warnhinweis zu svnupdate'''<br>Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen "svn update" werden die Funktionen des FHEM-Befehls update nicht aufgerufen (Anzeige CHANGE.txt, Backup, Generierung aktuelle commandref, Aufräum- und Verschiebeaktionen bei der FHEM-Installation,..). Funktioneinschränkungen und -störungen von FHEM könnten die Folge sein. Bitte svn-update nur bei genauer Kenntnis der Folgewirkungen nutzen. Bei Anfragen im Forum ist auf die Nutzung von svn-update hinzuweisen. }}
Direktes FHEM Update mit Hilfe der aktuellen SVN Version  
Direktes FHEM Update mit Hilfe der aktuellen SVN Version  
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch <source lang="perl">sudo apt-get install subversion</source>
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch <syntaxhighlight lang="perl">sudo apt-get install subversion</syntaxhighlight>
Danach einmal die FHEM Version auschecken mit <source lang="perl">cd /opt
Danach einmal die FHEM Version auschecken mit <syntaxhighlight lang="perl">cd /opt
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem</source>
   svn checkout https://svn.fhem.de/fhem/trunk/fhem fhem</syntaxhighlight>
<source lang="perl">define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }</source>
<syntaxhighlight lang="perl">define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }</syntaxhighlight>


=== atexec ===
=== atexec ===
Triggert einen AT Timer
Triggert einen AT Timer
Aufruf mit <source lang="perl">atexec <at-device-name></source>
Aufruf mit <syntaxhighlight lang="perl">atexec <at-device-name></syntaxhighlight>
<source lang="perl">define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}->{TYPE} eq "at") { at_Exec($defs{$EVENT});; 0;; } else { return "$EVENT is not of TYPE at!";; }} else { return "Device $EVENT does not exist!";; }}</source>
<syntaxhighlight lang="perl">define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}->{TYPE} eq "at") { at_Exec($defs{$EVENT});; 0;; } else { return "$EVENT is not of TYPE at!";; }} else { return "Device $EVENT does not exist!";; }}</syntaxhighlight>


=== dellog ===
=== dellog ===
Leert das aktuelle FHEM Logfile
Leert das aktuelle FHEM Logfile
<source lang="perl">define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, "Logfile gelöscht";;}</source>
<syntaxhighlight lang="perl">define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, "Logfile gelöscht";;}</syntaxhighlight>


=== lastloglines ===
=== lastloglines ===
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf <source lang="perl">lastloglines 10</source> werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf <syntaxhighlight lang="perl">lastloglines 10</syntaxhighlight> werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:
<source lang="perl">define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}</source>
<syntaxhighlight lang="perl">define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}</syntaxhighlight>


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


=== shownotypedevices ===
=== shownotypedevices ===
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):
<source lang="perl">define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</source>
<syntaxhighlight lang="perl">define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</syntaxhighlight>


=== hmdead ===
=== hmdead ===
Auflisten von Geräten die als "dead" von HMInfo markiert wurden
Auflisten von Geräten die als "dead" von HMInfo markiert wurden
<source lang="perl">defmod c_hmdead cmdalias hmdead AS list Activity=dead</source>
<syntaxhighlight lang="perl">defmod c_hmdead cmdalias hmdead AS list Activity=dead</syntaxhighlight>


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


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


=== Änderung von Geräte Aktionen ===
=== Änderung von Geräte Aktionen ===
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
<source lang="perl">define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off</source>
<syntaxhighlight lang="perl">define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off</syntaxhighlight>


=== say ===
=== say ===
Verkürzter Befehlsaufruf des TTS Moduls
Verkürzter Befehlsaufruf des TTS Moduls
<source lang="perl">define c_say cmdalias say .* AS set MyTTS tts '$EVENT'</source>
<syntaxhighlight lang="perl">define c_say cmdalias say .* AS set MyTTS tts '$EVENT'</syntaxhighlight>
 
=== mqttmsg ===
Schickt eine Nachricht an einen Mosquitto Message Broker
<syntaxhighlight lang="perl">define c_mqttmsg cmdalias mqttmsg .* AS {qx(/usr/bin/mosquitto_pub -h 192.168.1.101 -t \'$EVTPART0\' -m \'$EVTPART1\')}</syntaxhighlight>
 
Aufruf mit:
<syntaxhighlight lang="perl">mqttmsg <TOPIC> <MESSAGE></syntaxhighlight>
 
'''Hinweis: IP des Brokers muss angepasst werden!'''
 
 


=== roomadd ===
=== roomadd ===
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -a beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.
 
Aufruf: <syntaxhighlight lang="perl">roomadd <devspec> <new_room></syntaxhighlight>
Aufruf: <source lang="perl">roomadd <devspec> <new_room></source>
<syntaxhighlight lang="perl">define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array("$EVTPART0")){ my $old_room = AttrVal($name,'room','');; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,'room','') . ",$EVTPART1";; fhem("attr $name room $new_room")} } }</syntaxhighlight>
<source lang="perl">define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array("$EVTPART0")){ my $old_room = AttrVal($name,'room','');; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,'room','') . ",$EVTPART1";; fhem("attr $name room $new_room")} } }</source>


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


=== roomdelete ===
=== roomdelete ===
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -r beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}
Löschen eines FHEM Raumes '''Aufruf: roomdelete <roomName>'''
Löschen eines FHEM Raumes '''Aufruf: roomdelete <roomName>'''
<source lang="perl">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','') } }</source>
<syntaxhighlight lang="perl">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','') } }</syntaxhighlight>


=== regroup ===
=== regroup ===
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen


<source lang="perl">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) } }</source>
<syntaxhighlight lang="perl">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) } }</syntaxhighlight>


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.
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.


Beispiele:
Beispiele:
Zeile 149: Zeile 165:
=== autocreate ===
=== autocreate ===
Schnelles (de)aktivieren der [[autocreate]] Funktion:
Schnelles (de)aktivieren der [[autocreate]] Funktion:
<source lang="perl">
<syntaxhighlight lang="perl">
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0
</source>
</syntaxhighlight>


Optional kann noch das autocreate Icon definiert werden:
Optional kann noch das autocreate Icon definiert werden:
<source lang="perl">attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off</source>
<syntaxhighlight lang="perl">attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off</syntaxhighlight>


=== renamehm ===
=== renamehm ===
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (''set'') [[rename|deviceRename]] anbieten}}
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (''set'') [[rename|deviceRename]] anbieten}}
Sehr viele HomeMatic Devices haben zusätzlichen Kanäle (z.B: HM-ES-PMSw1-PI legt die Kanäle HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw als separate Devices an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via "<code>renamehm HM_12345B NEW_DEVICE_PREFIX</code>" ausgeführt:
Sehr viele HomeMatic Devices haben zusätzlichen Kanäle (z.B: HM-ES-PMSw1-PI legt die Kanäle HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw als separate Devices an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via "<code>renamehm HM_12345B NEW_DEVICE_PREFIX</code>" ausgeführt:
<source lang="perl">define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array("$EVTPART0.*")){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem("rename $name $newname");;} }</source>
<syntaxhighlight lang="perl">define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array("$EVTPART0.*")){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem("rename $name $newname");;} }</syntaxhighlight>
 
=== alias2siriname ===
Mit dem folgenden Alias wird das Attribut siriName aller sich im Raum Homekit befindlichen Geräte auf den selben Wert des Attributes alias gesetzt.
<syntaxhighlight lang="perl">define c_alias2siriname cmdalias alias2siriname .* AS { for (devspec2array("room=Homekit*")) { my $a = AttrVal($_,"alias",undef);; fhem "attr $_ siriName $a" if (defined $a) }}</syntaxhighlight>


== Links ==
== Links ==

Aktuelle Version vom 4. November 2022, 10:34 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

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

Ausgabe Telnet
Ausgabe in FHEMWEB


Beispiele

setex

Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist

define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1

ls

Verkürzter Aufruf von list mit Wildcard Suche

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


grep

Durchsuchen der FHEM Dateien nach einem Schlüsselwort

define c_grep cmdalias grep .* AS {qx(grep -i \'$EVENT\' *.cfg FHEM/99*.pm)}

Mit Anzeige des zugehörigen define

defmod c_grep cmdalias grep .* AS {qx(grep -inE \'$EVENT|define\' *.cfg FHEM/99*.pm|grep -i -B 1 \'$EVENT\')}

hostname

Hostname des FHEM Rechners anzeigen

define c_hostname cmdalias hostname AS {(split('\.', qx(hostname)))[0]}

svnupdate

Emblem-question-yellow.svgWarnhinweis zu svnupdate
Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl update verwendet werden. Bei Nutzung des hier vorgeschlagenen "svn update" werden die Funktionen des FHEM-Befehls update nicht aufgerufen (Anzeige CHANGE.txt, Backup, Generierung aktuelle commandref, Aufräum- und Verschiebeaktionen bei der FHEM-Installation,..). Funktioneinschränkungen und -störungen von FHEM könnten die Folge sein. Bitte svn-update nur bei genauer Kenntnis der Folgewirkungen nutzen. Bei Anfragen im Forum ist auf die Nutzung von svn-update hinzuweisen.

Direktes FHEM Update mit Hilfe der aktuellen SVN Version

Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch

sudo apt-get install subversion

Danach einmal die FHEM Version auschecken mit

cd /opt
   svn checkout https://svn.fhem.de/fhem/trunk/fhem fhem
define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }

atexec

Triggert einen AT Timer

Aufruf mit

atexec <at-device-name>
define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}->{TYPE} eq "at") { at_Exec($defs{$EVENT});; 0;; } else { return "$EVENT is not of TYPE at!";; }} else { return "Device $EVENT does not exist!";; }}

dellog

Leert das aktuelle FHEM Logfile

define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, "Logfile gelöscht";;}

lastloglines

Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf

lastloglines 10

werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:

define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}

showignoreddevices

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 ) }

shownotypedevices

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) }

hmdead

Auflisten von Geräten die als "dead" von HMInfo markiert wurden

defmod c_hmdead cmdalias hmdead AS list Activity=dead

v5

Setzen des "Verbose Level" in FHEM auf 5

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

v3

Setzen des "Verbose Level" in FHEM auf 3

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

Änderung von Geräte Aktionen

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

say

Verkürzter Befehlsaufruf des TTS Moduls

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

mqttmsg

Schickt eine Nachricht an einen Mosquitto Message Broker

define c_mqttmsg cmdalias mqttmsg .* AS {qx(/usr/bin/mosquitto_pub -h 192.168.1.101 -t \'$EVTPART0\' -m \'$EVTPART1\')}

Aufruf mit:

mqttmsg <TOPIC> <MESSAGE>

Hinweis: IP des Brokers muss angepasst werden!


roomadd

Info green.pngBeachte auch die seit Updatestand 28.01.2018 vorhandene Option -a beim Befehl attr (siehe Thema)

Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.

Aufruf:

roomadd <devspec> <new_room>
define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array("$EVTPART0")){ my $old_room = AttrVal($name,'room','');; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,'room','') . ",$EVTPART1";; fhem("attr $name room $new_room")} } }

roomrename

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','') } }

roomdelete

Info green.pngBeachte auch die seit Updatestand 28.01.2018 vorhandene Option -r beim Befehl attr (siehe Thema)

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','') } }

regroup

Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen

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.

Beispiele:

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.*

autocreate

Schnelles (de)aktivieren der autocreate Funktion:

define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0

Optional kann noch das autocreate Icon definiert werden:

attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off

renamehm

Info green.pngDieser Alias ist mittlerweile nicht mehr erforderlich, da HomeMatic Devices den Befehl (set) deviceRename anbieten

Sehr viele HomeMatic Devices haben zusätzlichen Kanäle (z.B: HM-ES-PMSw1-PI legt die Kanäle HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw als separate Devices an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via "renamehm HM_12345B NEW_DEVICE_PREFIX" ausgeführt:

define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array("$EVTPART0.*")){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem("rename $name $newname");;} }

alias2siriname

Mit dem folgenden Alias wird das Attribut siriName aller sich im Raum Homekit befindlichen Geräte auf den selben Wert des Attributes alias gesetzt.

define c_alias2siriname cmdalias alias2siriname .* AS { for (devspec2array("room=Homekit*")) { my $a = AttrVal($_,"alias",undef);; fhem "attr $_ siriName $a" if (defined $a) }}

Links