<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stormmurdoc</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stormmurdoc"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Stormmurdoc"/>
	<updated>2026-04-13T19:10:12Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=33225</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=33225"/>
		<updated>2020-05-14T12:19:52Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: alias2siriname hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FHEM Befehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in FHEM ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== setex ===&lt;br /&gt;
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ls ===&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep ===&lt;br /&gt;
Durchsuchen der FHEM Dateien nach einem Schlüsselwort&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_grep cmdalias grep .* AS {qx(grep -i \&#039;$EVENT\&#039; *.cfg FHEM/99*.pm)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostname ===&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== svnupdate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;Warnhinweis zu svnupdate&#039;&#039;&#039;&amp;lt;br&amp;gt;Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen &amp;quot;svn update&amp;quot; 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. }}&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout https://svn.fhem.de/fhem/trunk/fhem fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== atexec ===&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dellog ===&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== lastloglines ===&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/syntaxhighlight&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== showignoreddevices ===&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== shownotypedevices ===&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hmdead ===&lt;br /&gt;
Auflisten von Geräten die als &amp;quot;dead&amp;quot; von HMInfo markiert wurden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;defmod c_hmdead cmdalias hmdead AS list Activity=dead&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v5 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v3 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung von Geräte Aktionen ===&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== say ===&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mqttmsg ===&lt;br /&gt;
Schickt eine Nachricht an einen Mosquitto Message Broker&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_mqttmsg cmdalias mqttmsg .* AS {qx(/usr/bin/mosquitto_pub -h 192.168.1.101 -t \&#039;$EVTPART0\&#039; -m \&#039;$EVTPART1\&#039;)}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf mit: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;mqttmsg &amp;lt;TOPIC&amp;gt; &amp;lt;MESSAGE&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: IP des Brokers muss angepasst werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== roomadd ===&lt;br /&gt;
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -a beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
Aufruf: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomrename ===&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomdelete ===&lt;br /&gt;
{{Randnotiz|RNText=Beachte auch die seit Updatestand 28.01.2018 vorhandene Option -r beim Befehl {{Link2CmdRef|Anker=attr|Label=attr}} (siehe {{Link2Forum|Topic=83414}}) }}&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== regroup ===&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocreate ===&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== renamehm ===&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== alias2siriname ===&lt;br /&gt;
Mit dem folgenden Alias wird das Attribut siriName aller sich im Raum Homekit befindlichen Geräte auf den selben Wert des Attributes alias gesetzt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define c_alias2siriname cmdalias alias2siriname .* AS { for (devspec2array(&amp;quot;room=Homekit*&amp;quot;)) { my $a = AttrVal($_,&amp;quot;alias&amp;quot;,undef);; fhem &amp;quot;attr $_ siriName $a&amp;quot; if (defined $a) }}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=21687</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=21687"/>
		<updated>2017-06-10T13:52:48Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ mqttmsg hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FHEM Befehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in FHEM ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== setex ===&lt;br /&gt;
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ls ===&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep ===&lt;br /&gt;
Durchsuchen der FHEM Dateien nach einem Schlüsselwort&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_grep cmdalias grep .* AS {qx(grep -i \&#039;$EVENT\&#039; *.cfg FHEM/99*.pm)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostname ===&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== svnupdate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;Warnhinweis zu svnupdate&#039;&#039;&#039;&amp;lt;br&amp;gt;Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen &amp;quot;svn update&amp;quot; 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. }}&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout https://svn.fhem.de/fhem/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== atexec ===&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dellog ===&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== lastloglines ===&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== showignoreddevices ===&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== shownotypedevices ===&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hmdead ===&lt;br /&gt;
Auflisten von Geräten die als &amp;quot;dead&amp;quot; von HMInfo markiert wurden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;defmod c_hmdead cmdalias hmdead AS list Activity=dead&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v5 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v3 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung von Geräte Aktionen ===&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== say ===&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mqttmsg ===&lt;br /&gt;
Schickt eine Nachricht an einen Mosquitto Message Broker&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_mqttmsg cmdalias mqttmsg .* AS {qx(/usr/bin/mosquitto_pub -h 192.168.1.101 -t \&#039;$EVTPART0\&#039; -m \&#039;$EVTPART1\&#039;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf mit: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;mqttmsg &amp;lt;TOPIC&amp;gt; &amp;lt;MESSAGE&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis: IP des Brokers muss angepasst werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== roomadd ===&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomrename ===&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomdelete ===&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== regroup ===&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocreate ===&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== renamehm ===&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=17281</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=17281"/>
		<updated>2016-11-14T19:42:21Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: hmdead hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== setex ===&lt;br /&gt;
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ls ===&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep ===&lt;br /&gt;
Durchsuchen der FHEM Dateien nach einem Schlüsselwort&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_grep cmdalias grep .* AS {qx(grep -i \&#039;$EVENT\&#039; *.cfg FHEM/99*.pm)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostname ===&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== svnupdate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;Warnhinweis zu svnupdate&#039;&#039;&#039;&amp;lt;br&amp;gt;Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen &amp;quot;svn update&amp;quot; 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. }}&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== atexec ===&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dellog ===&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== lastloglines ===&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== showignoreddevices ===&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== shownotypedevices ===&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hmdead ===&lt;br /&gt;
Auflisten von Geräten die als &amp;quot;dead&amp;quot; von HMInfo markiert wurden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;defmod c_hmdead cmdalias hmdead AS list Activity=dead&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v5 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v3 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung von Geräte Aktionen ===&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== say ===&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomadd ===&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomrename ===&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomdelete ===&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== regroup ===&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocreate ===&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== renamehm ===&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=16470</id>
		<title>XBMC</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=16470"/>
		<updated>2016-10-03T08:01:21Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Lichtsteuerung durch KODI oder PLEX */ Link gefixt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Abspielen von Medien (Musik, Video, Bilder)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_XBMC.pm&lt;br /&gt;
|ModOwner={{Link2FU|6776|vbs}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KODI&#039;&#039;&#039; (früher XBox Media Center (XBMC) genannt) ist eine unter den Bestimmungen der GPL erhältliche freie Media-Center Software. Sie dient dem Abspielen von Videos, Bildern und Musik von DVD, Festplatte und Server sowie der Wiedergabe von Audio- und Video-Datenströmen aus dem Internet. (Quelle: [http://kodi.tv/ kodi.tv])&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Media-Center System, das mit diesem Modul zusammenarbeitet, ist das aus einem XBMC Fork entstandene [https://plex.tv PLEX Media-Server] System.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Versionen von Plex Home Theater haben nur noch eine sehr eingeschränkte Kompatibilität zum XBMC/KODI API und zeigen z.B. keine Informationen mehr über die aktuell gespielten Medien an. Die Beta-Version eines plex-spezifischen Moduls wird in diesem {{Link2Forum|Topic=43052|Message=353477|LinkText=Post im Forum}} vorgestellt. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Dieses Modul ermöglicht das Steuern und Empfangen von Events von KODI und PLEX. Unter anderen sind damit vielfältige Verknüpfungen von Aktoren und &lt;br /&gt;
XBMC/Plex möglich.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Plex Home Theater (PHT) Versionen (ab etwa mitte November)  liefern keine Informationen mehr zum abgespielten Titel (currentTitle,currentAlbum,...) sondern nur noch zum TransportState. Der Grund dafür ist noch nicht klar.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
Für diese Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit &lt;br /&gt;
dem folgenden Befehl installieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define wz_XBMC XBMC &amp;lt;IP-Adresse&amp;gt; tcp &amp;lt;USERNAME&amp;gt; &amp;lt;PASSWORT&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wz_XBMC devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
JSON RPC muss aktiviert sein. Näheres siehe hier: http://wiki.xbmc.org/index.php?title=JSON-RPC_API#Enabling_JSON-RPC&lt;br /&gt;
Danach sollte ein Neustart von Kodi durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Erfolgreich getestet unter den Versionen&lt;br /&gt;
&#039;&#039;KODI 14 und fhem 5.6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lichtsteuerung durch KODI oder PLEX ===&lt;br /&gt;
Im folgenden Beispiel werden beim Starten eines Films die Lichter ausgeschaltet. Sobald die Pause-Taste gedrückt wird, wird das Licht wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define notify_KODI_status notify wz_KODI:playStatus.* { if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;movie&amp;quot;){&lt;br /&gt;
   if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;playing&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht off&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;paused&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht on&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Moduls [[LightScene]] kann man den voherigen Status der einzelnen Lampen auch speichern und nach dem Filmende wiederherstellen.&lt;br /&gt;
Anbei ein Code Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wz_KODI:playStatus.* {&lt;br /&gt;
  my $media = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;currentMedia&amp;quot;,&amp;quot;none&amp;quot;);&lt;br /&gt;
  my $isPlaying = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;playStatus&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;playing&amp;quot;;&lt;br /&gt;
  my $is3d = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;3dfile&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;on&amp;quot;;&lt;br /&gt;
  my $currentLightScene = Value(&amp;quot;kino_licht&amp;quot;);&lt;br /&gt;
  Log 3, &amp;quot;Wiedergegebene Datei: &amp;quot; . $media . &amp;quot; isPlaying: &amp;quot; . $isPlaying. &amp;quot; is3d: &amp;quot; . $is3d . &amp;quot; currentLightScene: &amp;quot; . $currentLightScene;&lt;br /&gt;
  if ($is3d &amp;amp;&amp;amp; $isPlaying) {&lt;br /&gt;
     if ($currentLightScene ne &amp;quot;3d_movie&amp;quot;) {        &lt;br /&gt;
        Log 3, &amp;quot;Speichere aktuellen Zustand als temporäre Szene und ändere kino_licht scene auf 3d_movie...&amp;quot;;&lt;br /&gt;
        fhem(&amp;quot;set kino_licht save tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
        fhem(&amp;quot;set kino_licht scene 3d_movie;&amp;quot;);        &lt;br /&gt;
     }&lt;br /&gt;
  } elsif ($is3d &amp;amp;&amp;amp; $currentLightScene eq &amp;quot;3d_movie&amp;quot;) {&lt;br /&gt;
     Log 3, &amp;quot;Der Film ist pausiert oder zu Ende, ändere LightScene zurück auf tmp_pre_movie_state...&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;set kino_licht scene tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set kino_licht remove tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel mit dem Modul DOIF:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# Kodi: Lichtsteuerung&lt;br /&gt;
#########################################################################&lt;br /&gt;
define di_kodi_lichtsteuerung DOIF &lt;br /&gt;
(&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;playing&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)  &lt;br /&gt;
 (set ls_Erdgeschoss scene Filmstart)&lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;paused&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and &lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)&lt;br /&gt;
 (set ls_Erdgeschoss scene Filmpause) &lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;stopped&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
) &lt;br /&gt;
 (set ls_Erdgeschoss scene indirekt)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen dazu unter im Forenthread {{Link2Forum|Topic=32775|LinkText=Fragen zu LightScene}}&lt;br /&gt;
&lt;br /&gt;
Alternative Lichtsteuerung in Abhängigkeit der Helligkeit {{Link2Forum|Topic=58381|LinkText=Lichtsteuerung in Abhängigkeit von Dämmerung und Fernseher / Mediaplayer}}&lt;br /&gt;
&lt;br /&gt;
=== Nachrichten von Fhem an KODI und PLEX schicken ===&lt;br /&gt;
Der folgende Befehl schickt eine 5 Sekunden lange Info Nachricht an KODI.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&amp;quot;set wz_KODI msg &#039;fhem&#039; &#039;Licht wurde ausgeschaltet!&#039; 5000 info&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Thumbnail im Frontend anzeigen ===&lt;br /&gt;
In den readings von KODI gibt es einen thumbnail Wert. Um diesen als http link in einem http basierten Frontend darstellen zu können muss allerdings ein Userreading erstellt werden, denn der Pfad für http muss doppelt encoded werden. D.h. aus dem %2f muss ein %252f gemacht. Zusätzlich muss dem Wert noch ein http://IP_KODI:PORT_WEBSERVICE/image/ vorangestellt werden. Das funktioniert aber nur wenn die Bilder lokal abgelegt sind, nicht wenn die Bilder von z.b. thetvdb.com kommen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;http_thumbnail { my $val = (ReadingsVal(&amp;quot;$name&amp;quot;, &amp;quot;thumbnail&amp;quot;, 0)); $val =~ s/\%2f/\%252f/g;; return &amp;quot;http://192.168.0.5:8080/image/&amp;quot;.$val;; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschliessend kann http_thumbnail abgefragt werden und enthaelt den Link zum Bild&lt;br /&gt;
&lt;br /&gt;
== Anzeigen von Fhem Daten im KODI ==&lt;br /&gt;
[[Datei:Xbmc.png|mini|right|300px|Fhem-Daten in KODI anzeigen]]&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in KODI ===&lt;br /&gt;
Zuerst muss das Phyton Skript heruntergeladen werden ([http://forum.fhem.de/index.php?topic=14419.0 Thread im Fhem-Forum]) und mit dem XBMC Addon Manager installiert werden. &lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in Fhem ===&lt;br /&gt;
Anschließend muss das globale Attribut userattr mit &amp;quot;xbmcInfo&amp;quot; erweitert werden, und zwar entweder durch Bearbeitung der [[Konfiguration|Fhem Konfiguration]] oder durch Eingabe des Befehls&lt;br /&gt;
:&amp;lt;code&amp;gt;{fhem (&amp;quot;attr global userattr $attr{global}{userattr}&amp;quot;.&amp;quot; xbmcInfo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
in das Fhem Befehlsfenster.&lt;br /&gt;
&lt;br /&gt;
Danach muss ein Dummy mit den anzuzeigenden Daten erstellt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;dummy-name&amp;gt; xbmcInfo &amp;lt;TYPE&amp;gt; &amp;lt;Reading[|Alias]&amp;gt; &amp;lt;[Reading[|Alias]]&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration in KODI ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info3.png|mini|right|200px|Konfigurationsschritt in KODI]]&lt;br /&gt;
Im KODI danach noch das &#039;&#039;Addon&#039;&#039; konfiguren (IP+Passwort). &lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info1.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
[[Datei:FHEM-Info2.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define KODI_dummy dummy&lt;br /&gt;
attr KODI_dummy xbmcInfo CUL_WS temperature|Temperatur humidity|Luftfeuchte&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy2 dummy&lt;br /&gt;
attr KODI_dummy2 xbmcInfo PID20 actuation|Ventil desired|Soll measured|Ist delta p_p|P-Anteil p_i|I-Anteil&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy3 dummy&lt;br /&gt;
attr KODI_dummy3 xbmcInfo FS20 state|Status name|Name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== HTPC via WakeOnLan (WOL) Funktion wecken ===&lt;br /&gt;
Einige HTPCs haben nicht die Möglichkeit diese via eines IR Kommandos zu starten. Alternativ kann hier die &lt;br /&gt;
sog. &amp;quot;WakeOnLan&amp;quot; Funktion genutzt werden. Diese bietes mittels eines speziellen TCP/UDP Paketes den Rechner zu starten. In Fhem gibt es dafür das Modul [[WOL]].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;NAME des PCs&amp;gt; WOL &amp;lt;MAC-Adresse&amp;gt;	&amp;lt;IP&amp;gt; [&amp;lt;mode&amp;gt; [&amp;lt;repeat&amp;gt;]] &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# KODI - WakeOnLan Funktion&lt;br /&gt;
#########################################################################&lt;br /&gt;
define wol_zion WOL BC:AE:C5:B3:E1:3A	 192.168.1.13 EW&lt;br /&gt;
attr wol_zion room _System&lt;br /&gt;
attr wol_zion sysCmd ./ether-wake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweis bei Betrieb auf einer Fritzbox&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sofern fhem nicht unter dem User root wird das ether-wake Kommando nicht funktionieren.&lt;br /&gt;
&#039;&#039;Quick&amp;amp;Dirty Workaround: Mit Telnet auf der FritzBox einloggen und dann das Programm /usr/bin/ether-wake &lt;br /&gt;
in das fhem-Hauptverzeichnis kopieren. Zusätzlich muss das sog. &amp;quot;Sticky-Bit&amp;quot; mit dem Befehl &#039;chmod og+s ether-wake&#039;&lt;br /&gt;
gesetzt werden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschalten des HTPCs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wol_zion on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausschalten des HTPCs mittels KODI&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wz_KODI shutdown&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,10075.0.html Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=14419.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=16469</id>
		<title>XBMC</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=16469"/>
		<updated>2016-10-03T07:25:03Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Lichtsteuerung durch KODI oder PLEX */ Link hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Abspielen von Medien (Musik, Video, Bilder)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_XBMC.pm&lt;br /&gt;
|ModOwner={{Link2FU|6776|vbs}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KODI&#039;&#039;&#039; (früher XBox Media Center (XBMC) genannt) ist eine unter den Bestimmungen der GPL erhältliche freie Media-Center Software. Sie dient dem Abspielen von Videos, Bildern und Musik von DVD, Festplatte und Server sowie der Wiedergabe von Audio- und Video-Datenströmen aus dem Internet. (Quelle: [http://kodi.tv/ kodi.tv])&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Media-Center System, das mit diesem Modul zusammenarbeitet, ist das aus einem XBMC Fork entstandene [https://plex.tv PLEX Media-Server] System.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Versionen von Plex Home Theater haben nur noch eine sehr eingeschränkte Kompatibilität zum XBMC/KODI API und zeigen z.B. keine Informationen mehr über die aktuell gespielten Medien an. Die Beta-Version eines plex-spezifischen Moduls wird in diesem {{Link2Forum|Topic=43052|Message=353477|LinkText=Post im Forum}} vorgestellt. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Dieses Modul ermöglicht das Steuern und Empfangen von Events von KODI und PLEX. Unter anderen sind damit vielfältige Verknüpfungen von Aktoren und &lt;br /&gt;
XBMC/Plex möglich.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Plex Home Theater (PHT) Versionen (ab etwa mitte November)  liefern keine Informationen mehr zum abgespielten Titel (currentTitle,currentAlbum,...) sondern nur noch zum TransportState. Der Grund dafür ist noch nicht klar.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
Für diese Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit &lt;br /&gt;
dem folgenden Befehl installieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define wz_XBMC XBMC &amp;lt;IP-Adresse&amp;gt; tcp &amp;lt;USERNAME&amp;gt; &amp;lt;PASSWORT&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wz_XBMC devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
JSON RPC muss aktiviert sein. Näheres siehe hier: http://wiki.xbmc.org/index.php?title=JSON-RPC_API#Enabling_JSON-RPC&lt;br /&gt;
Danach sollte ein Neustart von Kodi durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Erfolgreich getestet unter den Versionen&lt;br /&gt;
&#039;&#039;KODI 14 und fhem 5.6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lichtsteuerung durch KODI oder PLEX ===&lt;br /&gt;
Im folgenden Beispiel werden beim Starten eines Films die Lichter ausgeschaltet. Sobald die Pause-Taste gedrückt wird, wird das Licht wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define notify_KODI_status notify wz_KODI:playStatus.* { if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;movie&amp;quot;){&lt;br /&gt;
   if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;playing&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht off&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;paused&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht on&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Moduls [[LightScene]] kann man den voherigen Status der einzelnen Lampen auch speichern und nach dem Filmende wiederherstellen.&lt;br /&gt;
Anbei ein Code Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wz_KODI:playStatus.* {&lt;br /&gt;
  my $media = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;currentMedia&amp;quot;,&amp;quot;none&amp;quot;);&lt;br /&gt;
  my $isPlaying = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;playStatus&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;playing&amp;quot;;&lt;br /&gt;
  my $is3d = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;3dfile&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;on&amp;quot;;&lt;br /&gt;
  my $currentLightScene = Value(&amp;quot;kino_licht&amp;quot;);&lt;br /&gt;
  Log 3, &amp;quot;Wiedergegebene Datei: &amp;quot; . $media . &amp;quot; isPlaying: &amp;quot; . $isPlaying. &amp;quot; is3d: &amp;quot; . $is3d . &amp;quot; currentLightScene: &amp;quot; . $currentLightScene;&lt;br /&gt;
  if ($is3d &amp;amp;&amp;amp; $isPlaying) {&lt;br /&gt;
     if ($currentLightScene ne &amp;quot;3d_movie&amp;quot;) {        &lt;br /&gt;
        Log 3, &amp;quot;Speichere aktuellen Zustand als temporäre Szene und ändere kino_licht scene auf 3d_movie...&amp;quot;;&lt;br /&gt;
        fhem(&amp;quot;set kino_licht save tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
        fhem(&amp;quot;set kino_licht scene 3d_movie;&amp;quot;);        &lt;br /&gt;
     }&lt;br /&gt;
  } elsif ($is3d &amp;amp;&amp;amp; $currentLightScene eq &amp;quot;3d_movie&amp;quot;) {&lt;br /&gt;
     Log 3, &amp;quot;Der Film ist pausiert oder zu Ende, ändere LightScene zurück auf tmp_pre_movie_state...&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;set kino_licht scene tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set kino_licht remove tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel mit dem Modul DOIF:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# Kodi: Lichtsteuerung&lt;br /&gt;
#########################################################################&lt;br /&gt;
define di_kodi_lichtsteuerung DOIF &lt;br /&gt;
(&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;playing&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)  &lt;br /&gt;
 (set ls_Erdgeschoss scene Filmstart)&lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;paused&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and &lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)&lt;br /&gt;
 (set ls_Erdgeschoss scene Filmpause) &lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;stopped&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
) &lt;br /&gt;
 (set ls_Erdgeschoss scene indirekt)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen dazu unter im Forenthread {{Link2Forum|Topic=32775|LinkText=Fragen zu LightScene}}&lt;br /&gt;
&lt;br /&gt;
Alternative Lichtsteuerung in Abhängigkeit der Helligkeit {{Link2Forum|Topic=32775|LinkText=Lichtsteuerung in Abhängigkeit von Dämmerung und Fernseher / Mediaplayer}}&lt;br /&gt;
&lt;br /&gt;
=== Nachrichten von Fhem an KODI und PLEX schicken ===&lt;br /&gt;
Der folgende Befehl schickt eine 5 Sekunden lange Info Nachricht an KODI.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&amp;quot;set wz_KODI msg &#039;fhem&#039; &#039;Licht wurde ausgeschaltet!&#039; 5000 info&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Thumbnail im Frontend anzeigen ===&lt;br /&gt;
In den readings von KODI gibt es einen thumbnail Wert. Um diesen als http link in einem http basierten Frontend darstellen zu können muss allerdings ein Userreading erstellt werden, denn der Pfad für http muss doppelt encoded werden. D.h. aus dem %2f muss ein %252f gemacht. Zusätzlich muss dem Wert noch ein http://IP_KODI:PORT_WEBSERVICE/image/ vorangestellt werden. Das funktioniert aber nur wenn die Bilder lokal abgelegt sind, nicht wenn die Bilder von z.b. thetvdb.com kommen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;http_thumbnail { my $val = (ReadingsVal(&amp;quot;$name&amp;quot;, &amp;quot;thumbnail&amp;quot;, 0)); $val =~ s/\%2f/\%252f/g;; return &amp;quot;http://192.168.0.5:8080/image/&amp;quot;.$val;; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschliessend kann http_thumbnail abgefragt werden und enthaelt den Link zum Bild&lt;br /&gt;
&lt;br /&gt;
== Anzeigen von Fhem Daten im KODI ==&lt;br /&gt;
[[Datei:Xbmc.png|mini|right|300px|Fhem-Daten in KODI anzeigen]]&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in KODI ===&lt;br /&gt;
Zuerst muss das Phyton Skript heruntergeladen werden ([http://forum.fhem.de/index.php?topic=14419.0 Thread im Fhem-Forum]) und mit dem XBMC Addon Manager installiert werden. &lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in Fhem ===&lt;br /&gt;
Anschließend muss das globale Attribut userattr mit &amp;quot;xbmcInfo&amp;quot; erweitert werden, und zwar entweder durch Bearbeitung der [[Konfiguration|Fhem Konfiguration]] oder durch Eingabe des Befehls&lt;br /&gt;
:&amp;lt;code&amp;gt;{fhem (&amp;quot;attr global userattr $attr{global}{userattr}&amp;quot;.&amp;quot; xbmcInfo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
in das Fhem Befehlsfenster.&lt;br /&gt;
&lt;br /&gt;
Danach muss ein Dummy mit den anzuzeigenden Daten erstellt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;dummy-name&amp;gt; xbmcInfo &amp;lt;TYPE&amp;gt; &amp;lt;Reading[|Alias]&amp;gt; &amp;lt;[Reading[|Alias]]&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration in KODI ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info3.png|mini|right|200px|Konfigurationsschritt in KODI]]&lt;br /&gt;
Im KODI danach noch das &#039;&#039;Addon&#039;&#039; konfiguren (IP+Passwort). &lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info1.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
[[Datei:FHEM-Info2.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define KODI_dummy dummy&lt;br /&gt;
attr KODI_dummy xbmcInfo CUL_WS temperature|Temperatur humidity|Luftfeuchte&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy2 dummy&lt;br /&gt;
attr KODI_dummy2 xbmcInfo PID20 actuation|Ventil desired|Soll measured|Ist delta p_p|P-Anteil p_i|I-Anteil&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy3 dummy&lt;br /&gt;
attr KODI_dummy3 xbmcInfo FS20 state|Status name|Name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== HTPC via WakeOnLan (WOL) Funktion wecken ===&lt;br /&gt;
Einige HTPCs haben nicht die Möglichkeit diese via eines IR Kommandos zu starten. Alternativ kann hier die &lt;br /&gt;
sog. &amp;quot;WakeOnLan&amp;quot; Funktion genutzt werden. Diese bietes mittels eines speziellen TCP/UDP Paketes den Rechner zu starten. In Fhem gibt es dafür das Modul [[WOL]].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;NAME des PCs&amp;gt; WOL &amp;lt;MAC-Adresse&amp;gt;	&amp;lt;IP&amp;gt; [&amp;lt;mode&amp;gt; [&amp;lt;repeat&amp;gt;]] &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# KODI - WakeOnLan Funktion&lt;br /&gt;
#########################################################################&lt;br /&gt;
define wol_zion WOL BC:AE:C5:B3:E1:3A	 192.168.1.13 EW&lt;br /&gt;
attr wol_zion room _System&lt;br /&gt;
attr wol_zion sysCmd ./ether-wake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweis bei Betrieb auf einer Fritzbox&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sofern fhem nicht unter dem User root wird das ether-wake Kommando nicht funktionieren.&lt;br /&gt;
&#039;&#039;Quick&amp;amp;Dirty Workaround: Mit Telnet auf der FritzBox einloggen und dann das Programm /usr/bin/ether-wake &lt;br /&gt;
in das fhem-Hauptverzeichnis kopieren. Zusätzlich muss das sog. &amp;quot;Sticky-Bit&amp;quot; mit dem Befehl &#039;chmod og+s ether-wake&#039;&lt;br /&gt;
gesetzt werden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschalten des HTPCs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wol_zion on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausschalten des HTPCs mittels KODI&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wz_KODI shutdown&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,10075.0.html Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=14419.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=16312</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=16312"/>
		<updated>2016-09-03T00:41:53Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: grep hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== setex ===&lt;br /&gt;
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ls ===&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep ===&lt;br /&gt;
Durchsuchen der FHEM Dateien nach einem Schlüsselwort&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_grep cmdalias grep .* AS {qx(grep -i \&#039;$EVENT\&#039; *.cfg FHEM/99*.pm)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostname ===&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== svnupdate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;Warnhinweis zu svnupdate&#039;&#039;&#039;&amp;lt;br&amp;gt;Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen &amp;quot;svn update&amp;quot; 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. }}&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== atexec ===&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dellog ===&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== lastloglines ===&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== showignoreddevices ===&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== shownotypedevices ===&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v5 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v3 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung von Geräte Aktionen ===&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== say ===&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomadd ===&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomrename ===&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomdelete ===&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== regroup ===&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocreate ===&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== renamehm ===&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=16287</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=16287"/>
		<updated>2016-08-29T20:34:26Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: setex hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der FHEM-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|x200px|Ausgabe Telnet]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|x200px|Ausgabe in FHEMWEB]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== setex ===&lt;br /&gt;
Schaltet ein Device nur dann, wenn Status ungleich des aktuellen Status ist&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_setex cmdalias setex .* AS set $EVTPART0:FILTER=STATE!=$EVTPART1 $EVTPART1&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ls ===&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostname ===&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== svnupdate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=&#039;&#039;&#039;Warnhinweis zu svnupdate&#039;&#039;&#039;&amp;lt;br&amp;gt;Für das Update einer FHEM-Installation sollte grundsätzlich der dafür vorgesehene FHEM-Befehl [[update]] verwendet werden. Bei Nutzung des hier vorgeschlagenen &amp;quot;svn update&amp;quot; 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. }}&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== atexec ===&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dellog ===&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== lastloglines ===&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== showignoreddevices ===&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== shownotypedevices ===&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v5 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== v3 ===&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Änderung von Geräte Aktionen ===&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== say ===&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomadd ===&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomrename ===&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== roomdelete ===&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== regroup ===&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autocreate ===&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== renamehm ===&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=FHEM Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15754</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15754"/>
		<updated>2016-06-29T18:53:25Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* svnupdate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hostname ==&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svnupdate ==&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sudo apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== lastloglines ==&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomadd ==&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15753</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15753"/>
		<updated>2016-06-29T18:52:53Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ svnupdate hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hostname ==&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svnupdate ==&lt;br /&gt;
Direktes FHEM Update mit Hilfe der aktuellen SVN Version &lt;br /&gt;
Hinweis: Subversion Client muss installiert sein! Installation unter Debian/Ubuntu durch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;apt-get install subversion&amp;lt;/source&amp;gt;&lt;br /&gt;
Danach einmal die FHEM Version auschecken mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;cd /opt&lt;br /&gt;
   svn checkout svn://svn.code.sf.net/p/fhem/code/trunk/fhem fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_svnupdate cmdalias svnupdate AS { `svn update /opt/fhem/` }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== lastloglines ==&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomadd ==&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15496</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15496"/>
		<updated>2016-06-03T17:01:26Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ hostname hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hostname ==&lt;br /&gt;
Hostname des FHEM Rechners anzeigen&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_hostname cmdalias hostname AS {(split(&#039;\.&#039;, qx(hostname)))[0]}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== lastloglines ==&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile an. Mit dem Aufruf &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; werden die letzten 10 Einträge angezeigt. Der Alias wird mit der folgenden Definition angelegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomadd ==&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
{{Randnotiz|RNText=Dieser Alias ist mittlerweile nicht mehr erforderlich, da [[HomeMatic]] Devices den Befehl (&#039;&#039;set&#039;&#039;) [[rename|deviceRename]] anbieten}}&lt;br /&gt;
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 &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15377</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=15377"/>
		<updated>2016-05-22T20:30:37Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ lastloglines hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== lastloglines ==&lt;br /&gt;
Zeigt die letzten Zeilen aus dem FHEM Logfile aus! - Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;lastloglines 10&amp;lt;/source&amp;gt; zeigt die letzten 10 Einträge an!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomadd ==&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=14086</id>
		<title>XBMC</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=14086"/>
		<updated>2016-02-07T08:44:30Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Lichtsteuerung durch KODI oder PLEX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Abspielen von Medien (Musik, Video, Bilder)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_XBMC.pm&lt;br /&gt;
|ModOwner={{Link2FU|6776|vbs}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KODI&#039;&#039;&#039; (früher XBox Media Center (XBMC) genannt) ist eine unter den Bestimmungen der GPL erhältliche freie Media-Center Software. Sie dient dem Abspielen von Videos, Bildern und Musik von DVD, Festplatte und Server sowie der Wiedergabe von Audio- und Video-Datenströmen aus dem Internet. (Quelle: [http://kodi.tv/ kodi.tv])&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Media-Center System, das mit diesem Modul zusammenarbeitet, ist das aus einem XBMC Fork entstandene [https://plex.tv PLEX Media-Server] System.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Versionen von Plex Home Theater haben nur noch eine sehr eingeschränkte Kompatibilität zum XBMC/KODI API und zeigen z.B. keine Informationen mehr über die aktuell gespielten Medien an. Die Beta-Version eines plex-spezifischen Moduls wird in diesem {{Link2Forum|Topic=43052|Message=353477|LinkText=Post im Forum}} vorgestellt. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Dieses Modul ermöglicht das Steuern und Empfangen von Events von KODI und PLEX. Unter anderen sind damit vielfältige Verknüpfungen von Aktoren und &lt;br /&gt;
XBMC/Plex möglich.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Plex Home Theater (PHT) Versionen (ab etwa mitte November)  liefern keine Informationen mehr zum abgespielten Titel (currentTitle,currentAlbum,...) sondern nur noch zum TransportState. Der Grund dafür ist noch nicht klar.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
Für diese Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit &lt;br /&gt;
dem folgenden Befehl installieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define wz_XBMC XBMC &amp;lt;IP-Adresse&amp;gt; tcp &amp;lt;USERNAME&amp;gt; &amp;lt;PASSWORT&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wz_XBMC devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erfolgreich getestet unter den Versionen&lt;br /&gt;
&#039;&#039;KODI 14 und fhem 5.6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lichtsteuerung durch KODI oder PLEX ===&lt;br /&gt;
Im folgenden Beispiel werden beim Starten eines Films die Lichter ausgeschaltet. Sobald die Pause-Taste gedrückt wird, wird das Licht wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define notify_KODI_status notify wz_KODI:playStatus.* { if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;movie&amp;quot;){&lt;br /&gt;
   if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;playing&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht off&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;paused&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht on&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Moduls [[LightScene]] kann man den voherigen Status der einzelnen Lampen auch speichern und nach dem Filmende wiederherstellen.&lt;br /&gt;
Anbei ein Code Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wz_KODI:playStatus.* {&lt;br /&gt;
  my $media = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;currentMedia&amp;quot;,&amp;quot;none&amp;quot;);&lt;br /&gt;
  my $isPlaying = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;playStatus&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;playing&amp;quot;;&lt;br /&gt;
  my $is3d = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;3dfile&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;on&amp;quot;;&lt;br /&gt;
  my $currentLightScene = Value(&amp;quot;kino_licht&amp;quot;);&lt;br /&gt;
  Log 3, &amp;quot;Wiedergegebene Datei: &amp;quot; . $media . &amp;quot; isPlaying: &amp;quot; . $isPlaying. &amp;quot; is3d: &amp;quot; . $is3d . &amp;quot; currentLightScene: &amp;quot; . $currentLightScene;&lt;br /&gt;
  if ($is3d &amp;amp;&amp;amp; $isPlaying) {&lt;br /&gt;
     if ($currentLightScene ne &amp;quot;3d_movie&amp;quot;) {        &lt;br /&gt;
        Log 3, &amp;quot;Speichere aktuellen Zustand als temporäre Szene und ändere kino_licht scene auf 3d_movie...&amp;quot;;&lt;br /&gt;
        fhem(&amp;quot;set kino_licht save tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
        fhem(&amp;quot;set kino_licht scene 3d_movie;&amp;quot;);        &lt;br /&gt;
     }&lt;br /&gt;
  } elsif ($is3d &amp;amp;&amp;amp; $currentLightScene eq &amp;quot;3d_movie&amp;quot;) {&lt;br /&gt;
     Log 3, &amp;quot;Der Film ist pausiert oder zu Ende, ändere LightScene zurück auf tmp_pre_movie_state...&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;set kino_licht scene tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set kino_licht remove tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel mit dem Modul DOIF:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# Kodi: Lichtsteuerung&lt;br /&gt;
#########################################################################&lt;br /&gt;
define di_kodi_lichtsteuerung DOIF &lt;br /&gt;
(&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;playing&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)  &lt;br /&gt;
 (set ls_Erdgeschoss scene Filmstart)&lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;paused&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and &lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
)&lt;br /&gt;
 (set ls_Erdgeschoss scene Filmpause) &lt;br /&gt;
DOELSEIF (&lt;br /&gt;
 [wz_KODI:playStatus] eq &amp;quot;stopped&amp;quot; and [wz_KODI:currentMedia] ne &amp;quot;&amp;quot; and&lt;br /&gt;
 (&lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;episode&amp;quot; or &lt;br /&gt;
  [wz_KODI:type] eq &amp;quot;movie&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
) &lt;br /&gt;
 (set ls_Erdgeschoss scene indirekt)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen dazu unter im Forenthread {{Link2Forum|Topic=32775|LinkText=Fragen zu LightScene}}&lt;br /&gt;
&lt;br /&gt;
=== Nachrichten von Fhem an KODI und PLEX schicken ===&lt;br /&gt;
Der folgende Befehl schickt eine 5 Sekunden lange Info Nachricht an KODI.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&amp;quot;set wz_KODI msg &#039;fhem&#039; &#039;Licht wurde ausgeschaltet!&#039; 5000 info&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Thumbnail im Frontend anzeigen ===&lt;br /&gt;
In den readings von KODI gibt es einen thumbnail Wert. Um diesen als http link in einem http basierten Frontend darstellen zu können muss allerdings ein Userreading erstellt werden, denn der Pfad für http muss doppelt encoded werden. D.h. aus dem %2f muss ein %252f gemacht. Zusätzlich muss dem Wert noch ein http://IP_KODI:PORT_WEBSERVICE/image/ vorangestellt werden. Das funktioniert aber nur wenn die Bilder lokal abgelegt sind, nicht wenn die Bilder von z.b. thetvdb.com kommen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;http_thumbnail { my $val = (ReadingsVal(&amp;quot;$name&amp;quot;, &amp;quot;thumbnail&amp;quot;, 0)); $val =~ s/\%2f/\%252f/g;; return &amp;quot;http://192.168.0.5:8080/image/&amp;quot;.$val;; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschliessend kann http_thumbnail abgefragt werden und enthaelt den Link zum Bild&lt;br /&gt;
&lt;br /&gt;
== Anzeigen von Fhem Daten im KODI ==&lt;br /&gt;
[[Datei:Xbmc.png|mini|right|300px|Fhem-Daten in KODI anzeigen]]&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in KODI ===&lt;br /&gt;
Zuerst muss das Phyton Skript heruntergeladen werden ([http://forum.fhem.de/index.php?topic=14419.0 Thread im Fhem-Forum]) und mit dem XBMC Addon Manager installiert werden. &lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in Fhem ===&lt;br /&gt;
Anschließend muss das globale Attribut userattr mit &amp;quot;xbmcInfo&amp;quot; erweitert werden, und zwar entweder durch Bearbeitung der [[Konfiguration|Fhem Konfiguration]] oder durch Eingabe des Befehls&lt;br /&gt;
:&amp;lt;code&amp;gt;{fhem (&amp;quot;attr global userattr $attr{global}{userattr}&amp;quot;.&amp;quot; xbmcInfo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
in das Fhem Befehlsfenster.&lt;br /&gt;
&lt;br /&gt;
Danach muss ein Dummy mit den anzuzeigenden Daten erstellt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;dummy-name&amp;gt; xbmcInfo &amp;lt;TYPE&amp;gt; &amp;lt;Reading[|Alias]&amp;gt; &amp;lt;[Reading[|Alias]]&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration in KODI ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info3.png|mini|right|200px|Konfigurationsschritt in KODI]]&lt;br /&gt;
Im KODI danach noch das &#039;&#039;Addon&#039;&#039; konfiguren (IP+Passwort). &lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info1.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
[[Datei:FHEM-Info2.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define KODI_dummy dummy&lt;br /&gt;
attr KODI_dummy xbmcInfo CUL_WS temperature|Temperatur humidity|Luftfeuchte&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy2 dummy&lt;br /&gt;
attr KODI_dummy2 xbmcInfo PID20 actuation|Ventil desired|Soll measured|Ist delta p_p|P-Anteil p_i|I-Anteil&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy3 dummy&lt;br /&gt;
attr KODI_dummy3 xbmcInfo FS20 state|Status name|Name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== HTPC via WakeOnLan (WOL) Funktion wecken ===&lt;br /&gt;
Einige HTPCs haben nicht die Möglichkeit diese via eines IR Kommandos zu starten. Alternativ kann hier die &lt;br /&gt;
sog. &amp;quot;WakeOnLan&amp;quot; Funktion genutzt werden. Diese bietes mittels eines speziellen TCP/UDP Paketes den Rechner zu starten. In Fhem gibt es dafür das Modul [[WOL]].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;NAME des PCs&amp;gt; WOL &amp;lt;MAC-Adresse&amp;gt;	&amp;lt;IP&amp;gt; [&amp;lt;mode&amp;gt; [&amp;lt;repeat&amp;gt;]] &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# KODI - WakeOnLan Funktion&lt;br /&gt;
#########################################################################&lt;br /&gt;
define wol_zion WOL BC:AE:C5:B3:E1:3A	 192.168.1.13 EW&lt;br /&gt;
attr wol_zion room _System&lt;br /&gt;
attr wol_zion sysCmd ./ether-wake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweis bei Betrieb auf einer Fritzbox&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sofern fhem nicht unter dem User root wird das ether-wake Kommando nicht funktionieren.&lt;br /&gt;
&#039;&#039;Quick&amp;amp;Dirty Workaround: Mit Telnet auf der FritzBox einloggen und dann das Programm /usr/bin/ether-wake &lt;br /&gt;
in das fhem-Hauptverzeichnis kopieren. Zusätzlich muss das sog. &amp;quot;Sticky-Bit&amp;quot; mit dem Befehl &#039;chmod og+s ether-wake&#039;&lt;br /&gt;
gesetzt werden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschalten des HTPCs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wol_zion on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausschalten des HTPCs mittels KODI&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wz_KODI shutdown&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,10075.0.html Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=14419.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13677</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13677"/>
		<updated>2016-01-19T19:33:55Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ roomadd hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomadd ==&lt;br /&gt;
Erstellt einen neuen Raum und füllt diesen mit Geräten entsprechend der angegeben Device-Spezifikation.&lt;br /&gt;
&lt;br /&gt;
Aufruf: &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;roomadd &amp;lt;devspec&amp;gt; &amp;lt;new_room&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomadd cmdalias roomadd .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0&amp;quot;)){ my $old_room = AttrVal($name,&#039;room&#039;,&#039;&#039;);; if (index($old_room, $EVTPART1) == -1) {my $new_room = AttrVal($name,&#039;room&#039;,&#039;&#039;) . &amp;quot;,$EVTPART1&amp;quot;;; fhem(&amp;quot;attr $name room $new_room&amp;quot;)} } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13600</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13600"/>
		<updated>2016-01-17T11:20:56Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* dellog */ dellog mit doppelten Semikolons ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);;Log 1, &amp;quot;Logfile gelöscht&amp;quot;;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13590</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13590"/>
		<updated>2016-01-15T19:42:49Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* dellog */ Logmeldung hinzugefuegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0);Log 1, &amp;quot;Logfile gelöscht&amp;quot;;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13434</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13434"/>
		<updated>2016-01-03T11:38:51Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ atexec hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== atexec ==&lt;br /&gt;
Triggert einen AT Timer&lt;br /&gt;
Aufruf mit &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;atexec &amp;lt;at-device-name&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_atexec cmdalias atexec .* AS { if($defs{$EVENT}) { if($defs{$EVENT}-&amp;gt;{TYPE} eq &amp;quot;at&amp;quot;) { at_Exec($defs{$EVENT});; 0;; } else { return &amp;quot;$EVENT is not of TYPE at!&amp;quot;;; }} else { return &amp;quot;Device $EVENT does not exist!&amp;quot;;; }}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13421</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=13421"/>
		<updated>2016-01-01T21:27:37Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ dellog hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
= Zielsetzung =&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
= Einbindung in Fhem =&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aufruf in Fhem =&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
= Beispiele =&lt;br /&gt;
== ls ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dellog ==&lt;br /&gt;
Leert das aktuelle FHEM Logfile&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_dellog cmdalias dellog AS {qx(truncate $currlogfile --size 0)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== showignoreddevices ==&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shownotypedevices ==&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v5 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== v3 ==&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Änderung von Geräte Aktionen ==&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== say ==&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomrename ==&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== roomdelete ==&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== regroup ==&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt. In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
Schnelles (de)aktivieren der [[autocreate]] Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== renamehm ==&lt;br /&gt;
Homematic Devices werden gerne mit zusätzlichen Geräten angelegt (z.B: HM-ES-PMSw1-PI legt die Geräte HM_12345B, HM_12345B_Pwr, HM_12345B_SenF, HM_12345B_SenI, HM_12345B_SenPwr, HM_12345B_SenU, HM_12345B_Sw an). Um diese umzubenennen kann man mit der folgenden Funktion den Prefix von HM_12345B auf einen beliebigen Ändern. Diese wird nach Definition via &amp;quot;&amp;lt;code&amp;gt;renamehm HM_12345B NEW_DEVICE_PREFIX&amp;lt;/code&amp;gt;&amp;quot; ausgeführt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define c_renamehm cmdalias renamehm .* AS { for my $name (devspec2array(&amp;quot;$EVTPART0.*&amp;quot;)){ my $newname=$name;;$newname =~ s/$EVTPART0/$EVTPART1/gi;; fhem(&amp;quot;rename $name $newname&amp;quot;);;} }&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Pioneer_AV-Receiver&amp;diff=13087</id>
		<title>Pioneer AV-Receiver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Pioneer_AV-Receiver&amp;diff=13087"/>
		<updated>2015-11-29T13:32:23Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: Hersteller Link korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|Name=PIONEERAVR&lt;br /&gt;
|ModPurpose=Steuern von Pioneer AV Receivern (MAIN Zone)&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=PIONEERAVR&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_PIONEERAVR.pm&lt;br /&gt;
|ModOwner=hofrichter&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|Name=PIONEERAVRZONE&lt;br /&gt;
|ModPurpose=Steuern von Pioneer AV Receivern (weitere Zonen)&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=PIONEERAVRZONE&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_PIONEERAVRZONE.pm&lt;br /&gt;
|ModOwner=hofrichter}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pioneer AV-Receiver&#039;&#039;&#039; sind Mehrkanal-Hi-Fi-Verstärker der Firma Pioneer, die verschiedene Audio- und Videoquellen auf ihre analogen und digitalen Ausgänge schalten können.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
Die Haupteigenschaften von Pioneer AV-Receiver sind&lt;br /&gt;
* Audio- und Video-Umschalter&lt;br /&gt;
* Mehrkanalton-Decoder&lt;br /&gt;
* Radio-Tuner&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
Um das Gerät von Fhem aus ansprechen zu können wird/werden benötigt...&lt;br /&gt;
# Pioneer AV-Receiver,&lt;br /&gt;
# Fhem Server,&lt;br /&gt;
# Datenverbindung zwischen den beiden&lt;br /&gt;
## per Ethernet oder&lt;br /&gt;
## via serielle Schnittstelle (RS232) UNGETESTET!&lt;br /&gt;
&lt;br /&gt;
Einige Pioneer AV-Receiver unterstützen Ausgänge in mehreren Zonen. Dies wird in Fhem durch mehrere devices abgebildet:&lt;br /&gt;
* ein PIONEERAVR device: &lt;br /&gt;
** dieses empfängt und sendet an den Pioneer AV-Receiver&lt;br /&gt;
** steuert die Main-Zone&lt;br /&gt;
* je Zone ein PIONEERAVRZONE device&lt;br /&gt;
** wird automatisch angelegt, sobald das PIONEERAVR device Daten vom Pioneer AV-Receiver für eine Zone empfängt&lt;br /&gt;
&lt;br /&gt;
== Einbinden in Fhem ==&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; PIONEERAVR telnet &amp;lt;IPAddress:Port&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Link2Forum|Topic=12573}} im Forum&lt;br /&gt;
* Hersteller: [http://www.pioneer.eu/ Pioneer]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12605</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12605"/>
		<updated>2015-10-20T19:18:29Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen (mehrzeiliges Codebeispiel):&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es sollte nur aufgepasst werden, wenn ein &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt.&lt;br /&gt;
In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnelles (de)aktivieren vom &amp;quot;autocreate&amp;quot; Feature (automatisches Erkennen von Geräten)&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12604</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12604"/>
		<updated>2015-10-20T19:17:50Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */ autocreate alias hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:cmdalias}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=cmdalias&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner={{Link2FU|8|Rudolf König}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der Fhem-Befehl [[cmdalias]] dient zur Erstellung von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit &#039;&#039;cmdalias&#039;&#039; verkürzt oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass sogar [[:Kategorie:FhemBefehl|interne Befehle]] wie &amp;quot;shutdown restart&amp;quot; ersetzt werden können durch einen alias der genau so heißt aber zusätzlich vorher noch z.B. ein &amp;quot;save&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Die folgenden Codebeispiele sind, sofern nicht anders erwähnt, als Einzeiler &#039;&#039;&#039;ohne&#039;&#039;&#039; Zeilenumbrüche einzugeben.}}&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|400px|Ausgabe Telnet]]&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeile oder direkt im Telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|right|400px|Ausgabe in FHEMWEB]]&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten, die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen (mehrzeiliges Codebeispiel):&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es sollte nur aufgepasst werden, wenn ein &amp;quot;Device&amp;quot; mehrere ähnliche Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat. Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren, dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt.&lt;br /&gt;
In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben, damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
Schnelles (de)aktivieren vom &amp;quot;autocreate&amp;quot; Featrue&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_autocreate_off cmdalias set autocreate off AS attr autocreate disable 1&lt;br /&gt;
define c_autocreate_on cmdalias set autocreate on AS attr autocreate disable 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional kann noch das autocreate Icon definiert werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr autocreate devStateIcon disabled:ios-off:on active:ios-on-blue:off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=15648|LinkText=Fhem Forum}}&lt;br /&gt;
* Thread mit {{Link2Forum|Topic=42211|LinkText=weiteren Informationen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12586</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12586"/>
		<updated>2015-10-18T07:02:14Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Zielsetzung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
Ein schönes Beispiel dafür ist, dass man sogar interne Befehle wie &amp;quot;shutdown restart&amp;quot; ersetzen kann &lt;br /&gt;
durch einen alias der genau so heißt aber noch zusätzlich z.B. ein &amp;quot;save&amp;quot; vorher ausführt.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zusätzlichen Gruppen in welchen sich die devices sonst noch befinden bleiben unberührt.&lt;br /&gt;
Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Es sollte nur aufgepasst werden wenn ein &amp;quot;Device&amp;quot; mehrere ähnlichen Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat.&lt;br /&gt;
Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt.&lt;br /&gt;
In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12585</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12585"/>
		<updated>2015-10-18T06:59:53Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zusätzlichen Gruppen in welchen sich die devices sonst noch befinden bleiben unberührt.&lt;br /&gt;
Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Es sollte nur aufgepasst werden wenn ein &amp;quot;Device&amp;quot; mehrere ähnlichen Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat.&lt;br /&gt;
Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt.&lt;br /&gt;
In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12584</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12584"/>
		<updated>2015-10-18T06:59:21Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Die zusätzlichen Gruppen in welchen sich die devices sonst noch befinden bleiben unberührt.&lt;br /&gt;
- Als FILTER kann alles was der normale fhem-devspec Filter verarbeiten kann angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Es sollte nur aufgepasst werden wenn ein &amp;quot;Device&amp;quot; mehrere ähnlichen Gruppenbennungen wie &amp;quot;attr name group test2,test&amp;quot; hat.&lt;br /&gt;
Wenn man hier ein &#039;regroup test test3&#039; macht, könnte es passieren dass man dadurch bei diesem device die Gruppe &#039;test2&#039; nach &#039;test32&#039; umbenennt.&lt;br /&gt;
In dem Beispiel müsste man den Befehl z.B. mit &#039;regroup test$ test3&#039; angeben damit das nicht passiert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12583</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12583"/>
		<updated>2015-10-18T06:57:51Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umfangreicher alias zum automatischen Setzen verschiedener Gruppen in FHEM Räumen&lt;br /&gt;
&amp;lt;pre&amp;gt;regroup &amp;lt;oldGroup&amp;gt; [&amp;lt;newGroup&amp;gt; [&amp;lt;FILTER&amp;gt;][|&amp;lt;FILTER2&amp;gt;]...]&lt;br /&gt;
&lt;br /&gt;
# Allen devices ohne group die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur den devices im Raum &#039;myRoom&#039; welche keine group haben die Gruppe &#039;myGroup&#039; setzen:&lt;br /&gt;
regroup 0 myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Alle devices aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus &#039;oldGroup&#039; in &#039;newGroup&#039; verschieben&lt;br /&gt;
regroup oldGroup newGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Gruppe &#039;myGroup&#039; löschen&lt;br /&gt;
regroup myGroup&lt;br /&gt;
&lt;br /&gt;
# Nur die devices im Raum &#039;myRoom&#039; aus der Gruppe &#039;myGroup&#039; löschen.&lt;br /&gt;
regroup myGroup 0 room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices aus allen Gruppen welche mit &#039;licht&#039; beginnen aus Raum &#039;Obergeschoss&#039; entfernen.&lt;br /&gt;
regroup licht.* 0 room=Obergeschoss&lt;br /&gt;
&lt;br /&gt;
# Devices aus dem Raum &#039;myRoom&#039;  aus allen Gruppen entfernen und in die Gruppe &#039;myGroup&#039; verschieben.&lt;br /&gt;
regroup .* myGroup room=myRoom&lt;br /&gt;
&lt;br /&gt;
# Devices ohne Gruppe aus dem Raum &#039;myRoom&#039; mit dem TYPE &#039;CUL_HM&#039; und welche ebenfalls &#039;Licht&#039; im Namen enthalten die Gruppe &#039;myGroup&#039; hinzufügen&lt;br /&gt;
regroup 0 myGroup room=myRoom|TYPE=CUL_HM|NAME=.*Licht.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_regroup cmdalias regroup .* AS { my @EVTPART=split(&#039; &#039;,$EVENT);; $EVTPART[2] =~ s/\|/:FILTER=/g if($EVTPART[2]);; for my $name (devspec2array(&amp;quot;group=&amp;quot;.($EVTPART[0] ? $EVTPART[0] : &#039;.*&#039;).($EVTPART[2] ? &amp;quot;:FILTER=$EVTPART[2]&amp;quot; : &#039;&#039;))){ map { ($_ &amp;amp;&amp;amp; /^$EVTPART[0]$/ &amp;amp;&amp;amp; !$EVTPART[1]) ? fhem(&amp;quot;deleteattr $name group&amp;quot;) : do{ if(!$EVTPART[1]){$EVTPART[0]=&amp;quot;,$EVTPART[0]|$EVTPART[0],&amp;quot;;; $EVTPART[1]=&#039;&#039;;;} s/$EVTPART[0]/$EVTPART[1]/;; fhem(&amp;quot;attr $name group $_&amp;quot;)} } AttrVal($name,&#039;group&#039;,0) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12582</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12582"/>
		<updated>2015-10-18T06:55:00Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12581</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12581"/>
		<updated>2015-10-18T06:54:38Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 5&lt;br /&gt;
&amp;lt;pre&amp;gt;define v5 cmdalias v5 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 5&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzen des &amp;quot;Verbose Level&amp;quot; in FHEM auf 3&lt;br /&gt;
&amp;lt;pre&amp;gt;define v3 cmdalias v3 .* AS {fhem (&amp;quot;attr &amp;quot;.($EVENT||=&amp;quot;global&amp;quot;).&amp;quot; verbose 3&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12580</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12580"/>
		<updated>2015-10-18T06:53:07Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12579</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12579"/>
		<updated>2015-10-18T06:52:58Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Verkürzter Aufruf von list mit Wildcard Suche&lt;br /&gt;
&amp;lt;pre&amp;gt;define ls cmdalias ls .* AS list .*$EVENT.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12578</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12578"/>
		<updated>2015-10-18T06:51:54Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes &#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes &#039;&#039;&#039;Aufruf: roomdelete &amp;lt;roomName&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12577</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12577"/>
		<updated>2015-10-18T06:51:11Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes&lt;br /&gt;
&#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löschen eines FHEM Raumes&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomdelete cmdalias roomdelete .* AS { for my $name (devspec2array(&amp;quot;room=$EVENT&amp;quot;)){ map { /^$EVENT$/ ? fhem(&amp;quot;deleteattr $name room&amp;quot;) : do{s/,$EVENT|$EVENT,//;; fhem(&amp;quot;attr $name room $_&amp;quot;)} } AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12576</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12576"/>
		<updated>2015-10-18T06:50:23Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes&lt;br /&gt;
&#039;&#039;&#039;Aufruf roomrename &amp;lt;oldroom&amp;gt; &amp;lt;newroom&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12575</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12575"/>
		<updated>2015-10-18T06:50:05Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes&lt;br /&gt;
&#039;&#039;&#039;Aufruf roomrename oldroom newroom&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12574</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12574"/>
		<updated>2015-10-18T06:49:31Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbenennen eines FHEM Raumes&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_roomrename cmdalias roomrename .* AS { for my $name (devspec2array(&amp;quot;room=$EVTPART0&amp;quot;)){ map {s/$EVTPART0/$EVTPART1/;; fhem(&amp;quot;attr $name room $_&amp;quot;)} AttrVal($name,&#039;room&#039;,&#039;&#039;) } }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12572</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12572"/>
		<updated>2015-10-18T06:48:31Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verkürzter Befehlsaufruf des TTS Moduls&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_say cmdalias say .* AS set MyTTS tts &#039;$EVENT&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12571</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12571"/>
		<updated>2015-10-18T06:47:41Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird dem Gerät MiLight_1 nicht erlaubt ausgeschaltet zu werden&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_aliasMiLight_1 cmdalias set MiLight_1 off AS set HMSchaltaktor_1 off&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12570</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12570"/>
		<updated>2015-10-18T06:45:36Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Aufruf in Fhem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Ausgabe Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|Ausgabe in FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12569</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12569"/>
		<updated>2015-10-18T06:44:59Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Aufruf in Fhem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Telnet]]&lt;br /&gt;
[[Datei:cmdalias_eingabe_fhemweb.png|mini|left|200px|FHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Cmdalias_eingabe_fhemweb.png&amp;diff=12568</id>
		<title>Datei:Cmdalias eingabe fhemweb.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Cmdalias_eingabe_fhemweb.png&amp;diff=12568"/>
		<updated>2015-10-18T06:44:24Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: Beispiel Eingabe cmdalias&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel Eingabe cmdalias&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12567</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12567"/>
		<updated>2015-10-18T06:43:25Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Aufruf in Fhem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|left|200px|Telnet]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12566</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12566"/>
		<updated>2015-10-18T06:42:56Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufruf in Fhem ==&lt;br /&gt;
Die aliase können entweder in der FHEM Befehlzeie oder direkt im telnet eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:cmdalias_eingabe_telnet.png|mini|right|200px|Telnet]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Cmdalias_eingabe_telnet.png&amp;diff=12565</id>
		<title>Datei:Cmdalias eingabe telnet.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Cmdalias_eingabe_telnet.png&amp;diff=12565"/>
		<updated>2015-10-18T06:41:30Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: Beispiel Eingabe cmdalias&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel Eingabe cmdalias&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12564</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12564"/>
		<updated>2015-10-18T06:36:38Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben:&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten ohne TYPE Definition (sollte nur bei einer fehlerhaften Definition eine Ausgabe erstellen):&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_shownotypedevices cmdalias shownotypedevices AS { join(&amp;quot;\n&amp;quot;, grep { !defined($defs{$_}{TYPE}) } keys %defs) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12563</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12563"/>
		<updated>2015-10-18T06:24:09Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben&lt;br /&gt;
&amp;lt;pre&amp;gt;define c_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12562</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12562"/>
		<updated>2015-10-18T06:23:48Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
Auflisten von Geräten die in FHEM das Attribut &amp;quot;ignore&amp;quot; gesetzt haben&lt;br /&gt;
&amp;lt;pre&amp;gt;define cmd_showignoreddevices cmdalias showignoreddevices AS { join(&amp;quot;\n&amp;quot;, grep { $attr{$_}{ignore} } sort keys %attr ) }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12561</id>
		<title>Cmdalias</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Cmdalias&amp;diff=12561"/>
		<updated>2015-10-18T06:21:53Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: Die Seite wurde neu angelegt: „{{Infobox Modul |ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM |ModType=h |ModForumArea=FHEM |ModTechName=98_cmdalias.pm |ModOwner=[http://for…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Erstellen von Benutzer-definierten Befehlen in FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=FHEM&lt;br /&gt;
|ModTechName=98_cmdalias.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;cmdalias&#039;&#039;&#039; ist ein Modul zum definieren von benutzerdefinierten Befehlen. &lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Die jeweiligen Befehlsketten können mit diesem Modul verkürzt werden oder sogar verändert werden.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;name&amp;gt; cmdalias &amp;lt;cmd&amp;gt; [parameter] AS newcommand...&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s1 cmdalias shutdown update AS save;;shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;define s2 cmdalias set lamp .* AS { Log 1, &amp;quot;$EVENT&amp;quot;;; fhem(&amp;quot;set $EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php?topic=15648.0 Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=42211.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=12480</id>
		<title>XBMC</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=XBMC&amp;diff=12480"/>
		<updated>2015-10-11T09:46:38Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Lichtsteuerung durch KODI oder PLEX */ DOIF hinzugefügt (Beispiel)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Abspielen von Medien (Musik, Video, Bilder)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=70_XBMC.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=6776 vbs]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;KODI&#039;&#039;&#039; (früher XBox Media Center (XBMC) genannt) ist eine unter den Bestimmungen der GPL erhältliche freie Media-Center Software. Sie dient dem Abspielen von Videos, Bildern und Musik von DVD, Festplatte und Server sowie der Wiedergabe von Audio- und Video-Datenströmen aus dem Internet. (Quelle: [http://kodi.tv/ kodi.tv])&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Media-Center System, das mit diesem Modul zusammenarbeitet, ist das aus einem KODI Fork entstandene [https://plex.tv PLEX Media-Server] System.&lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Dieses Modul ermöglicht das Steuern und Empfangen von Events von KODI und PLEX. Unter anderen sind damit vielfältige Verknüpfungen von Aktoren und &lt;br /&gt;
XBMC/Plex möglich.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Plex Home Theater (PHT) Versionen (ab etwa mitte November)  liefern keine Informationen mehr zum abgespielten Titel (currentTitle,currentAlbum,...) sondern nur noch zum TransportState. Der Grund dafür ist noch nicht klar.&lt;br /&gt;
&lt;br /&gt;
== Einbindung in Fhem ==&lt;br /&gt;
&lt;br /&gt;
Für diese Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit &lt;br /&gt;
dem folgenden Befehl installieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install libjson-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispieldefinition&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;define wz_XBMC XBMC &amp;lt;IP-Adresse&amp;gt; tcp &amp;lt;USERNAME&amp;gt; &amp;lt;PASSWORT&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr wz_XBMC devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erfolgreich getestet unter den Versionen&lt;br /&gt;
&#039;&#039;KODI 14 und fhem 5.6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lichtsteuerung durch KODI oder PLEX ===&lt;br /&gt;
Im folgenden Beispiel werden beim Starten eines Films die Lichter ausgeschaltet. Sobald die Pause-Taste gedrückt wird, wird das Licht wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define notify_KODI_status notify wz_KODI:playStatus.* { if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;movie&amp;quot;){&lt;br /&gt;
   if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;playing&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht off&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if (ReadingsVal(&amp;quot;wz_KODI&amp;quot;, &amp;quot;playStatus&amp;quot;, &amp;quot;&amp;quot;) eq &amp;quot;paused&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;set FS20_Licht on&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Moduls [[LightScene]] kann man den voherigen Status der einzelnen Lampen auch speichern und nach dem Filmende wiederherstellen.&lt;br /&gt;
Anbei ein Code Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wz_KODI:playStatus.* {&lt;br /&gt;
  my $media = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;currentMedia&amp;quot;,&amp;quot;none&amp;quot;);&lt;br /&gt;
  my $isPlaying = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;playStatus&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;playing&amp;quot;;&lt;br /&gt;
  my $is3d = ReadingsVal(&amp;quot;wz_KODI&amp;quot;,&amp;quot;3dfile&amp;quot;,&amp;quot;n/a&amp;quot;) eq &amp;quot;on&amp;quot;;&lt;br /&gt;
  my $currentLightScene = Value(&amp;quot;kino_licht&amp;quot;);&lt;br /&gt;
  Log 3, &amp;quot;Wiedergegebene Datei: &amp;quot; . $media . &amp;quot; isPlaying: &amp;quot; . $isPlaying. &amp;quot; is3d: &amp;quot; . $is3d . &amp;quot; currentLightScene: &amp;quot; . $currentLightScene;&lt;br /&gt;
  if ($is3d &amp;amp;&amp;amp; $isPlaying) {&lt;br /&gt;
     if ($currentLightScene ne &amp;quot;3d_movie&amp;quot;) {        &lt;br /&gt;
        Log 3, &amp;quot;Speichere aktuellen Zustand als temporäre Szene und ändere kino_licht scene auf 3d_movie...&amp;quot;;&lt;br /&gt;
        fhem(&amp;quot;set kino_licht save tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
        fhem(&amp;quot;set kino_licht scene 3d_movie;&amp;quot;);        &lt;br /&gt;
     }&lt;br /&gt;
  } elsif ($is3d &amp;amp;&amp;amp; $currentLightScene eq &amp;quot;3d_movie&amp;quot;) {&lt;br /&gt;
     Log 3, &amp;quot;Der Film ist pausiert oder zu Ende, ändere LightScene zurück auf tmp_pre_movie_state...&amp;quot;;&lt;br /&gt;
     fhem(&amp;quot;set kino_licht scene tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
     fhem(&amp;quot;set kino_licht remove tmp_pre_movie_state;&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel mit dem Modul DOIF:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# Kodi: Lichtsteuerung&lt;br /&gt;
#########################################################################&lt;br /&gt;
define di_kodi_lichtsteuerung DOIF ([wz_KODI:type] eq &amp;quot;movie&amp;quot; and [wz_KODI:playStatus] eq &amp;quot;playing&amp;quot;) \&lt;br /&gt;
 (set ls_Erdgeschoss scene Filmstart) \&lt;br /&gt;
DOELSEIF ([KODI:type] eq &amp;quot;movie&amp;quot; and [KODI:playStatus] eq &amp;quot;paused&amp;quot;) \&lt;br /&gt;
 (set ls_Erdgeschoss scene Filmstart) \&lt;br /&gt;
 DOELSEIF ([KODI:type] eq &amp;quot;movie&amp;quot; and [KODI:playStatus] eq &amp;quot;stopped&amp;quot;) \&lt;br /&gt;
 (set ls_Erdgeschoss scene indirekt)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen dazu unter im Forenthread {{Link2Forum|Topic=32775|LinkText=Fragen zu LightScene}}&lt;br /&gt;
&lt;br /&gt;
=== Nachrichten von Fhem an KODI und PLEX schicken ===&lt;br /&gt;
Der folgende Befehl schickt eine 5 Sekunden lange Info Nachricht an KODI.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;fhem(&amp;quot;set wz_KODI msg &#039;fhem&#039; &#039;Licht wurde ausgeschaltet!&#039; 5000 info&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzeigen von Fhem Daten im KODI ==&lt;br /&gt;
[[Datei:Xbmc.png|mini|right|300px|Fhem-Daten in KODI anzeigen]]&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in KODI ===&lt;br /&gt;
Zuerst muss das Phyton Skript heruntergeladen werden ([http://forum.fhem.de/index.php?topic=14419.0 Thread im Fhem-Forum]) und mit dem XBMC Addon Manager installiert werden. &lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen in Fhem ===&lt;br /&gt;
Anschließend muss das globale Attribut userattr mit &amp;quot;xbmcInfo&amp;quot; erweitert werden, und zwar entweder durch Bearbeitung der [[Konfiguration|Fhem Konfiguration]] oder durch Eingabe des Befehls&lt;br /&gt;
:&amp;lt;code&amp;gt;{fhem (&amp;quot;attr global userattr $attr{global}{userattr}&amp;quot;.&amp;quot; xbmcInfo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
in das Fhem Befehlsfenster.&lt;br /&gt;
&lt;br /&gt;
Danach muss ein Dummy mit den anzuzeigenden Daten erstellt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;dummy-name&amp;gt; xbmcInfo &amp;lt;TYPE&amp;gt; &amp;lt;Reading[|Alias]&amp;gt; &amp;lt;[Reading[|Alias]]&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration in KODI ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info3.png|mini|right|200px|Konfigurationsschritt in KODI]]&lt;br /&gt;
Im KODI danach noch das &#039;&#039;Addon&#039;&#039; konfiguren (IP+Passwort). &lt;br /&gt;
&lt;br /&gt;
[[Datei:FHEM-Info1.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
[[Datei:FHEM-Info2.png|mini|right|200px|Beispielausgabe]]&lt;br /&gt;
&#039;&#039;&#039;Beispiele&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define KODI_dummy dummy&lt;br /&gt;
attr KODI_dummy xbmcInfo CUL_WS temperature|Temperatur humidity|Luftfeuchte&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy2 dummy&lt;br /&gt;
attr KODI_dummy2 xbmcInfo PID20 actuation|Ventil desired|Soll measured|Ist delta p_p|P-Anteil p_i|I-Anteil&lt;br /&gt;
&lt;br /&gt;
define KODI_dummy3 dummy&lt;br /&gt;
attr KODI_dummy3 xbmcInfo FS20 state|Status name|Name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== HTPC via WakeOnLan (WOL) Funktion wecken ===&lt;br /&gt;
Einige HTPCs haben nicht die Möglichkeit diese via eines IR Kommandos zu starten. Alternativ kann hier die &lt;br /&gt;
sog. &amp;quot;WakeOnLan&amp;quot; Funktion genutzt werden. Diese bietes mittels eines speziellen TCP/UDP Paketes den Rechner zu starten. In Fhem gibt es dafür das Modul [[WOL]].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;NAME des PCs&amp;gt; WOL &amp;lt;MAC-Adresse&amp;gt;	&amp;lt;IP&amp;gt; [&amp;lt;mode&amp;gt; [&amp;lt;repeat&amp;gt;]] &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#########################################################################&lt;br /&gt;
# KODI - WakeOnLan Funktion&lt;br /&gt;
#########################################################################&lt;br /&gt;
define wol_zion WOL BC:AE:C5:B3:E1:3A	 192.168.1.13 EW&lt;br /&gt;
attr wol_zion room _System&lt;br /&gt;
attr wol_zion sysCmd ./ether-wake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweis bei Betrieb auf einer Fritzbox&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sofern fhem nicht unter dem User root wird das ether-wake Kommando nicht funktionieren.&lt;br /&gt;
&#039;&#039;Quick&amp;amp;Dirty Workaround: Mit Telnet auf der FritzBox einloggen und dann das Programm /usr/bin/ether-wake &lt;br /&gt;
in das fhem-Hauptverzeichnis kopieren. Zusätzlich muss das sog. &amp;quot;Sticky-Bit&amp;quot; mit dem Befehl &#039;chmod og+s ether-wake&#039;&lt;br /&gt;
gesetzt werden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Einschalten des HTPCs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wol_zion on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ausschalten des HTPCs mittels KODI&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set wz_KODI shutdown&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,10075.0.html Fhem Forum]&lt;br /&gt;
* Thread mit [http://forum.fhem.de/index.php?topic=14419.0 weiteren Informationen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=12094</id>
		<title>FRITZBOX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=12094"/>
		<updated>2015-09-07T10:34:47Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Anwesenheitserkennung per Notify */ Fehler im Notify korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung einer Fritz!Box über Fhem&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=FRITZ!Box&lt;br /&gt;
|ModTechName=72_FRITZBOX.pm&lt;br /&gt;
|ModOwner=tupol/Topos ([http://forum.fhem.de/index.php?action=profile;u=5432 Forum] / [[Benutzer Diskussion:Topos|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] und von AVM FRITZ!WLAN Repeatern durch Fhem. An Fritzboxen können sowohl Geräte abgefragt werden, auf denen FHEM selbst läuft (lokaler Modus), als auch um eine entfernte (externe) Geräte.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Remote-Zugang ===&lt;br /&gt;
Für den Remote-Zugang müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem [[Raspberry Pi]] oder unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
=== Telnet ===&lt;br /&gt;
Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe {{Link2Forum|Topic=38586|LinkText=dieses Forenthema}}). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen: &lt;br /&gt;
&lt;br /&gt;
# Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon&lt;br /&gt;
&lt;br /&gt;
# Auf dem System, auf dem Fhem läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] und unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
Zur Erstinstallation reicht ein einfaches &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt).&lt;br /&gt;
&lt;br /&gt;
==== TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
Für den Fernzugriff über TR-064 auf eine oder mehrere Fritzboxen und/oder einen FRITZ!WLAN Repeater sind die folgenden Schritte nötig (für jedes Gerät):&lt;br /&gt;
&lt;br /&gt;
Fritzbox definieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox boxUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
Manuelle TR-064 Kommandos erlauben (die Abfrage per TR-064 funktioniert auch ohne dieses Attribut):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox allowTR064Command 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Fritzbox nicht unter http://fritz.box erreichbar ist, IP setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox fritzBoxIP 192.168.168.168&amp;lt;/code&amp;gt;&lt;br /&gt;
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann bei fritzBoxIP - trotz des Namens des Attributs - statt der IP auch der Hostname eingegeben werden, eine DNS-Auflösung findet statt.&lt;br /&gt;
&lt;br /&gt;
Manchmal ist ein Neustart von FHEM erforderlich, damit die Fritzbox mit der veränderten IP gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== Telnet: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
[[Datei:Screenshot_FritzBox_TelnetUser.png|mini|300px|rechts|Anlegen des Attributs telnetUser]]&lt;br /&gt;
Bei Fernzugriff über Telnet sind weitere Schritte nötig:&lt;br /&gt;
# Telnet auf der Fritzbox freischalten (Tastenkombination #96*7* am angeschlossenen Telefon (auch FritzFon)&lt;br /&gt;
# TelnetUser definieren (wie im Screenshot gezeigt)&lt;br /&gt;
# Passwort zum Benutzer auf der Fritzbox definieren&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot_FritzBox_Passwort.png|mini|300px|rechts|Passwort definieren]]&lt;br /&gt;
&lt;br /&gt;
(bitte die Buttons {{Taste|set}} und {{Taste|attr}} bei der Definition der jeweiligen Einträge nicht vergessen)&lt;br /&gt;
&lt;br /&gt;
Wer stattdessen lieber das [[Konfiguration|Befehl-Eingabefeld]] verwendet:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox telnetUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt; - legt den Benutzer fest&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
Wer keinen User konfiguriert hat, kann das Feld &amp;quot;telnetUser&amp;quot; leer lassen.&lt;br /&gt;
&lt;br /&gt;
Wer sicher gehen möchte, dass auch tatsächlich Telnet und nicht andere Zugriffe benutzt werden, sollte außerdem noch setzen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox forceTelnetConnection 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mögliche Fehlermeldungen ===&lt;br /&gt;
Sollte schon bei &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt; die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte prüfen, ob Fhem auf dem aktuellen Stand ist und ggf. [[Update|aktualisieren]].&lt;br /&gt;
&lt;br /&gt;
Kommt jetzt bei der erneuten Definition die Fehlermeldung &amp;lt;code&amp;gt;Error: Perl modul Net::Telnet is missing on this system&amp;lt;/code&amp;gt; bitte wie oben schon erwähnt den Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt; &lt;br /&gt;
direkt per Telnet/SSH auf dem FHEM-Server ausführen und neu starten.&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun eure Fritzbox und könnt diverse Einstellungen manuell vornehmen und/oder automatisch vornehmen lassen.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Siehe [http://fhem.de/commandref_DE.html#FRITZBOX commandref]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Siehe commandref&lt;br /&gt;
&lt;br /&gt;
=== TR-064 ===&lt;br /&gt;
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064.&lt;br /&gt;
&lt;br /&gt;
mit dem Attribute&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; allowTR064Command 1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
kann man den Befehl&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command &amp;lt;service&amp;gt; &amp;lt;control&amp;gt; &amp;lt;action&amp;gt; [[parameterName1 parameterValue1] ...]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
freischalten und damit auf diese Schnittstelle zugreifen.&lt;br /&gt;
&lt;br /&gt;
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Ein weitere Einstiegspunkt befindet sich auch auf der Box unter http://fritz.box:49000/tr64desc.xml&lt;br /&gt;
&lt;br /&gt;
Folgende Service und Controls existieren (für den get-Befehl werden nur die fett formatierten Wörter benötigt)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!serviceType!!controlURL!!XML!!Dokument bei AVM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceInfo:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceinfo&#039;&#039;&#039;||[http://fritz.box:49000/deviceinfoSCPD.xml deviceinfoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceinfoSCPD.pdf deviceinfoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceconfig&#039;&#039;&#039;||[http://fritz.box:49000/deviceconfigSCPD.xml deviceconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf deviceconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Layer3Forwarding:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;layer3forwarding&#039;&#039;&#039;||[http://fritz.box:49000//layer3forwardingSCPD.xml layer3forwardingSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/layer3forwardingSCPD.pdf layer3forwardingSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANConfigSecurity:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanconfigsecurity&#039;&#039;&#039;||[http://fritz.box:49000//lanconfigsecuritySCPD.xml lanconfigsecuritySCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanconfigsecuritySCPD.pdf lanconfigsecuritySCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;ManagementServer:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;mgmsrv&#039;&#039;&#039;||[http://fritz.box:49000//mgmsrvSCPD.xml mgmsrvSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/mgmsrvSCPD.pdf mgmsrvSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Time:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;time&#039;&#039;&#039;||[http://fritz.box:49000//timeSCPD.xml timeSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/timeSCPD.pdf timeSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;UserInterface:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;userif&#039;&#039;&#039;||[http://fritz.box:49000//userifSCPD.xml userifSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/userifSCPD.pdf userifSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_VoIP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_voip&#039;&#039;&#039;||[http://fritz.box:49000//x_voipSCPD.xml x_voipSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_voipSCPD.pdf x_voipSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Storage:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_storage&#039;&#039;&#039;||[http://fritz.box:49000//x_storageSCPD.xml x_storageSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_storageSCPD.pdf x_storageSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_OnTel:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_contact&#039;&#039;&#039;||[http://fritz.box:49000//x_contactSCPD.xml x_contactSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_contactSCPD.pdf x_contactSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_WebDAVClient:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_webdav&#039;&#039;&#039;||[http://fritz.box:49000//x_webdavSCPD.xml x_webdavSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_webdavSCPD.pdf x_webdavSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_UPnP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_upnp&#039;&#039;&#039;||[http://fritz.box:49000//x_upnpSCPD.xml x_upnpSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_upnp.pdf x_upnp.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_RemoteAccess:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_remote&#039;&#039;&#039;||[http://fritz.box:49000/x_remoteSCPD.xml x_remoteSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_remoteSCPD.pdf x_remoteSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_MyFritz:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_myfritz&#039;&#039;&#039;||[http://fritz.box:49000/x_myfritzSCPD.xml x_myfritzSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_myfritzSCPD.pdf x_myfritzSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_TAM:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_tam&#039;&#039;&#039;||[http://fritz.box:49000/x_tamSCPD.xml x_tamSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_tam.pdf x_tam.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_AppSetup:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_appsetup&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_appsetupSCPD.pdf x_appsetupSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Homeauto:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_homeauto&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_homeautoSCPD.pdf x_homeautoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:2&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig2&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:3&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig3&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Hosts:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;hosts&#039;&#039;&#039;||[http://fritz.box:49000/hostsSCPD.xml hostsSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/hostsSCPD.pdf hostsSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANEthernetInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanethernetifcfg&#039;&#039;&#039;||[http://fritz.box:49000/lanifconfigSCPD.xml lanifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanifconfigSCPD.pdf lanifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANHostConfigManagement:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanhostconfigmgm&#039;&#039;&#039;||[http://fritz.box:49000/lanhostconfigmgmSCPD.xml lanhostconfigmgmSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanhostconfigmgmSCPD.pdf lanhostconfigmgmSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANCommonInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wancommonifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wancommonifconfigSCPD.xml wancommonifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wancommonifconfigSCPD.pdf wancommonifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandslifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandslifconfigSCPD.xml wandslifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandslifconfigSCPD.pdf wandslifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandsllinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandsllinkconfigSCPD.xml wandsllinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandsllinkconfigSCPD.pdf wandsllinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANEthernetLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanethlinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wanethlinkconfigSCPD.xml wanethlinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanethlinkconfigSCPD.pdf wanethlinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANPPPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanpppconn1&#039;&#039;&#039;||[http://fritz.box:49000/wanpppconnSCPD.xml wanpppconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanpppconnSCPD.pdf wanpppconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANIPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanipconnection1&#039;&#039;&#039;||[http://fritz.box:49000/wanipconnSCPD.xml wanipconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanipconnSCPD.pdf wanipconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status-Symbol ===&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis www/images/default müssen die passenden Dateien &amp;quot;WLAN_on_gWLAN_off.png&amp;quot;, &amp;quot;WLAN_on_gWLAN_on.png&amp;quot; und &amp;quot;WLAN_off.png&amp;quot; liegen. Wenn die PNGs fehlen, können sie hier [http://forum.fhem.de/index.php/topic,29725.msg318113.html#msg318113] heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der Fhem Oberfläche]]&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun unter &amp;quot;Unsortiert&amp;quot; den im nebenstehenden Screenshot gezeigten Eintrag für das &amp;quot;Gerät&amp;quot; (hier mit dem Icon &amp;quot;it_router&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== TR-064 Bespiele ===&lt;br /&gt;
&lt;br /&gt;
*Box Reboot: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command DeviceConfig:1 deviceconfig Reboot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Klingel- und Sprachausgabe per TR-064 ===&lt;br /&gt;
&lt;br /&gt;
Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie hier [http://forum.fhem.de/index.php/topic,38586.0.html] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul ===&lt;br /&gt;
&lt;br /&gt;
Fritzboxen und die FRITZ!WLAN Repeater speichern den Status angemeldeter Geräte. Dieser Status lässt sich mittels des FRITZBOX Moduls über Readings abfragen, die das Format mac_AA_AA_AA_AA_AA_AA haben und die MAC-Adressen der jeweils angemeldeten Geräte (AA:AA:AA:AA:AA:AA) enthalten. Das Reading existiert, wenn das Gerät angemeldet ist. Wenn das Gerät abgemeldet ist, existiert es nicht mehr. Es gibt auch noch den Zwischenstatus &amp;quot;inactive&amp;quot;, der anscheinend gesetzt wird, bevor das Reading gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des PRESENCE Moduls (vgl. [[Anwesenheitserkennung]]) kann man auf diese Weise den Anwesenheitsstatus abfragen. Anregungen dazu gibt es im zugehörigen {{Link2Forum|Topic=39433|LinkText=Forenthread}} zur Anwesenheitserkennung und in einem Blogpost: [http://heinz-otto.blogspot.de/2015/07/die-zeiten-andern-sich.html]. Auf dieser Basis könnte eine einfache Implementierung zum Beispiel so aussehen:&lt;br /&gt;
&lt;br /&gt;
Funktion in 99_myUtils.pm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sub checkFritzMACpresent($$) {&lt;br /&gt;
  # Benötigt: Name der zu testenden Fritzbox ($Device),&lt;br /&gt;
  #           zu suchende MAC ($MAC), &lt;br /&gt;
  # Rückgabe: 1 = Gerät gefunden&lt;br /&gt;
  #           0 = Gerät nicht gefunden&lt;br /&gt;
  my ($Device, $MAC) = @_;&lt;br /&gt;
  my $Status = 0;&lt;br /&gt;
  $MAC =~ tr/:/_/;&lt;br /&gt;
  $MAC = &amp;quot;mac_&amp;quot;.uc($MAC);&lt;br /&gt;
  my $StatusFritz = ReadingsVal($Device, $MAC, &amp;quot;weg&amp;quot;);&lt;br /&gt;
  if ($StatusFritz eq &amp;quot;weg&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC nicht gefunden, abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } elsif ($StatusFritz eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC ist &amp;gt;inactive&amp;lt;, also abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    # Reading existiert, Rückgabewert ist nicht &amp;quot;inactive&amp;quot;, also ist das Gerät per WLAN angemeldet.&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC gefunden, Gerät heißt &amp;gt;$StatusFritz&amp;lt;.&amp;quot;);&lt;br /&gt;
    $Status = 1;&lt;br /&gt;
  }&lt;br /&gt;
  return $Status&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nutzung dieser Funktion mit dem PRESENCE Modul definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; PRESENCE function {checkFritzMACpresent(&amp;quot;Fritzbox&amp;quot;,&amp;quot;AA:BB:CC:DD:EE:FF&amp;quot;)}  60 60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei&lt;br /&gt;
*&amp;lt;Name&amp;gt; ein beliebig zu wählender Name für die PRESENCE-Funktion ist,&lt;br /&gt;
*Fritzbox der Name ist, mit dem ihr die abzufragende Fritzbox als FRITZBOX definiert habt,&lt;br /&gt;
*AA:BB:CC:DD:EE:FF die MAC-Adresse des gesuchten Geräts ist.&lt;br /&gt;
* &amp;quot;60 60&amp;quot; sagt, dass der Anwesenheitsstatus im 60-Sekunden-Takt abgefragt wird. Das macht natürlich nur Sinn, wenn ihr mit &amp;lt;code&amp;gt;attr Fritzbox INTERVAL 60&amp;lt;/code&amp;gt; den Abfrageinterval bei der Fritzbox auch entsprechend hochgesetzt habt. Der Standard ist 300.&lt;br /&gt;
* &amp;quot;Log 1&amp;quot; führt immer zum Loggen. Das ist zum Einrichten praktisch, ohne dass man gleich für das ganze Modul oder ganz FHEM &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; verbose 5&amp;lt;/code&amp;gt; setzen muss. Wenn es läuft, können die &amp;quot;Log 1&amp;quot;-Zeilen gelöscht, auskommentiert (# an den Zeilenanfang) oder in &amp;quot;Log 5&amp;quot; geändert werden.&lt;br /&gt;
&lt;br /&gt;
==== Mehrere Fritzboxen oder Repeater und Fritzbox (wird noch bearbeitet) ====&lt;br /&gt;
Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen muss die Subroutine in 99_myUtils abgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;my @fbs = devspec2array(&amp;quot;TYPE=FRITZBOX&amp;quot;); (Nur als Hinweis)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Existiert eine zweite Fritzbox im Accesspointmodus werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Hinweise zu komplexeren Abfragen mehrere Boxen auf einmal etc. findet ihr auch im {{Link2Forum|Topic=39433|LinkText=Forenthread}}.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per Notify ===&lt;br /&gt;
Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per Notify anfragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;Name&amp;gt; notify Fritzbox:mac_AA_BB_CC_DD_EE_FF:.* {&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) &lt;br /&gt;
  {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } &lt;br /&gt;
  else &lt;br /&gt;
  {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise:&lt;br /&gt;
*[code]fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);[/code] ist nur ein Beispiel, das einen Dummy auf den Status &amp;quot;absent&amp;quot; bzw. &amp;quot;present&amp;quot; setzt. Man kann hier natürlich auch gleich entsprechende Aktionen durchführen. Wer das Beispiel übernehmen möchte, sollte den Dummy vorher definieren ([code]define anwesend_smartphone dummy[/code]).&lt;br /&gt;
*mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts.&lt;br /&gt;
*&amp;quot;Fritzbox&amp;quot; ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde.&lt;br /&gt;
*Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status &amp;quot;inactive&amp;quot; erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf &amp;quot;inactive&amp;quot; stand, wurde die Abwesend-Aktion schon ausgeführt.&lt;br /&gt;
*Damit der Notify nicht andauernd losgeht, sollte man mittels [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF[/code] Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte man [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL[/code] setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
=== Vergleich Anwesenheitserkennung PRESENCE/Notify ===&lt;br /&gt;
Die Anwesenheitserkennung per regelmäßiger PRESENCE-Abfrage hat den Vorteil, dass sie im Turnus der regelmäßigen Abfragen immer einen aktuellen Status produziert. Sie hat dafür den Nachteil, dass die PRESENCE-Funktionen regelmäßig abgearbeitet werden müssen, auch wenn sich gar nichts ändert. Außerdem aktualisiert sich der Status nicht sofort, sondern erst bei der nächsten regelmäßigen Abfrage. Durch häufiges Abfragen, kann dieser Nachteil verringert werden (bei entsprechend höherer Systemlast).&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung per Notify hat den Vorteil, dass ein sich ändernder Status sofort abgebildet wird. Ändert sich kein Status, werden keine Routinen ausgeführt, was die Systemlast gering hält. Der Nachteil ist, dass - z.B. nach einem Systemstart - die entsprechende Aktion erst bei einer Änderung des Status ausgeführt wird. D.h. ist das zu testende Gerät anwesend, wird dann FHEM beendet, das Gerät entfernt und FHEM wieder gestartet, ist der Status in FHEM immer noch &amp;quot;anwesend&amp;quot;. Da das Reading für das Gerät nicht existiert, wird darauf auch erst wieder ein Notify ausgeführt, wenn sich der Status des Geräts wieder ändert, d.h. es wieder ankommt. Bis dahin ist der Status im System falsch. &lt;br /&gt;
Der Nachteil des Notify kann verringert werden, wenn man statt [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF[/code] ein [code]attr Fritzbox event-on-update-reading mac_AA_BB_CC_DD_EE_FF[/code] setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status &amp;quot;anwesend&amp;quot;. Bei &amp;quot;abwesend&amp;quot; ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird.&lt;br /&gt;
Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf &amp;quot;GLOBAL:initialized&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
global:INITIALIZED {&lt;br /&gt;
  Reset_Variables;&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } else&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status&#039; verpasst hat.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=12093</id>
		<title>FRITZBOX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=12093"/>
		<updated>2015-09-07T10:33:37Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: /* Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung einer Fritz!Box über Fhem&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=FRITZ!Box&lt;br /&gt;
|ModTechName=72_FRITZBOX.pm&lt;br /&gt;
|ModOwner=tupol/Topos ([http://forum.fhem.de/index.php?action=profile;u=5432 Forum] / [[Benutzer Diskussion:Topos|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] und von AVM FRITZ!WLAN Repeatern durch Fhem. An Fritzboxen können sowohl Geräte abgefragt werden, auf denen FHEM selbst läuft (lokaler Modus), als auch um eine entfernte (externe) Geräte.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Remote-Zugang ===&lt;br /&gt;
Für den Remote-Zugang müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem [[Raspberry Pi]] oder unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
=== Telnet ===&lt;br /&gt;
Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe {{Link2Forum|Topic=38586|LinkText=dieses Forenthema}}). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen: &lt;br /&gt;
&lt;br /&gt;
# Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon&lt;br /&gt;
&lt;br /&gt;
# Auf dem System, auf dem Fhem läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] und unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
Zur Erstinstallation reicht ein einfaches &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt).&lt;br /&gt;
&lt;br /&gt;
==== TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
Für den Fernzugriff über TR-064 auf eine oder mehrere Fritzboxen und/oder einen FRITZ!WLAN Repeater sind die folgenden Schritte nötig (für jedes Gerät):&lt;br /&gt;
&lt;br /&gt;
Fritzbox definieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox boxUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
Manuelle TR-064 Kommandos erlauben (die Abfrage per TR-064 funktioniert auch ohne dieses Attribut):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox allowTR064Command 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Fritzbox nicht unter http://fritz.box erreichbar ist, IP setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox fritzBoxIP 192.168.168.168&amp;lt;/code&amp;gt;&lt;br /&gt;
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann bei fritzBoxIP - trotz des Namens des Attributs - statt der IP auch der Hostname eingegeben werden, eine DNS-Auflösung findet statt.&lt;br /&gt;
&lt;br /&gt;
Manchmal ist ein Neustart von FHEM erforderlich, damit die Fritzbox mit der veränderten IP gefunden wird.&lt;br /&gt;
&lt;br /&gt;
==== Telnet: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
[[Datei:Screenshot_FritzBox_TelnetUser.png|mini|300px|rechts|Anlegen des Attributs telnetUser]]&lt;br /&gt;
Bei Fernzugriff über Telnet sind weitere Schritte nötig:&lt;br /&gt;
# Telnet auf der Fritzbox freischalten (Tastenkombination #96*7* am angeschlossenen Telefon (auch FritzFon)&lt;br /&gt;
# TelnetUser definieren (wie im Screenshot gezeigt)&lt;br /&gt;
# Passwort zum Benutzer auf der Fritzbox definieren&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot_FritzBox_Passwort.png|mini|300px|rechts|Passwort definieren]]&lt;br /&gt;
&lt;br /&gt;
(bitte die Buttons {{Taste|set}} und {{Taste|attr}} bei der Definition der jeweiligen Einträge nicht vergessen)&lt;br /&gt;
&lt;br /&gt;
Wer stattdessen lieber das [[Konfiguration|Befehl-Eingabefeld]] verwendet:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox telnetUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt; - legt den Benutzer fest&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
Wer keinen User konfiguriert hat, kann das Feld &amp;quot;telnetUser&amp;quot; leer lassen.&lt;br /&gt;
&lt;br /&gt;
Wer sicher gehen möchte, dass auch tatsächlich Telnet und nicht andere Zugriffe benutzt werden, sollte außerdem noch setzen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox forceTelnetConnection 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mögliche Fehlermeldungen ===&lt;br /&gt;
Sollte schon bei &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt; die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte prüfen, ob Fhem auf dem aktuellen Stand ist und ggf. [[Update|aktualisieren]].&lt;br /&gt;
&lt;br /&gt;
Kommt jetzt bei der erneuten Definition die Fehlermeldung &amp;lt;code&amp;gt;Error: Perl modul Net::Telnet is missing on this system&amp;lt;/code&amp;gt; bitte wie oben schon erwähnt den Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt; &lt;br /&gt;
direkt per Telnet/SSH auf dem FHEM-Server ausführen und neu starten.&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun eure Fritzbox und könnt diverse Einstellungen manuell vornehmen und/oder automatisch vornehmen lassen.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Siehe [http://fhem.de/commandref_DE.html#FRITZBOX commandref]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Siehe commandref&lt;br /&gt;
&lt;br /&gt;
=== TR-064 ===&lt;br /&gt;
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064.&lt;br /&gt;
&lt;br /&gt;
mit dem Attribute&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; allowTR064Command 1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
kann man den Befehl&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command &amp;lt;service&amp;gt; &amp;lt;control&amp;gt; &amp;lt;action&amp;gt; [[parameterName1 parameterValue1] ...]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
freischalten und damit auf diese Schnittstelle zugreifen.&lt;br /&gt;
&lt;br /&gt;
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Ein weitere Einstiegspunkt befindet sich auch auf der Box unter http://fritz.box:49000/tr64desc.xml&lt;br /&gt;
&lt;br /&gt;
Folgende Service und Controls existieren (für den get-Befehl werden nur die fett formatierten Wörter benötigt)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!serviceType!!controlURL!!XML!!Dokument bei AVM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceInfo:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceinfo&#039;&#039;&#039;||[http://fritz.box:49000/deviceinfoSCPD.xml deviceinfoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceinfoSCPD.pdf deviceinfoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceconfig&#039;&#039;&#039;||[http://fritz.box:49000/deviceconfigSCPD.xml deviceconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf deviceconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Layer3Forwarding:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;layer3forwarding&#039;&#039;&#039;||[http://fritz.box:49000//layer3forwardingSCPD.xml layer3forwardingSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/layer3forwardingSCPD.pdf layer3forwardingSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANConfigSecurity:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanconfigsecurity&#039;&#039;&#039;||[http://fritz.box:49000//lanconfigsecuritySCPD.xml lanconfigsecuritySCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanconfigsecuritySCPD.pdf lanconfigsecuritySCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;ManagementServer:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;mgmsrv&#039;&#039;&#039;||[http://fritz.box:49000//mgmsrvSCPD.xml mgmsrvSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/mgmsrvSCPD.pdf mgmsrvSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Time:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;time&#039;&#039;&#039;||[http://fritz.box:49000//timeSCPD.xml timeSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/timeSCPD.pdf timeSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;UserInterface:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;userif&#039;&#039;&#039;||[http://fritz.box:49000//userifSCPD.xml userifSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/userifSCPD.pdf userifSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_VoIP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_voip&#039;&#039;&#039;||[http://fritz.box:49000//x_voipSCPD.xml x_voipSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_voipSCPD.pdf x_voipSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Storage:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_storage&#039;&#039;&#039;||[http://fritz.box:49000//x_storageSCPD.xml x_storageSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_storageSCPD.pdf x_storageSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_OnTel:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_contact&#039;&#039;&#039;||[http://fritz.box:49000//x_contactSCPD.xml x_contactSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_contactSCPD.pdf x_contactSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_WebDAVClient:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_webdav&#039;&#039;&#039;||[http://fritz.box:49000//x_webdavSCPD.xml x_webdavSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_webdavSCPD.pdf x_webdavSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_UPnP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_upnp&#039;&#039;&#039;||[http://fritz.box:49000//x_upnpSCPD.xml x_upnpSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_upnp.pdf x_upnp.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_RemoteAccess:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_remote&#039;&#039;&#039;||[http://fritz.box:49000/x_remoteSCPD.xml x_remoteSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_remoteSCPD.pdf x_remoteSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_MyFritz:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_myfritz&#039;&#039;&#039;||[http://fritz.box:49000/x_myfritzSCPD.xml x_myfritzSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_myfritzSCPD.pdf x_myfritzSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_TAM:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_tam&#039;&#039;&#039;||[http://fritz.box:49000/x_tamSCPD.xml x_tamSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_tam.pdf x_tam.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_AppSetup:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_appsetup&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_appsetupSCPD.pdf x_appsetupSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Homeauto:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_homeauto&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_homeautoSCPD.pdf x_homeautoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:2&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig2&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:3&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig3&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Hosts:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;hosts&#039;&#039;&#039;||[http://fritz.box:49000/hostsSCPD.xml hostsSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/hostsSCPD.pdf hostsSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANEthernetInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanethernetifcfg&#039;&#039;&#039;||[http://fritz.box:49000/lanifconfigSCPD.xml lanifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanifconfigSCPD.pdf lanifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANHostConfigManagement:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanhostconfigmgm&#039;&#039;&#039;||[http://fritz.box:49000/lanhostconfigmgmSCPD.xml lanhostconfigmgmSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanhostconfigmgmSCPD.pdf lanhostconfigmgmSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANCommonInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wancommonifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wancommonifconfigSCPD.xml wancommonifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wancommonifconfigSCPD.pdf wancommonifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandslifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandslifconfigSCPD.xml wandslifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandslifconfigSCPD.pdf wandslifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandsllinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandsllinkconfigSCPD.xml wandsllinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandsllinkconfigSCPD.pdf wandsllinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANEthernetLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanethlinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wanethlinkconfigSCPD.xml wanethlinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanethlinkconfigSCPD.pdf wanethlinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANPPPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanpppconn1&#039;&#039;&#039;||[http://fritz.box:49000/wanpppconnSCPD.xml wanpppconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanpppconnSCPD.pdf wanpppconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANIPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanipconnection1&#039;&#039;&#039;||[http://fritz.box:49000/wanipconnSCPD.xml wanipconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanipconnSCPD.pdf wanipconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status-Symbol ===&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis www/images/default müssen die passenden Dateien &amp;quot;WLAN_on_gWLAN_off.png&amp;quot;, &amp;quot;WLAN_on_gWLAN_on.png&amp;quot; und &amp;quot;WLAN_off.png&amp;quot; liegen. Wenn die PNGs fehlen, können sie hier [http://forum.fhem.de/index.php/topic,29725.msg318113.html#msg318113] heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der Fhem Oberfläche]]&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun unter &amp;quot;Unsortiert&amp;quot; den im nebenstehenden Screenshot gezeigten Eintrag für das &amp;quot;Gerät&amp;quot; (hier mit dem Icon &amp;quot;it_router&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== TR-064 Bespiele ===&lt;br /&gt;
&lt;br /&gt;
*Box Reboot: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command DeviceConfig:1 deviceconfig Reboot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Klingel- und Sprachausgabe per TR-064 ===&lt;br /&gt;
&lt;br /&gt;
Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie hier [http://forum.fhem.de/index.php/topic,38586.0.html] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul ===&lt;br /&gt;
&lt;br /&gt;
Fritzboxen und die FRITZ!WLAN Repeater speichern den Status angemeldeter Geräte. Dieser Status lässt sich mittels des FRITZBOX Moduls über Readings abfragen, die das Format mac_AA_AA_AA_AA_AA_AA haben und die MAC-Adressen der jeweils angemeldeten Geräte (AA:AA:AA:AA:AA:AA) enthalten. Das Reading existiert, wenn das Gerät angemeldet ist. Wenn das Gerät abgemeldet ist, existiert es nicht mehr. Es gibt auch noch den Zwischenstatus &amp;quot;inactive&amp;quot;, der anscheinend gesetzt wird, bevor das Reading gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des PRESENCE Moduls (vgl. [[Anwesenheitserkennung]]) kann man auf diese Weise den Anwesenheitsstatus abfragen. Anregungen dazu gibt es im zugehörigen {{Link2Forum|Topic=39433|LinkText=Forenthread}} zur Anwesenheitserkennung und in einem Blogpost: [http://heinz-otto.blogspot.de/2015/07/die-zeiten-andern-sich.html]. Auf dieser Basis könnte eine einfache Implementierung zum Beispiel so aussehen:&lt;br /&gt;
&lt;br /&gt;
Funktion in 99_myUtils.pm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sub checkFritzMACpresent($$) {&lt;br /&gt;
  # Benötigt: Name der zu testenden Fritzbox ($Device),&lt;br /&gt;
  #           zu suchende MAC ($MAC), &lt;br /&gt;
  # Rückgabe: 1 = Gerät gefunden&lt;br /&gt;
  #           0 = Gerät nicht gefunden&lt;br /&gt;
  my ($Device, $MAC) = @_;&lt;br /&gt;
  my $Status = 0;&lt;br /&gt;
  $MAC =~ tr/:/_/;&lt;br /&gt;
  $MAC = &amp;quot;mac_&amp;quot;.uc($MAC);&lt;br /&gt;
  my $StatusFritz = ReadingsVal($Device, $MAC, &amp;quot;weg&amp;quot;);&lt;br /&gt;
  if ($StatusFritz eq &amp;quot;weg&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC nicht gefunden, abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } elsif ($StatusFritz eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC ist &amp;gt;inactive&amp;lt;, also abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    # Reading existiert, Rückgabewert ist nicht &amp;quot;inactive&amp;quot;, also ist das Gerät per WLAN angemeldet.&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC gefunden, Gerät heißt &amp;gt;$StatusFritz&amp;lt;.&amp;quot;);&lt;br /&gt;
    $Status = 1;&lt;br /&gt;
  }&lt;br /&gt;
  return $Status&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nutzung dieser Funktion mit dem PRESENCE Modul definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; PRESENCE function {checkFritzMACpresent(&amp;quot;Fritzbox&amp;quot;,&amp;quot;AA:BB:CC:DD:EE:FF&amp;quot;)}  60 60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei&lt;br /&gt;
*&amp;lt;Name&amp;gt; ein beliebig zu wählender Name für die PRESENCE-Funktion ist,&lt;br /&gt;
*Fritzbox der Name ist, mit dem ihr die abzufragende Fritzbox als FRITZBOX definiert habt,&lt;br /&gt;
*AA:BB:CC:DD:EE:FF die MAC-Adresse des gesuchten Geräts ist.&lt;br /&gt;
* &amp;quot;60 60&amp;quot; sagt, dass der Anwesenheitsstatus im 60-Sekunden-Takt abgefragt wird. Das macht natürlich nur Sinn, wenn ihr mit &amp;lt;code&amp;gt;attr Fritzbox INTERVAL 60&amp;lt;/code&amp;gt; den Abfrageinterval bei der Fritzbox auch entsprechend hochgesetzt habt. Der Standard ist 300.&lt;br /&gt;
* &amp;quot;Log 1&amp;quot; führt immer zum Loggen. Das ist zum Einrichten praktisch, ohne dass man gleich für das ganze Modul oder ganz FHEM &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; verbose 5&amp;lt;/code&amp;gt; setzen muss. Wenn es läuft, können die &amp;quot;Log 1&amp;quot;-Zeilen gelöscht, auskommentiert (# an den Zeilenanfang) oder in &amp;quot;Log 5&amp;quot; geändert werden.&lt;br /&gt;
&lt;br /&gt;
==== Mehrere Fritzboxen oder Repeater und Fritzbox (wird noch bearbeitet) ====&lt;br /&gt;
Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen muss die Subroutine in 99_myUtils abgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;my @fbs = devspec2array(&amp;quot;TYPE=FRITZBOX&amp;quot;); (Nur als Hinweis)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Existiert eine zweite Fritzbox im Accesspointmodus werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Hinweise zu komplexeren Abfragen mehrere Boxen auf einmal etc. findet ihr auch im {{Link2Forum|Topic=39433|LinkText=Forenthread}}.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per Notify ===&lt;br /&gt;
Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per Notify anfragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define &amp;lt;Name&amp;gt; notify Fritzbox:mac_AA_BB_CC_DD_EE_FF:.* {&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } else&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise:&lt;br /&gt;
*[code]fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);[/code] ist nur ein Beispiel, das einen Dummy auf den Status &amp;quot;absent&amp;quot; bzw. &amp;quot;present&amp;quot; setzt. Man kann hier natürlich auch gleich entsprechende Aktionen durchführen. Wer das Beispiel übernehmen möchte, sollte den Dummy vorher definieren ([code]define anwesend_smartphone dummy[/code]).&lt;br /&gt;
*mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts.&lt;br /&gt;
*&amp;quot;Fritzbox&amp;quot; ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde.&lt;br /&gt;
*Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status &amp;quot;inactive&amp;quot; erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf &amp;quot;inactive&amp;quot; stand, wurde die Abwesend-Aktion schon ausgeführt.&lt;br /&gt;
*Damit der Notify nicht andauernd losgeht, sollte man mittels [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF[/code] Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte man [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL[/code] setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
=== Vergleich Anwesenheitserkennung PRESENCE/Notify ===&lt;br /&gt;
Die Anwesenheitserkennung per regelmäßiger PRESENCE-Abfrage hat den Vorteil, dass sie im Turnus der regelmäßigen Abfragen immer einen aktuellen Status produziert. Sie hat dafür den Nachteil, dass die PRESENCE-Funktionen regelmäßig abgearbeitet werden müssen, auch wenn sich gar nichts ändert. Außerdem aktualisiert sich der Status nicht sofort, sondern erst bei der nächsten regelmäßigen Abfrage. Durch häufiges Abfragen, kann dieser Nachteil verringert werden (bei entsprechend höherer Systemlast).&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung per Notify hat den Vorteil, dass ein sich ändernder Status sofort abgebildet wird. Ändert sich kein Status, werden keine Routinen ausgeführt, was die Systemlast gering hält. Der Nachteil ist, dass - z.B. nach einem Systemstart - die entsprechende Aktion erst bei einer Änderung des Status ausgeführt wird. D.h. ist das zu testende Gerät anwesend, wird dann FHEM beendet, das Gerät entfernt und FHEM wieder gestartet, ist der Status in FHEM immer noch &amp;quot;anwesend&amp;quot;. Da das Reading für das Gerät nicht existiert, wird darauf auch erst wieder ein Notify ausgeführt, wenn sich der Status des Geräts wieder ändert, d.h. es wieder ankommt. Bis dahin ist der Status im System falsch. &lt;br /&gt;
Der Nachteil des Notify kann verringert werden, wenn man statt [code]attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF[/code] ein [code]attr Fritzbox event-on-update-reading mac_AA_BB_CC_DD_EE_FF[/code] setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status &amp;quot;anwesend&amp;quot;. Bei &amp;quot;abwesend&amp;quot; ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird.&lt;br /&gt;
Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf &amp;quot;GLOBAL:initialized&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
global:INITIALIZED {&lt;br /&gt;
  Reset_Variables;&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } else&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status&#039; verpasst hat.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=11560</id>
		<title>FRITZBOX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=11560"/>
		<updated>2015-06-29T19:04:40Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: libjson-xs-perl hinzugefuegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung einer Fritz!Box über Fhem&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=72_FRITZBOX.pm&lt;br /&gt;
|ModOwner=tupol/Topos ([http://forum.fhem.de/index.php?action=profile;u=5432 Forum] / [[Benutzer Diskussion:Topos|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] durch Fhem. Dabei kann es sich dabei sowohl um eine FritzBox handeln, auf der Fhem selbst läuft (lokaler Modus), als auch um eine entfernte (externe) FritzBox.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Um das Modul für den Zugriff auf eine externe FritzBox benutzen zu können, muss &lt;br /&gt;
# Telnet auf der entsprechenden FritzBox erlaubt/freigeschaltet sein (üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon) &lt;br /&gt;
# Auf dem System, auf dem Fhem läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
Für einen (begrenzten) Remote-Zugang ohne Telnet müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem [[Raspberry Pi]] z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:::&amp;lt;code&amp;gt;sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
Zur Erstinstallation reicht ein einfaches &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff(FHEM auf einem anderen Server im Netz, siehe nächsten Schritt).&lt;br /&gt;
&lt;br /&gt;
==== Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
[[Datei:Screenshot_FritzBox_TelnetUser.png|mini|300px|rechts|Anlegen des Attributs telnetUser]]&lt;br /&gt;
Bei Fernzugriff sind weitere Schritte nötig:&lt;br /&gt;
# Telnet auf der Fritzbox freischalten (Tastenkombination #96*7* am angeschlossenen Telefon (auch FritzFon)&lt;br /&gt;
# TelnetUser definieren (wie im Screenshot gezeigt)&lt;br /&gt;
# Passwort zum Benutzer auf der Fritzbox definieren&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot_FritzBox_Passwort.png|mini|300px|rechts|Passwort definieren]]&lt;br /&gt;
&lt;br /&gt;
(bitte die Buttons {{Taste|set}} und {{Taste|attr}} bei der Definition der jeweiligen Einträge nicht vergessen)&lt;br /&gt;
&lt;br /&gt;
==== ...für die Profis ====&lt;br /&gt;
(die Telnet auf ihrer FritzBox vermutlich ohnehin längst aktiviert haben)&lt;br /&gt;
&lt;br /&gt;
hier die Befehle für das [[Konfiguration|Befehl-Eingabefeld]]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr Fritzbox telnetUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt; - legt den Benutzer fest&lt;br /&gt;
:&amp;lt;code&amp;gt;set Fritzbox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
=== mögliche Fehlermeldungen ===&lt;br /&gt;
Sollte schon bei &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt; die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte prüfen, ob Fhem auf dem aktuellen Stand ist und ggf. [[Update|aktualisieren]].&lt;br /&gt;
&lt;br /&gt;
Kommt jetzt bei der erneuten Definition die Fehlermeldung &amp;lt;code&amp;gt;Error: Perl modul Net::Telnet is missing on this system&amp;lt;/code&amp;gt; bitte wie oben schon erwähnt den Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt; &lt;br /&gt;
direkt per Telnet/SSH auf dem FHEM-Server ausführen und neu starten.&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun eure Fritzbox und könnt diverse Einstellungen manuell vornehmen und/oder automatisch vornehmen lassen.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Siehe [http://fhem.de/commandref_DE.html#FRITZBOX commandref]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Siehe commandref&lt;br /&gt;
&lt;br /&gt;
====Status-Symbol====&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis www/images/default müssen die passenden Dateien &amp;quot;WLAN_on_gWLAN_off.png&amp;quot;, &amp;quot;WLAN_on_gWLAN_on.png&amp;quot; und &amp;quot;WLAN_off.png&amp;quot; liegen.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der Fhem Oberfläche]]&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun unter &amp;quot;Unsortiert&amp;quot; den im nebenstehenden Screenshot gezeigten Eintrag für das &amp;quot;Gerät&amp;quot; (hier mit dem Icon &amp;quot;it_router&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== TR-064 ==&lt;br /&gt;
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064.&lt;br /&gt;
&lt;br /&gt;
mit dem Attribute&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; allowTR064Command 1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
kann man den Befehl&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command &amp;lt;service&amp;gt; &amp;lt;control&amp;gt; &amp;lt;action&amp;gt; [[parameterName1 parameterValue1] ...]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
freischalten und damit auf diese Schnittstelle zugreifen.&lt;br /&gt;
&lt;br /&gt;
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Ein weitere Einstiegspunkt befindet sich auch auf der Box unter http://fritz.box:49000/tr64desc.xml&lt;br /&gt;
&lt;br /&gt;
Folgende Service und Controls existieren (für den get-Befehl werden nur die fett formatierten Wörter benötigt)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!serviceType!!controlURL!!XML!!Dokument bei AVM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceInfo:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceinfo&#039;&#039;&#039;||[http://fritz.box:49000/deviceinfoSCPD.xml deviceinfoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceinfoSCPD.pdf deviceinfoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceconfig&#039;&#039;&#039;||[http://fritz.box:49000/deviceconfigSCPD.xml deviceconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf deviceconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Layer3Forwarding:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;layer3forwarding&#039;&#039;&#039;||[http://fritz.box:49000//layer3forwardingSCPD.xml layer3forwardingSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/layer3forwardingSCPD.pdf layer3forwardingSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANConfigSecurity:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanconfigsecurity&#039;&#039;&#039;||[http://fritz.box:49000//lanconfigsecuritySCPD.xml lanconfigsecuritySCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanconfigsecuritySCPD.pdf lanconfigsecuritySCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;ManagementServer:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;mgmsrv&#039;&#039;&#039;||[http://fritz.box:49000//mgmsrvSCPD.xml mgmsrvSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/mgmsrvSCPD.pdf mgmsrvSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Time:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;time&#039;&#039;&#039;||[http://fritz.box:49000//timeSCPD.xml timeSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/timeSCPD.pdf timeSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;UserInterface:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;userif&#039;&#039;&#039;||[http://fritz.box:49000//userifSCPD.xml userifSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/userifSCPD.pdf userifSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_VoIP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_voip&#039;&#039;&#039;||[http://fritz.box:49000//x_voipSCPD.xml x_voipSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_voipSCPD.pdf x_voipSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Storage:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_storage&#039;&#039;&#039;||[http://fritz.box:49000//x_storageSCPD.xml x_storageSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_storageSCPD.pdf x_storageSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_OnTel:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_contact&#039;&#039;&#039;||[http://fritz.box:49000//x_contactSCPD.xml x_contactSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_contactSCPD.pdf x_contactSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_WebDAVClient:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_webdav&#039;&#039;&#039;||[http://fritz.box:49000//x_webdavSCPD.xml x_webdavSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_webdavSCPD.pdf x_webdavSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_UPnP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_upnp&#039;&#039;&#039;||[http://fritz.box:49000//x_upnpSCPD.xml x_upnpSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_upnp.pdf x_upnp.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_RemoteAccess:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_remote&#039;&#039;&#039;||[http://fritz.box:49000/x_remoteSCPD.xml x_remoteSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_remoteSCPD.pdf x_remoteSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_MyFritz:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_myfritz&#039;&#039;&#039;||[http://fritz.box:49000/x_myfritzSCPD.xml x_myfritzSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_myfritzSCPD.pdf x_myfritzSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_TAM:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_tam&#039;&#039;&#039;||[http://fritz.box:49000/x_tamSCPD.xml x_tamSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_tam.pdf x_tam.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_AppSetup:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_appsetup&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_appsetupSCPD.pdf x_appsetupSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Homeauto:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_homeauto&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_homeautoSCPD.pdf x_homeautoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:2&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig2&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:3&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig3&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Hosts:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;hosts&#039;&#039;&#039;||[http://fritz.box:49000/hostsSCPD.xml hostsSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/hostsSCPD.pdf hostsSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANEthernetInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanethernetifcfg&#039;&#039;&#039;||[http://fritz.box:49000/lanifconfigSCPD.xml lanifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanifconfigSCPD.pdf lanifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANHostConfigManagement:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanhostconfigmgm&#039;&#039;&#039;||[http://fritz.box:49000/lanhostconfigmgmSCPD.xml lanhostconfigmgmSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanhostconfigmgmSCPD.pdf lanhostconfigmgmSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANCommonInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wancommonifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wancommonifconfigSCPD.xml wancommonifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wancommonifconfigSCPD.pdf wancommonifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandslifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandslifconfigSCPD.xml wandslifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandslifconfigSCPD.pdf wandslifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandsllinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandsllinkconfigSCPD.xml wandsllinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandsllinkconfigSCPD.pdf wandsllinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANEthernetLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanethlinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wanethlinkconfigSCPD.xml wanethlinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanethlinkconfigSCPD.pdf wanethlinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANPPPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanpppconn1&#039;&#039;&#039;||[http://fritz.box:49000/wanpppconnSCPD.xml wanpppconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanpppconnSCPD.pdf wanpppconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANIPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanipconnection1&#039;&#039;&#039;||[http://fritz.box:49000/wanipconnSCPD.xml wanipconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanipconnSCPD.pdf wanipconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== TR-064 Bespiele ==&lt;br /&gt;
&lt;br /&gt;
*Box Reboot: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command DeviceConfig:1 deviceconfig Reboot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=10461</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=10461"/>
		<updated>2015-03-08T16:18:43Z</updated>

		<summary type="html">&lt;p&gt;Stormmurdoc: Hello World hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. &lt;br /&gt;
Insbesondere beschreibt der Text derzeit nur einstufige Module. Die Abgrenzung zu zweistufigen Modulen und deren Eigenschaften sollte noch ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Um neue Geräte in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben, das automatisch von FHEM geladen wird, wenn ein passendes Gerät in FHEM definiert wird. Das Modul definiert dann wie mit dem Gerät kommuniziert wird, stellt Werte (&amp;quot;Readings&amp;quot;) innerhalb von FHEM zur Verfügung oder erlaubt es das Gerät mit &amp;quot;Set&amp;quot;-Befehlen zu beeinflussen. Dieser Text soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;quot;define&amp;quot;, der typischerweise in die zentrale Konfigurationsdatei fhem.cfg  eingetragen wird, werden Geräte in FHEM definiert. Der Befehl sorgt dafür dass ein neues Modul bei Bedarf geladen wird und die Initialisierungsfunktion des Moduls aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Geräts, der Name des Moduls und der Name der Initialisierungsfunktion zueinander passen. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick in einer Fritz-Box könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 JeeLink /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In der fhem.pl wird der define-Befehl verarbeitet, geprüft, ob ein Modul mit Namen JeeLink schon geladen ist und falls nicht ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (bei einer FritzBox z.B. /var/media/ftp/fhem/FHEM) gesucht und dann geladen. &lt;br /&gt;
Danach wird die Funktion JeeLink_Initialize aufgerufen.&lt;br /&gt;
Die Moduldatei muss also nach dem Namen des Geräts benannt werden und eine Funktion mit dem Namen des Geräts und einer _initialize Funktion enthalten.&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden dann die Namen der aller weiteren Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird der Hash - das ist die zentrale Datenstruktur für jede Instanz eines Gerätes - mit entsprechenden Werten gefüllt.&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$defs{&#039;&#039;Devicename&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist auf den Hash der Geräteinstanz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben, das direkt von fhem.pl aufgerufen wird. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im GUI als &amp;quot;Internals&amp;quot; angezeigt werden oder die Readings des Geräts. Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{TYPE}&amp;lt;/code&amp;gt;  enthält die Typbezeichnung des Geräts &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; enthält ein Abfrageintervall&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM führt Module normalerweise nicht parallel aus. Daher wäre es ungünstig wenn Module Werte von einem Gerät abfragen und dann auf die Antwort des Geräts warten. In dieser Zeit wäre der Rest von FHEM blockiert. Die Ein- und Ausgabe sollte ohne Blockieren erfolgen und die Verarbeitung mehrerer Ein- und Ausgabekanäle quasi parallel ermöglichen. &lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sein können. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet und entsprechend gibt es in FHEM eine selectlist, in der die Filedeskriptoren der Geräedateien (z.B. /dev/ttyUSBx etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife von fhem.pl wird mit select überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion (X_Read) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und die Schleife wird weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per select überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion (X_Ready) implementieren, die prüft ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Werte, die von einem Gerät gelesen werden und in FHEM zur Verfügung stehen werden Readings genannt. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion ReadingsVal($$$) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Readings werden im statefile von FHEM automatisch zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen, auch bevor sie vom Modul neu gesetzt oder aktualisiert werden. &lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;readingsBeginUpdate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingsBulkUpdate&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;readingsEndUpdate&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;readingsSingleUpdate&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht.  Events erzeugen spürbare Last auf dem System (siehe NotifyFn), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Werte, die das Modul intern als Teil des Hashes speichert, die aber keine Readings sind, nennt man Internals. Sie werden ebenfalls als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; für ein Abfrageintervall, das beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Internals werden jedoch im Gegensatz zu Readings nicht im statefile zwischengespeichert. &lt;br /&gt;
&lt;br /&gt;
Falls Werte wie das gerade erwähnte Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollen, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen nach dem Define-Befehl zusätzlich den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; erwarten.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Parameter einer Geräteinstanz können mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; als so genannte Attribute gesetzt und damit dem Modul zur Verfügung gestellt werden. Attribute werden zusammen mit der Definition der Geräte beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben, die auch bei jedem Neustart von FHEM wieder gelesen wird. Zur Laufzeit werden Attribute in der globalen Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt; gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert (&amp;lt;code&amp;gt;$attr{$name}-&amp;gt;{&#039;header&#039;}&amp;lt;/code&amp;gt; wäre eine alternative aber unübliche Schreibweise für die selbe Variable). &lt;br /&gt;
&lt;br /&gt;
Zum Auslesen solcher Attribute sollte die Funktion &amp;lt;code&amp;gt;AttrVal($$$)&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt sollte in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen der Variable &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten). Wenn beim Setzen von Attributen die Werte geprüft werden sollen oder zusätzliche Funktionalität implementiert werden muss, dann kann dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; ([[#X_Attr|siehe unten]]) implementiert werden.&lt;br /&gt;
&lt;br /&gt;
== Die wichtigsten Funktionen in einem Modul ==&lt;br /&gt;
Eine typische Grundfunktion eines einfachen Moduls ist das Auslesen von Werten von einem physischen Gerät und Bereitstellen dieser Werte innerhalb von FHEM als Readings. Das Geräte könnte beispielsweise an einem USB-Port angeschlossen sein. Folgende Funktionen könnte man beispielsweise in einem Modul mit Namen X implementieren:&lt;br /&gt;
* [[#X_Initialize|X_Initialize]] (initialisiert das Modul und gibt de Namen der zusätzlichen Funktionen bekannt)&lt;br /&gt;
* [[#X_Define|X_Define]] (wird beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; aufgerufen)&lt;br /&gt;
* [[#X_Undef|X_Undef]] (wird beim Löschen einer Geräteinstanz aufgerufen - Gegenteil zu &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [[#X_Set|X_Set]] (wird beim Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; aufgerufen um Daten an das Gerät zu senden)&lt;br /&gt;
* [[#X_Get|X_Get]] (wird beim Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; aufgerufen um Daten vom Gerät abzufragen)&lt;br /&gt;
* [[#X_Attr|X_Attr]] (wird beim Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; aufgerufen um beispielsweise Werte zu prüfen)&lt;br /&gt;
* [[#X_Read|X_Read]] (wird vom globalen select aufgerufen, falls Daten zur Verfuegung stehen)&lt;br /&gt;
* [[#X_Parse|X_Parse]] (wird bei zweistufigen Modulen vom Dispatch aufgerufen und muss hier noch beschrieben werden)&lt;br /&gt;
* [[#X_Ready|X_Ready]] (wird unter windows als ReadFn-Erstatz benoetigt bzw. um zu pruefen, ob ein Geraet wieder eingesteckt ist)&lt;br /&gt;
* [[#X_Notify|X_Notify]] (falls man benachrichtigt werden will)&lt;br /&gt;
* [[#X_Rename|X_Rename]] (falls ein Gerät umbenannt wird)&lt;br /&gt;
&lt;br /&gt;
Die Funktionen werden im folgenden beschrieben (soweit diese Seite inzwischen vollständig ist):&lt;br /&gt;
&lt;br /&gt;
=== X_Initialize ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von Fhem.pl nach dem Laden des Moduls aufgerufen und bekommt einen Hash für das Modul als zentrale Datenstruktur übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash wird im globalen Hash %modules gespeichert. &amp;lt;code&amp;gt;$modules{$ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;$ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der je Modul Werte enthält, beispielsweise auch die Namen der Funktionen, die das Modul implementiert und die fhem.pl aufrufen soll. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}   = &amp;quot;X_Define&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{UndefFn} = &amp;quot;X_Undef&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{SetFn}   = &amp;quot;X_Set&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{GetFn}   = &amp;quot;X_Get&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}  = &amp;quot;X_Attr&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ist wieder durch den Modulnamen ohne die vorangestellte Zahl zu ersetzen. &lt;br /&gt;
Entsprechend können auch die Funktionen &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; etc. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützen Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem.pl werden dann die entsprechenden Werte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die Funktion &amp;lt;code&amp;gt;X_Attr&amp;lt;/code&amp;gt; implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann verfügbar werden wenn das Modul zum Setzen von Readings die Funktionen readingsBeginUpdate, readingsBulkUpdate, readingsEndUpdate oder readingsSingleUpdate verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref.&lt;br /&gt;
&lt;br /&gt;
=== X_Define ===&lt;br /&gt;
Die Define-Funktion eines Moduls wird von Fhem aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.)&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub HTTPMOD_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den Rest der Parameter, die im Befehl angegeben wurden. Welche und wie viele Parameter &lt;br /&gt;
akzeptiert werden ist Sache dieser Funktion. Im obigen Beispiel wird alles nach dem übergebenen Hash in ein Array aufgeteilt und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name 	= $a[0];&lt;br /&gt;
my $url 	= $a[2];&lt;br /&gt;
my $inter	= 300;&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5, default is 300&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine physische Schnittstelle geöffnet werden soll und dann bei verfügbaren Eingabedaten eine Lese-Funktion von Fhem aufgerufen werden soll, dann kann man in der Define-Funktion die Funktion DevIo_OpenDev aufrufen, die sich um alles weitere kümmert. Sie öffnet die Schnittstelle und fügt den Filedeskriptor an die globale Liste offener Verbindungen (selectlist / readyfnlist) an. Damit kann Fhem in seiner Hauptschleife erkennen, von welchem Gerät Daten bereit stehen und die zuständigen Funktionen aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $ret = DevIo_OpenDev( $hash, 0, &amp;quot;X_DevInit&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die optionale Funktion &amp;lt;code&amp;gt;X_DevInit&amp;lt;/code&amp;gt; wird zur weiteren Initialisierung der Verbindung von &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; aufgerufen. Der zweite Übergabeparameter an &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; (hier &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) steht für reopen und wird benötigt, da die Funktion auch aufgerufen wird, wenn ein USB-Geräte beispielsweise im Betrieb aus- und wieder eingesteckt wird. In diesem Fall wird die Funktion mit &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
=== X_Undef ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Undef&amp;lt;/code&amp;gt;-Funktion ist das Gegenstück zur &amp;lt;code&amp;gt;Define&amp;lt;/code&amp;gt;-Funktion und wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls rereadcfg, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu abarbeitet. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern sofern diese im Modul zum Pollen verwendet wurden (siehe später). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub WKRCD4_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $arg ) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Get ===&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der Fhem-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; mit einem Gerät dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. Einige Module verwenden für diese Funktion einen Hash im Modul, der die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen mit zusätzlichen Werten definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my X_gets = (&lt;br /&gt;
	&amp;quot;TempSoll&amp;quot;	=&amp;gt; &amp;quot;XY&amp;quot;,&lt;br /&gt;
	&amp;quot;Steilheit&amp;quot;	=&amp;gt; &amp;quot;Z&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der Get-Funktion selbst werden dann die übergebenen Parameter gegen diesen Hash geprüft.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Get($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;get X\&amp;quot; needs at least one argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	if(!$X_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %X_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Meldung mit &amp;lt;code&amp;gt;unknown ... choose one of ...&amp;lt;/code&amp;gt; ist dabei wichtig, da sie im GUI-Modul verwendet wird um die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen zu ermitteln und als Auswahl anzubieten. Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert abfragen und diesen als Return-Wert der Get-Funktion zurückgeben.&lt;br /&gt;
&lt;br /&gt;
=== X_Set ===&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur Get-Funktion. Sie ist dafür gedacht, Werte zum physischen Gerät zu schicken. Falls nur interne Werte im Modul gesetzt werden sollen, so sollte statt Set die Attr-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch nach dem Namen der Option auch den zu setzenden Wert übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;set X\&amp;quot; needs at least an argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @a);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		my @cList = keys %X_sets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI FHEM-Web kann für die einzelnen Set-Optionen, die das Modul versteht auch automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht des GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknwon ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of mode:verbose,ultra,relaxed turbo:NoArg&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Die möglichen Zusatzinformationen sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;noArg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es werden keine weiteren Argumente mehr benötigt&lt;br /&gt;
&amp;lt;pre&amp;gt;on:noArg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;slider&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es wird ein Schieberegler für den Wert angezeigt. Dabei Minimum, Schrittweite und Maximum angeben&lt;br /&gt;
&amp;lt;pre&amp;gt;dim:slider,0,1,100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RGB&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Bitte dazu auch den Wiki Artikel zum Colorpicker lesen, da im Modul noch weiterer Code eingefügt werden muss.&lt;br /&gt;
&amp;lt;pre&amp;gt;rgb:colorpicker,RGB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Liste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Leer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
&lt;br /&gt;
- bei den üblichen Kommandos wie on off sollte man auf noArg verzichten, da diese durch FHEMWeb automatisch in der Raumübersicht angezeigt werden. Wenn man hier noArg spezifiziert, so werden diese nicht neben dem Modul in der Raumübersicht angezeigt und der User muss sich diese vie webCmd dann erst selbst definieren, was natürlich unschön ist&lt;br /&gt;
&lt;br /&gt;
- der User kann sich in der Raumübersicht nach wie vor via webCmd eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
=== X_Attr ===&lt;br /&gt;
Die Attr-Funktion implementiert Prüfungen der bei einem &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; übergebenen Werte und eventuell zusätzliche Aktionen wenn ein Attribut gesetzt wird. Die Liste der möglichen Attribute wird in der &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]-Funktion&amp;lt;/code&amp;gt; definiert ([[#X_Initialize|siehe oben]]). Fhem ruft bei einem Attr-Befehl die zuständige &amp;lt;code&amp;gt;X-Attr-Funktion&amp;lt;/code&amp;gt; auf und wenn diese keine Fehlermeldung sondern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgibt, dann schreibt fhem.pl die bei &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; angegebenen Werte in die jeweilige Datenstruktur &amp;lt;code&amp;gt;$attr{$name}-&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X_Attr(@)&lt;br /&gt;
{&lt;br /&gt;
	my ($cmd,$name,$aName,$aVal) = @_;&lt;br /&gt;
  	# $cmd can be &amp;quot;del&amp;quot; or &amp;quot;set&amp;quot;&lt;br /&gt;
	# $name is device name&lt;br /&gt;
	# aName and aVal are Attribute name and value&lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aVal/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X: Invalid regex in attr $name $aName $aVal: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aVal&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie ja auch keine Werte dort speichern muss, sondern den Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt; je nachdem ob ein Attribut gesetzt oder gelöscht wird, den Namen der Geräteinstanz sowie den Namen des Attributs und seinen Wert.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen Regex geprüft ob die Regex fehlerhaft ist. Falls sie ok ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs.&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute mit Platzhaltern definiert (Wildcard-Attribute), z.B. mit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken, da Fhemweb nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muß solche Attribute über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; Befehl eintippen.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in Fhemweb durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Attr-Funktion wenn ein Attribut gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== X_Read ===&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion wird aus der Hauptschleife von FHEM aus aufgerufen wenn das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können. Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Seriell-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion &amp;lt;code&amp;gt;DevIo_SimpleRead&amp;lt;/code&amp;gt; gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten zwischenspeichern. Es bietet sich an, dies im Hash der Geräteinstanz zu tun. Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt; an den die jeweils gelesenen Daten angehängt werden bis die folgende Prüfung ein für das jeweilige Protokoll passendes Frame identifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# read from serial device&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
&lt;br /&gt;
	# convert to hex string to make parsing with regex easier&lt;br /&gt;
	$hash-&amp;gt;{buffer} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;Current buffer content: &amp;quot; . $hash-&amp;gt;{buffer};&lt;br /&gt;
&lt;br /&gt;
	# did we already get a full frame?&lt;br /&gt;
	if ($hash-&amp;gt;{buffer} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) &lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
=== X_Ready ===&lt;br /&gt;
&lt;br /&gt;
muss noch beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef )&lt;br /&gt;
	  if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for windows/USB only&lt;br /&gt;
	my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
	my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
	return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Notify ===&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion DoTrigger in fhem.pl heraus aufgerufen wenn ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind das Filelog-Modul oder das Average-Modul. Average reagiert auf Events anderer Module und erweitert diese mit der Berechnung von Tages- und Monats-Durchschnittswerten.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hashes übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Geräts, das die Events erzeugt hat, kann es die Events verarbeiten. Events werden je Gerät in einem Array, das über das Internal &amp;lt;code&amp;gt;CHANGED&amp;lt;/code&amp;gt; referenziert wird, gespeichert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(AttrVal($ownName, &amp;quot;disable&amp;quot;, undef)); # Abbruch wenn das Attribut disable gesetzt ist&lt;br /&gt;
&lt;br /&gt;
  my $max = int(@{$dev_hash-&amp;gt;{CHANGED}}); # number of events / changes&lt;br /&gt;
&lt;br /&gt;
  for (my $i = 0; $i &amp;lt; $max; $i++) {&lt;br /&gt;
    my $s = $dev-&amp;gt;{CHANGED}[$i];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes Gerät mit allen seinen Events aufgerufen wird, muss sie in einer Schleife alle Events prüfen und entscheiden, ob es mit dem jeweiligen Event etwas tun möchte. Ein Gerät, das die Notify-Funktion implementiert sieht dafür typischerweise einen regulären Ausdruck vor, der für die Filterung verwendet wird.&lt;br /&gt;
Als anschauliches Beispiel und für weitere Details eignet sich das Modul 98_Average.pm&lt;br /&gt;
&lt;br /&gt;
=== X_DbLog_splitFn ===&lt;br /&gt;
Mit der DbLog_SplitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&amp;lt;br&amp;gt;&lt;br /&gt;
Eingangsparameter: Das generierte Event&amp;lt;br&amp;gt;&lt;br /&gt;
Rückgabewerte: Array: Reading/Value/Unit&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($)&lt;br /&gt;
{&lt;br /&gt;
	my ($event) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion &amp;lt;code&amp;gt;InternalTimer&amp;lt;/code&amp;gt; verwenden. Man übergibt ihr den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, den zu übergebenden Parameter und ein Flag ob der erste Aufruf verzögert werden soll falls die Initialiserung des Geräts noch nicht abgeschlossen ist. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der Define-Funktion den Timer folgendermassen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# initial request after 2 secs, there timer is set to interval for further update&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash, 0);	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash, 1);&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Funktion könnte man dann das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene Read-Funktion zu implementieren, die beim Anstehen von Daten aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Protokollmeldung in die Fhem-Logdatei zu schreiben, wird die Funktion Log3 aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X: Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Parameter der Funktion Log3 sind der Name oder der Hash der Geräteinstanz, das Verbose-Level, in dem die Meldung sichtbar sein soll und die Meldung selbst.&lt;br /&gt;
Den Namen der Geräteinstanz kann man in den Funktionen, die den Hash übergeben bekommen einfach aus diesem Hash nehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für ein neues Modul das Verbose-Level zu erhöhen, ohne gleich für das Gesamte FHEM alle Meldungen zu erzeugen kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr gerätename verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr PM verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit bietet es sich an im Modul Meldungen, die im normalen Betrieb nicht benötigt werden, beim Aufruf von Log3 mit dem Level 4 oder 5 anzugeben. Wenn man dann bei der Fehlersuche mehr Meldungen sehen möchte, erhöht man mit attr X verbose das Level für das betroffene Gerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
siehe auch&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,18920.msg128100.html#msg128100|The FHEM two-level model]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13438.msg83643.html#msg83643|Zum Initialize bei physikalischen und logischen Geräten]&lt;br /&gt;
&lt;br /&gt;
Das zweistufige Modell besteht aus &lt;br /&gt;
* physisches Modul - z.B. für CUL (00_CUL.pm), der mehrer Protokolle empfängt, u.a. FS20&lt;br /&gt;
* logische Modul(e) - z.B. das Protokoll FS20 (10_FS20.pm)&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät. &lt;br /&gt;
&lt;br /&gt;
=== Kommunikation vom Gerät zu den logischen Modulen ===&lt;br /&gt;
Die [[#X_Read|X_Read]]-Funktion wird aus der Hauptschleife von Fhem aufgerufen sobald das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Unter Windows funktioniert &amp;quot;select&amp;quot; nur für Geräte, die via TCP verbunden sind. Für alle anderen Geräte ist eine [[#X_Ready|X_Ready]]-Funktion von Nöten, die 10x pro Sekunde das Gerät abfrägt und &amp;quot;true&amp;quot; zurück gibt, sollten Daten bereit stehen.&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion stellt sicher, dass die Daten&lt;br /&gt;
* komplett und&lt;br /&gt;
* korrekt&lt;br /&gt;
sind und sie ruft die globale Funktion Dispatch() mit einer Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Dispatch() sucht nach einem passenden lokalen Modul via &lt;br /&gt;
* $hash-&amp;gt;{Clients} oder $hash-&amp;gt;{MatchList} im physischen Modul&lt;br /&gt;
* $hash-&amp;gt;{Match} in allen passenden logischen Modulen&lt;br /&gt;
und ruft X_Parse in den gefundenen Modulen auf.&lt;br /&gt;
&lt;br /&gt;
X_Parse &lt;br /&gt;
* untersucht die übergebenen Daten (von Dispatch() übergeben)&lt;br /&gt;
* setzt alle [[#Readings|readings]] via readings*update Funktionen&lt;br /&gt;
* gibt den Namen des logischen Device zurück&lt;br /&gt;
&lt;br /&gt;
Es findet kein Event-Triggering statt, wenn die readings*update Funktionen &lt;br /&gt;
* von X_Parse aufgerufen werden und&lt;br /&gt;
* X_Parse wiederum von Dispatch() aufgerufen wurde.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Dispatch() triggert das Event-Handling für das  von X_Parse zurückgegebene logische Device.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen zum Gerät ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul an ein physisches Gerät zu senden, wird im logischen Modul das Attribut IODev mit dem namen des physischen Devices gesetzt.&lt;br /&gt;
Der Befehl&lt;br /&gt;
&amp;lt;code&amp;gt;AssignIoPort($hash);&amp;lt;/code&amp;gt;&lt;br /&gt;
in der X_Define-Funktion des logischen Devices erledigt das.&lt;br /&gt;
&lt;br /&gt;
Als Befehl zum Schreiben vom logischen ins physische Gerät soll &amp;lt;code&amp;gt;IOWrite()&amp;lt;/code&amp;gt; verwendet werden. IOWrite() ruft im physischen Gerät die X_Write-Funktion auf.&lt;br /&gt;
&lt;br /&gt;
Wenn es keine direkte Kommunikation zwischen dem logischen und dem physischen Gerät gibt(keine direkten Aufrufe von Funktionen, kein direktes überprüfen von $hash Werten,...) so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie in RFR) oder mittels  FHEM2FHEM:RAW zwei Fhem Installationen verbunden werden und die logischen Devices werden dennoch funktionieren.&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM Commandref [http://fhem.de/commandref.html] sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize($) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = &#039;Hello_Define&#039;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = &#039;Hello_Undef&#039;;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = &#039;Hello_Set&#039;;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = &#039;Hello_Get&#039;;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = &#039;Hello_Attr&#039;;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = &#039;Hello_Read&#039;;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define($$) {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    my $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    my $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef($$) {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr(@) {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a name=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://www.fhemwiki.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Hellodefine&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloset&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloget&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloattr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Noch zu beschreiben ==&lt;br /&gt;
* Zweistufiges Modell für Module&lt;br /&gt;
* Funktion X_Ready ...&lt;br /&gt;
* Funktion X_State_Fn: {{Link2Forum|Topic=32680}}, siehe auch [[DevelopmentState]]&lt;br /&gt;
* FW_summaryFn (wird von FHEMWEB aufgerufen fuer Raum-Uebersicht)&lt;br /&gt;
* FW_detailFn (wird von FHEMWEB aufgerufen fuer Detail-Ansicht)&lt;br /&gt;
* DevIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Stormmurdoc</name></author>
	</entry>
</feed>