2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-26 10:34:52 +00:00

fhem.pl: search cmds via lowercase/abbrev in modules (Forum #75007)

git-svn-id: https://svn.fhem.de/fhem/trunk@14854 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2017-08-06 11:59:03 +00:00
parent d1ec8f88b4
commit 924f8b07b4
4 changed files with 96 additions and 35 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- changed: fhem.pl: search cmds via lowercase/abbrev in modules (Forum #75007)
- changed: 14_CUL_TCM97001: Add rain/wind Sensor - changed: 14_CUL_TCM97001: Add rain/wind Sensor
- changed: 10_IT: Add FreeTec update documentation - changed: 10_IT: Add FreeTec update documentation
- changed: configDB: store files base64 encoded, Forum:#74302 - changed: configDB: store files base64 encoded, Forum:#74302

View File

@ -711,6 +711,7 @@ The following local attributes are used by a wider range of devices:
Cancels a named <a href="#sleep">sleep</a>. Cancels a named <a href="#sleep">sleep</a>.
</ul> </ul>
<!-- cancel end -->
<a name="define"></a> <a name="define"></a>
<h3>define</h3> <h3>define</h3>
@ -741,6 +742,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
</ul> </ul>
<!-- define end -->
<a name="defmod"></a> <a name="defmod"></a>
<h3>defmod</h3> <h3>defmod</h3>
@ -757,6 +759,7 @@ The following local attributes are used by a wider range of devices:
definition still exists. definition still exists.
<br> <br>
</ul> </ul>
<!-- defmod end -->
<a name="delete"></a> <a name="delete"></a>
@ -775,6 +778,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- delete end -->
<a name="deleteattr"></a> <a name="deleteattr"></a>
<h3>deleteattr</h3> <h3>deleteattr</h3>
@ -795,6 +799,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- deleteattr end -->
<a name="deletereading"></a> <a name="deletereading"></a>
<h3>deletereading</h3> <h3>deletereading</h3>
@ -815,6 +820,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- deletereading end -->
<a name="displayattr"></a> <a name="displayattr"></a>
<h3>displayattr</h3> <h3>displayattr</h3>
@ -841,6 +847,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- displayattr end -->
<a name="get"></a> <a name="get"></a>
<h3>get</h3> <h3>get</h3>
@ -860,6 +867,7 @@ The following local attributes are used by a wider range of devices:
<br> <br>
</ul> </ul>
<!-- get end -->
<a name="include"></a> <a name="include"></a>
@ -871,6 +879,7 @@ The following local attributes are used by a wider range of devices:
Note: only experts should use this command. Note: only experts should use this command.
<br> <br>
</ul> </ul>
<!-- include end -->
<a name="inform"></a> <a name="inform"></a>
<h3>inform</h3> <h3>inform</h3>
@ -886,6 +895,7 @@ The following local attributes are used by a wider range of devices:
<br> <br>
</ul> </ul>
<!-- inform end -->
<a name="list"></a> <a name="list"></a>
<h3>list</h3> <h3>list</h3>
@ -958,6 +968,7 @@ The following local attributes are used by a wider range of devices:
device itself, together with the definition of probably associated devices. device itself, together with the definition of probably associated devices.
Note: the algorithm to select associated devices is known to be imperfect. Note: the algorithm to select associated devices is known to be imperfect.
</ul> </ul>
<!-- list end -->
<a name="modify"></a> <a name="modify"></a>
<h3>modify</h3> <h3>modify</h3>
@ -979,6 +990,7 @@ The following local attributes are used by a wider range of devices:
<code>modify lampon 19:00 set lamp on-for-timer 16</code><br> <code>modify lampon 19:00 set lamp on-for-timer 16</code><br>
</ul> </ul>
</ul> </ul>
<!-- modify end -->
<a name="quit"></a> <a name="quit"></a>
<h3>quit</h3> <h3>quit</h3>
@ -993,6 +1005,7 @@ The following local attributes are used by a wider range of devices:
<code>quit</code> <code>quit</code>
</ul> </ul>
</ul> </ul>
<!-- quit end -->
<a name="reload"></a> <a name="reload"></a>
<h3>reload</h3> <h3>reload</h3>
@ -1007,6 +1020,7 @@ The following local attributes are used by a wider range of devices:
<code>reload 99_PRIV</code> <code>reload 99_PRIV</code>
</ul> </ul>
</ul> </ul>
<!-- reload end -->
<a name="rename"></a> <a name="rename"></a>
<h3>rename</h3> <h3>rename</h3>
@ -1022,6 +1036,7 @@ The following local attributes are used by a wider range of devices:
<code>rename FHT_1234 fht.kitchen</code> <code>rename FHT_1234 fht.kitchen</code>
</ul> </ul>
</ul> </ul>
<!-- rename end -->
<a name="rereadcfg"></a> <a name="rereadcfg"></a>
<h3>rereadcfg</h3> <h3>rereadcfg</h3>
@ -1042,6 +1057,7 @@ The following local attributes are used by a wider range of devices:
<code>rereadcfg</code> <code>rereadcfg</code>
</ul> </ul>
</ul> </ul>
<!-- rereadcfg end -->
<a name="save"></a> <a name="save"></a>
<h3>save</h3> <h3>save</h3>
@ -1065,6 +1081,7 @@ The following local attributes are used by a wider range of devices:
</ul> </ul>
</ul> </ul>
<!-- save end -->
<a name="set"></a> <a name="set"></a>
<h3>set</h3> <h3>set</h3>
@ -1166,6 +1183,7 @@ The following local attributes are used by a wider range of devices:
</code> </code>
</ul> </ul>
</ul> </ul>
<!-- set end -->
<a name="setdefaultattr"></a> <a name="setdefaultattr"></a>
<h3>setdefaultattr</h3> <h3>setdefaultattr</h3>
@ -1194,6 +1212,7 @@ The following local attributes are used by a wider range of devices:
<li>There is no way to delete a single default-attribute from the list</li> <li>There is no way to delete a single default-attribute from the list</li>
</ul> </ul>
</ul> </ul>
<!-- setdefaultattr end -->
<a name="setreading"></a> <a name="setreading"></a>
<h3>setreading</h3> <h3>setreading</h3>
@ -1212,6 +1231,7 @@ The following local attributes are used by a wider range of devices:
Note: setreading won't generate an event for device X, if it is called from a Note: setreading won't generate an event for device X, if it is called from a
notify for device X. Use "sleep 0.1; setreading X Y Z" in this case. notify for device X. Use "sleep 0.1; setreading X Y Z" in this case.
</ul> </ul>
<!-- setreading end -->
<a name="setstate"></a> <a name="setstate"></a>
<h3>setstate</h3> <h3>setstate</h3>
@ -1231,6 +1251,7 @@ The following local attributes are used by a wider range of devices:
setstate lamp on setstate lamp on
</ul> </ul>
</ul> </ul>
<!-- setstate end -->
<a name="shutdown"></a> <a name="shutdown"></a>
<h3>shutdown</h3> <h3>shutdown</h3>
@ -1249,6 +1270,7 @@ The following local attributes are used by a wider range of devices:
<code>shutdown 1</code><br> <code>shutdown 1</code><br>
</ul> </ul>
</ul> </ul>
<!-- shutdown end -->
<a name="sleep"></a> <a name="sleep"></a>
<h3>sleep</h3> <h3>sleep</h3>
@ -1278,6 +1300,7 @@ The following local attributes are used by a wider range of devices:
it issues a WARNING in the FHEM log. it issues a WARNING in the FHEM log.
<br> <br>
</ul> </ul>
<!-- sleep end -->
<a name="trigger"></a> <a name="trigger"></a>
<h3>trigger</h3> <h3>trigger</h3>
@ -1294,6 +1317,7 @@ The following local attributes are used by a wider range of devices:
<code>trigger btn3 on</code> <code>trigger btn3 on</code>
</ul> </ul>
</ul> </ul>
<!-- trigger end -->
<!-- commands end - diese Zeile nicht entfernen! --> <!-- commands end - diese Zeile nicht entfernen! -->

View File

@ -718,6 +718,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
zu l&ouml;schen.</li> zu l&ouml;schen.</li>
</ul> </ul>
</ul> </ul>
<!-- attr end -->
<a name="cancel"></a> <a name="cancel"></a>
<h3>cancel</h3> <h3>cancel</h3>
@ -727,6 +728,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
Entfernt ein benanntes <a href="#sleep">sleep</a>. Entfernt ein benanntes <a href="#sleep">sleep</a>.
</ul> </ul>
<!-- cancel end -->
<a name="define"></a> <a name="define"></a>
<h3>define</h3> <h3>define</h3>
@ -758,6 +760,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</li><br> </li><br>
</ul> </ul>
</ul> </ul>
<!-- define end -->
<a name="defmod"></a> <a name="defmod"></a>
<h3>defmod</h3> <h3>defmod</h3>
@ -775,6 +778,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
f&uuml;hren, da mdOff noch existiert. f&uuml;hren, da mdOff noch existiert.
<br> <br>
</ul> </ul>
<!-- defmod end -->
<a name="delete"></a> <a name="delete"></a>
@ -796,6 +800,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- delete end -->
<a name="deleteattr"></a> <a name="deleteattr"></a>
<h3>deleteattr</h3> <h3>deleteattr</h3>
@ -817,6 +822,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- deleteattr end -->
<a name="deletereading"></a> <a name="deletereading"></a>
<h3>deletereading</h3> <h3>deletereading</h3>
@ -841,6 +847,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- deletereading end -->
<a name="displayattr"></a> <a name="displayattr"></a>
<h3>displayattr</h3> <h3>displayattr</h3>
@ -869,6 +876,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
<br> <br>
</ul> </ul>
<!-- displayattr end -->
<a name="get"></a> <a name="get"></a>
<h3>get</h3> <h3>get</h3>
@ -886,6 +894,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br> <br>
</ul> </ul>
<!-- get end -->
<a name="getstate"></a> <a name="getstate"></a>
@ -909,6 +918,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br> <br>
</ul> </ul>
<!-- getstate end -->
<a name="include"></a> <a name="include"></a>
@ -921,6 +931,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
Befehl. Dieses Befehl sollte nur von Experten verwendet werden. Befehl. Dieses Befehl sollte nur von Experten verwendet werden.
<br> <br>
</ul> </ul>
<!-- include end -->
<a name="inform"></a> <a name="inform"></a>
<h3>inform</h3> <h3>inform</h3>
@ -937,6 +948,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br> <br>
</ul> </ul>
<!-- inform -->
<a name="list"></a> <a name="list"></a>
<h3>list</h3> <h3>list</h3>
@ -1009,6 +1021,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
alle von diesem Ger&auml;t vermutlich ben&ouml;gten Ger&auml;te. alle von diesem Ger&auml;t vermutlich ben&ouml;gten Ger&auml;te.
Achtung: die Bestimmung dieser Liste ist ungenau. Achtung: die Bestimmung dieser Liste ist ungenau.
</ul> </ul>
<!-- list end -->
<a name="modify"></a> <a name="modify"></a>
@ -1035,6 +1048,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>modify lampon 19:00 set lamp on-for-timer 16</code><br> <code>modify lampon 19:00 set lamp on-for-timer 16</code><br>
</ul> </ul>
</ul> </ul>
<!-- modify end -->
<a name="quit"></a> <a name="quit"></a>
<h3>quit</h3> <h3>quit</h3>
@ -1051,6 +1065,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>quit</code> <code>quit</code>
</ul> </ul>
</ul> </ul>
<!-- quit end -->
<a name="reload"></a> <a name="reload"></a>
@ -1066,6 +1081,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>reload 99_PRIV</code> <code>reload 99_PRIV</code>
</ul> </ul>
</ul> </ul>
<!-- reload end -->
<a name="rename"></a> <a name="rename"></a>
<h3>rename</h3> <h3>rename</h3>
@ -1082,6 +1098,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>rename FHT_1234 fht.kitchen</code> <code>rename FHT_1234 fht.kitchen</code>
</ul> </ul>
</ul> </ul>
<!-- rename end -->
<a name="rereadcfg"></a> <a name="rereadcfg"></a>
@ -1104,6 +1121,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>rereadcfg</code> <code>rereadcfg</code>
</ul> </ul>
</ul> </ul>
<!-- rereadcfg end -->
<a name="save"></a> <a name="save"></a>
<h3>save</h3> <h3>save</h3>
@ -1129,6 +1147,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
</ul> </ul>
<!-- save end -->
<a name="set"></a> <a name="set"></a>
@ -1240,6 +1259,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul> </ul>
</ul> </ul>
</ul> </ul>
<!-- set end -->
<a name="setdefaultattr"></a> <a name="setdefaultattr"></a>
<h3>setdefaultattr</h3> <h3>setdefaultattr</h3>
@ -1270,6 +1290,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
tu l&ouml;schen.</li> tu l&ouml;schen.</li>
</ul> </ul>
</ul> </ul>
<!-- setdefaultattr end -->
<a name="setreading"></a> <a name="setreading"></a>
@ -1294,6 +1315,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
aus einem notify f&uuml;r Ger&auml;t X aufgerufen wurde. In so einem Fall aus einem notify f&uuml;r Ger&auml;t X aufgerufen wurde. In so einem Fall
k&ouml;nnte man auf "sleep 0.1; setreading X Y Z" ausweichen. k&ouml;nnte man auf "sleep 0.1; setreading X Y Z" ausweichen.
</ul> </ul>
<!-- setreading end -->
<a name="setstate"></a> <a name="setstate"></a>
<h3>setstate</h3> <h3>setstate</h3>
@ -1311,6 +1333,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
setstate lampe An setstate lampe An
</ul> </ul>
</ul> </ul>
<!-- setstate end -->
<a name="shutdown"></a> <a name="shutdown"></a>
@ -1330,24 +1353,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>shutdown 1</code> <code>shutdown 1</code>
</ul> </ul>
</ul> </ul>
<!-- shutdown end -->
<a name="trigger"></a>
<h3>trigger</h3>
<ul>
<code>trigger &lt;devspec&gt; &lt;event&gt;</code>
<br><br>
Generiert das Ereignis &lt;event&gt;, was z.Bsp. ein <a
href="#notify">notify</a> ansto&szlig;en kann, oder den FileLog zum
protokollieren dieser Zeile bewegen kann.<br>
Siehe den Abschnitt &uuml;ber <a href="#devspec">Ger&auml;te-Spezifikation</a>
f&uuml;r Details der &lt;devspec&gt;.<br>
<br>
Beispiel:
<ul>
<code>trigger btn3 on</code>
</ul>
</ul>
<a name="sleep"></a> <a name="sleep"></a>
<h3>sleep</h3> <h3>sleep</h3>
@ -1381,6 +1387,26 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
blockiert. Das ist unerw&uuml;nscht, und im FHEM-Log wird eine Warnung blockiert. Das ist unerw&uuml;nscht, und im FHEM-Log wird eine Warnung
protokolliert. protokolliert.
</ul> </ul>
<!-- sleep end -->
<a name="trigger"></a>
<h3>trigger</h3>
<ul>
<code>trigger &lt;devspec&gt; &lt;event&gt;</code>
<br><br>
Generiert das Ereignis &lt;event&gt;, was z.Bsp. ein <a
href="#notify">notify</a> ansto&szlig;en kann, oder den FileLog zum
protokollieren dieser Zeile bewegen kann.<br>
Siehe den Abschnitt &uuml;ber <a href="#devspec">Ger&auml;te-Spezifikation</a>
f&uuml;r Details der &lt;devspec&gt;.<br>
<br>
Beispiel:
<ul>
<code>trigger btn3 on</code>
</ul>
</ul>
<!-- trigger end -->
<!-- commands end - diese Zeile nicht entfernen! --> <!-- commands end - diese Zeile nicht entfernen! -->

View File

@ -1120,36 +1120,46 @@ AnalyzeCommand($$;$)
my ($fn, $param) = split("[ \t][ \t]*", $cmd, 2); my ($fn, $param) = split("[ \t][ \t]*", $cmd, 2);
return undef if(!$fn); return undef if(!$fn);
############# #############
# Search for abbreviation # Search for abbreviation
if(!defined($cmds{$fn})) { sub
foreach my $f (sort keys %cmds) { getAbbr($$)
if(length($f) > length($fn) && lc(substr($f,0,length($fn))) eq lc($fn)) { {
Log 5, "$fn => $f"; my ($fn,$h) = @_;
$fn = $f; my $lcfn = lc($fn);
last; my $fnlen = length($fn);
return $fn if(defined($h->{$fn}));
foreach my $f (sort keys %{$h}) {
if(length($f) >= $fnlen && lc(substr($f,0,$fnlen)) eq $lcfn) {
Log 5, "AnalyzeCommand: trying $f for $fn";
return $f;
} }
} }
return undef;
} }
my $lfn = getAbbr($fn,\%cmds);
$fn = $lfn if($lfn);
$fn = $cmds{$fn}{ReplacedBy} $fn = $cmds{$fn}{ReplacedBy}
if(defined($cmds{$fn}) && defined($cmds{$fn}{ReplacedBy})); if(defined($cmds{$fn}) && defined($cmds{$fn}{ReplacedBy}));
return "Forbidden command $fn." if($cl && !Authorized($cl,"cmd",$fn));
############# #############
# autoload commands. # autoload command with ModuleName
my $lcfn = lc($fn); if(!$cmds{$fn} || !defined($cmds{$fn}{Fn})) {
$fn = $lcfn if(defined($cmds{$lcfn}));
if(!defined($cmds{$fn}) || !defined($cmds{$fn}{Fn})) {
my $modName; my $modName;
map { $modName = $_ if($lcfn eq lc($_)); } keys %modules; $modName = $cmds{$fn}{ModuleName} if($cmds{$fn} && $cmds{$fn}{ModuleName});
$modName = $cmds{$lcfn}{ModuleName} $modName = getAbbr($fn,\%modules) if(!$modName);
if($cmds{$lcfn} && $cmds{$lcfn}{ModuleName});
LoadModule($modName) if($modName); LoadModule($modName) if($modName);
$fn = $lcfn if($cmds{$lcfn}); my $lfn = getAbbr($fn,\%cmds);
return "Unknown command $fn, try help." if(!$cmds{$fn} || !$cmds{$fn}{Fn}); $fn = $lfn if($lfn);
} }
return "Unknown command $fn, try help." if(!$cmds{$fn} || !$cmds{$fn}{Fn});
return "Forbidden command $fn." if($cl && !Authorized($cl,"cmd",$fn));
if($cl && $cmds{$fn}{ClientFilter} && if($cl && $cmds{$fn}{ClientFilter} &&
$cl->{TYPE} !~ m/$cmds{$fn}{ClientFilter}/) { $cl->{TYPE} !~ m/$cmds{$fn}{ClientFilter}/) {
return "This command ($fn) is not valid for this input channel."; return "This command ($fn) is not valid for this input channel.";