Cmdalias: Unterschied zwischen den Versionen
K (grep hinzugefügt) |
K (hmdead hinzugefügt) |
||
Zeile 75: | Zeile 75: | ||
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> | <source lang="perl">define c_shownotypedevices cmdalias shownotypedevices AS { join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</source> | ||
=== hmdead === | |||
Auflisten von Geräten die als "dead" von HMInfo markiert wurden | |||
<source lang="perl">defmod c_hmdead cmdalias hmdead AS list Activity=dead</source> | |||
=== v5 === | === v5 === |
Version vom 14. November 2016, 20:42 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
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.
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)}
hostname
Hostname des FHEM Rechners anzeigen
define c_hostname cmdalias hostname AS {(split('\.', qx(hostname)))[0]}
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 svn://svn.code.sf.net/p/fhem/code/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'
roomadd
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
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
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");;} }
Links
- Thread über das Modul im FHEM Forum
- Thread mit weiteren Informationen