############################################## # $Id$ # Avarage computing package main; use strict; use warnings; my %cmdalias; ########################## sub cmdalias_Initialize($) { my ($hash) = @_; $hash->{DefFn} = "cmdalias_Define"; $hash->{UndefFn} = "cmdalias_Undefine"; $hash->{AttrList} = "disable:0,1 disabledForIntervals"; } ########################## sub cmdalias_Define($$$) { my ($hash, $def) = @_; if($def !~ m/^([^ ]*) cmdalias ([^ ]*)(.*) AS (.*)$/s) { my $msg = "wrong syntax: define cmdalias [parameter] AS command..."; return $msg; } my ($name, $alias, $param, $newcmd) = ($1, $2, $3, $4); $param =~ s/^ *//; # Checking for misleading regexps return "Bad regexp: starting with *" if($param =~ m/^\*/); eval { qr/^$param$/ }; return "$name: Bad regexp in $param: $@" if($@); $alias = lc($alias); $hash->{ALIAS} = $alias; $hash->{PARAM} = $param; $hash->{NEWCMD} = $newcmd; $hash->{STATE} = "defined"; $cmdalias{$alias}{Alias}{$name} = $hash; $cmdalias{$alias}{OrigFn} = $cmds{$alias}{Fn} if($cmds{$alias} && $cmds{$alias}{Fn} && $cmds{$alias}{Fn} ne "CommandCmdAlias"); $cmds{$alias}{Fn} = "CommandCmdAlias"; return undef; } sub cmdalias_Undefine($$) { my ($hash, $arg) = @_; my $alias = $hash->{ALIAS}; delete $cmdalias{$alias}{Alias}{$hash->{NAME}}; if(! keys %{$cmdalias{$alias}{Alias}}) { if($cmdalias{$alias}{OrigFn}) { $cmds{$alias}{Fn} = $cmdalias{$alias}{OrigFn}; } else { delete($cmds{$alias}); } delete($cmdalias{$alias}); } return undef; } sub CommandCmdAlias($$$) { my ($cl, $param, $alias) = @_; my $a = $cmdalias{lc($alias)}; return "Unknown command $a, internal error" if(!$a); foreach my $n (sort keys %{$a->{Alias}}) { my $h = $a->{Alias}{$n}; my $doesMatch = $param =~ m/^$h->{PARAM}$/s; # Match multiline, #77285 if($h->{InExec} && $doesMatch) { Log3 $n, 3, "cmdalias $n called recursively, skipping execution"; next; } if($doesMatch && !IsDisabled($h->{NAME})) { my %specials= ("%EVENT" => $param); my $exec = EvalSpecials($h->{NEWCMD}, %specials); $h->{InExec} = 1; my $r = AnalyzeCommandChain($cl, $exec); delete $h->{InExec}; return $r; } } return undef if(!$a->{OrigFn}); no strict "refs"; return &{$a->{OrigFn} }($cl, $param, $alias); use strict "refs"; } 1; =pod =item command =item summary create new FHEM commands or replace internal ones =item summary_DE neue FHEM Befehle definieren oder existierende ändern =begin html

cmdalias

=end html =cut