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.
# 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: 10_IT: Add FreeTec update documentation
- 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>.
</ul>
<!-- cancel end -->
<a name="define"></a>
<h3>define</h3>
@ -741,6 +742,7 @@ The following local attributes are used by a wider range of devices:
</ul>
</ul>
<!-- define end -->
<a name="defmod"></a>
<h3>defmod</h3>
@ -757,6 +759,7 @@ The following local attributes are used by a wider range of devices:
definition still exists.
<br>
</ul>
<!-- defmod end -->
<a name="delete"></a>
@ -775,6 +778,7 @@ The following local attributes are used by a wider range of devices:
</ul>
<br>
</ul>
<!-- delete end -->
<a name="deleteattr"></a>
<h3>deleteattr</h3>
@ -795,6 +799,7 @@ The following local attributes are used by a wider range of devices:
</ul>
<br>
</ul>
<!-- deleteattr end -->
<a name="deletereading"></a>
<h3>deletereading</h3>
@ -815,6 +820,7 @@ The following local attributes are used by a wider range of devices:
</ul>
<br>
</ul>
<!-- deletereading end -->
<a name="displayattr"></a>
<h3>displayattr</h3>
@ -841,6 +847,7 @@ The following local attributes are used by a wider range of devices:
</ul>
<br>
</ul>
<!-- displayattr end -->
<a name="get"></a>
<h3>get</h3>
@ -860,6 +867,7 @@ The following local attributes are used by a wider range of devices:
<br>
</ul>
<!-- get end -->
<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.
<br>
</ul>
<!-- include end -->
<a name="inform"></a>
<h3>inform</h3>
@ -886,6 +895,7 @@ The following local attributes are used by a wider range of devices:
<br>
</ul>
<!-- inform end -->
<a name="list"></a>
<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.
Note: the algorithm to select associated devices is known to be imperfect.
</ul>
<!-- list end -->
<a name="modify"></a>
<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>
</ul>
</ul>
<!-- modify end -->
<a name="quit"></a>
<h3>quit</h3>
@ -993,6 +1005,7 @@ The following local attributes are used by a wider range of devices:
<code>quit</code>
</ul>
</ul>
<!-- quit end -->
<a name="reload"></a>
<h3>reload</h3>
@ -1007,6 +1020,7 @@ The following local attributes are used by a wider range of devices:
<code>reload 99_PRIV</code>
</ul>
</ul>
<!-- reload end -->
<a name="rename"></a>
<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>
</ul>
</ul>
<!-- rename end -->
<a name="rereadcfg"></a>
<h3>rereadcfg</h3>
@ -1042,6 +1057,7 @@ The following local attributes are used by a wider range of devices:
<code>rereadcfg</code>
</ul>
</ul>
<!-- rereadcfg end -->
<a name="save"></a>
<h3>save</h3>
@ -1065,6 +1081,7 @@ The following local attributes are used by a wider range of devices:
</ul>
</ul>
<!-- save end -->
<a name="set"></a>
<h3>set</h3>
@ -1166,6 +1183,7 @@ The following local attributes are used by a wider range of devices:
</code>
</ul>
</ul>
<!-- set end -->
<a name="setdefaultattr"></a>
<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>
</ul>
</ul>
<!-- setdefaultattr end -->
<a name="setreading"></a>
<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
notify for device X. Use "sleep 0.1; setreading X Y Z" in this case.
</ul>
<!-- setreading end -->
<a name="setstate"></a>
<h3>setstate</h3>
@ -1231,6 +1251,7 @@ The following local attributes are used by a wider range of devices:
setstate lamp on
</ul>
</ul>
<!-- setstate end -->
<a name="shutdown"></a>
<h3>shutdown</h3>
@ -1249,6 +1270,7 @@ The following local attributes are used by a wider range of devices:
<code>shutdown 1</code><br>
</ul>
</ul>
<!-- shutdown end -->
<a name="sleep"></a>
<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.
<br>
</ul>
<!-- sleep end -->
<a name="trigger"></a>
<h3>trigger</h3>
@ -1294,6 +1317,7 @@ The following local attributes are used by a wider range of devices:
<code>trigger btn3 on</code>
</ul>
</ul>
<!-- trigger end -->
<!-- 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>
</ul>
</ul>
<!-- attr end -->
<a name="cancel"></a>
<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>.
</ul>
<!-- cancel end -->
<a name="define"></a>
<h3>define</h3>
@ -758,6 +760,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</li><br>
</ul>
</ul>
<!-- define end -->
<a name="defmod"></a>
<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.
<br>
</ul>
<!-- defmod end -->
<a name="delete"></a>
@ -796,6 +800,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
<br>
</ul>
<!-- delete end -->
<a name="deleteattr"></a>
<h3>deleteattr</h3>
@ -817,6 +822,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
<br>
</ul>
<!-- deleteattr end -->
<a name="deletereading"></a>
<h3>deletereading</h3>
@ -841,6 +847,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
<br>
</ul>
<!-- deletereading end -->
<a name="displayattr"></a>
<h3>displayattr</h3>
@ -869,6 +876,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
<br>
</ul>
<!-- displayattr end -->
<a name="get"></a>
<h3>get</h3>
@ -886,6 +894,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br>
</ul>
<!-- get end -->
<a name="getstate"></a>
@ -909,6 +918,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br>
</ul>
<!-- getstate end -->
<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.
<br>
</ul>
<!-- include end -->
<a name="inform"></a>
<h3>inform</h3>
@ -937,6 +948,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<br>
</ul>
<!-- inform -->
<a name="list"></a>
<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.
Achtung: die Bestimmung dieser Liste ist ungenau.
</ul>
<!-- list end -->
<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>
</ul>
</ul>
<!-- modify end -->
<a name="quit"></a>
<h3>quit</h3>
@ -1051,6 +1065,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>quit</code>
</ul>
</ul>
<!-- quit end -->
<a name="reload"></a>
@ -1066,6 +1081,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>reload 99_PRIV</code>
</ul>
</ul>
<!-- reload end -->
<a name="rename"></a>
<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>
</ul>
</ul>
<!-- rename end -->
<a name="rereadcfg"></a>
@ -1104,6 +1121,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>rereadcfg</code>
</ul>
</ul>
<!-- rereadcfg end -->
<a name="save"></a>
<h3>save</h3>
@ -1129,6 +1147,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
</ul>
<!-- save end -->
<a name="set"></a>
@ -1240,6 +1259,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
</ul>
</ul>
</ul>
<!-- set end -->
<a name="setdefaultattr"></a>
<h3>setdefaultattr</h3>
@ -1270,6 +1290,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
tu l&ouml;schen.</li>
</ul>
</ul>
<!-- setdefaultattr end -->
<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
k&ouml;nnte man auf "sleep 0.1; setreading X Y Z" ausweichen.
</ul>
<!-- setreading end -->
<a name="setstate"></a>
<h3>setstate</h3>
@ -1311,6 +1333,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
setstate lampe An
</ul>
</ul>
<!-- setstate end -->
<a name="shutdown"></a>
@ -1330,24 +1353,7 @@ Die folgenden lokalen Attribute werden von mehreren Ger&auml;ten verwendet:
<code>shutdown 1</code>
</ul>
</ul>
<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>
<!-- shutdown end -->
<a name="sleep"></a>
<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
protokolliert.
</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! -->

View File

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