diff --git a/fhem/docs/commandref_frame.html b/fhem/docs/commandref_frame.html
index 97eb60e3a..26f29d338 100644
--- a/fhem/docs/commandref_frame.html
+++ b/fhem/docs/commandref_frame.html
@@ -794,6 +794,9 @@ The following local attributes are used by a wider range of devices:
be loaded. Used by fhem.cfg.demo, as using the RSS example requires the
installation of several uncommon perl modules.
+
-silent
+ Do no enter the command in the "save ?" list.
+
@@ -802,8 +805,8 @@ The following local attributes are used by a wider range of devices:
defmod
- defmod [-temporary] <name> <type> <type-specific>
-
+ defmod [option] <name> <type> <type-specific>
+
Define a device or modify it, if it already exists. E.g. to switch off a lamp
10 Minutes after the last message from the motion detector, you may use
@@ -811,7 +814,8 @@ The following local attributes are used by a wider range of devices:
Using define here for the mdOff will generate an error if the motion detector
triggers within the 10 minutes after the first event, as the mdOff at
- definition still exists.
+ definition still exists.
+ For the options see the define documentation.
@@ -1046,7 +1050,7 @@ The following local attributes are used by a wider range of devices:
modify
@@ -820,8 +823,8 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
defmod
- defmod [-temporary] <name> <type> <type-specific>
-
+ defmod [option] <name> <type> <type-specific>
+
Definiert ein Gerät, oder ändert es, falls es exisitiert. Um
z.Bsp. eine Lampe 10 Minuten nach der letzten Meldung eines Bewegungsmelders
abzuschalten, könnte man folgendes definieren:
@@ -830,7 +833,8 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
Falls man statt defmod ein define verwenden würde, dann würde eine
Meldung innerhalb von 10 Minuten nach der letzten Meldung zu einem Fehler
- führen, da mdOff noch existiert.
+ führen, da mdOff noch existiert.
+ Für die Optionen siehe die define Dokumentation.
@@ -1101,7 +1105,7 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
modify
- modify <name> <type-dependent-options>
+ modify [-silent] <name> <type-dependent-options>
Dieser Befehl wird benutzt, um Definitionen zu verändern. Er ist
@@ -1110,9 +1114,11 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
verändern, dann wird nur der für die Zeit zuständige Teil
geändert. Im Falle der Veränderung einer Definition vom Typ
"notify" wird nur der regex Teil geändert. Alle anderen
- Werte (Stati, Attribute, etc) bleiben erhalten.
- After modify, the global event "MODIFIED" will be generated.
- Nach der Durchführung das globale Ereignis "MODIFIED" wird generiert.
+ Werte (Stati, Attribute, etc) bleiben erhalten.
+ Nach modify wird das global MODIFIED Event erzeugt.
+ Nach der Durchführung das globale Ereignis "MODIFIED" wird generiert.
+ Mit der silent Option wird der modify Befehl nicht in die "save -?" Liste
+ eingetragen.
Beispiel:
diff --git a/fhem/fhem.pl b/fhem/fhem.pl
index 735a9fef2..6cb9131e5 100755
--- a/fhem/fhem.pl
+++ b/fhem/fhem.pl
@@ -2054,27 +2054,35 @@ LoadModule($;$)
#####################################
+sub
+cmd_parseOpts($$$)
+{
+ my ($def, $optRegexp, $res) = @_;
+ while($def) {
+ last if($def !~ m/^\s*($optRegexp)\s+/);
+ my $o = $1;
+ $def =~ s/^\s*$o\s+//;
+ $o =~ s/^-//;
+ $res->{$o} = 1;
+ }
+ return $def;
+}
+
sub
CommandDefine($$)
{
my ($cl, $def) = @_;
- my @a = split("[ \t]+", $def, 3);
- my ($ignoreErr, $temporary);
- # used by RSS in fhem.cfg.demo, with no GD installed
- if($a[0] && $a[0] eq "-ignoreErr") {
- $def =~ s/\s*-ignoreErr\s*//;
- @a = split("[ \t][ \t]*", $def, 3);
- $ignoreErr = 1;
- }
- if($a[0] && $a[0] eq "-temporary") { # Forum #39610, 46640
- $def =~ s/\s*-temporary\s*//;
- @a = split("[ \t][ \t]*", $def, 3);
- $temporary = 1;
- }
+ # ignoreErr ist used by RSS in fhem.cfg.demo, with no GD installed
+ # temporary #39610 #46640
+ # silent #57691
+ my %opt;
+ my $optRegexp = '-ignoreErr|-temporary|-silent';
+ $def = cmd_parseOpts($def, $optRegexp, \%opt);
+ my @a = split("[ \t]+", $def, 3);
my $name = $a[0];
- return "Usage: define "
+ return "Usage: define [$optRegexp] "
if(int(@a) < 2);
return "$name already defined, delete it first" if(defined($defs{$name}));
return "Invalid characters in name (not A-Za-z0-9._): $name"
@@ -2090,7 +2098,7 @@ CommandDefine($$)
}
}
- my $newm = LoadModule($m, $ignoreErr);
+ my $newm = LoadModule($m, $opt{ignoreErr});
return "Cannot load module $m" if($newm eq "UNDEFINED");
$m = $newm;
@@ -2108,7 +2116,7 @@ CommandDefine($$)
if($currcfgfile ne AttrVal("global", "configfile", "") &&
!configDBUsed());
$hash{CL} = $cl;
- $hash{TEMPORARY} = 1 if($temporary);
+ $hash{TEMPORARY} = 1 if($opt{temporary});
# If the device wants to issue initialization gets/sets, then it needs to be
# in the global hash.
@@ -2117,7 +2125,7 @@ CommandDefine($$)
my $ret = CallFn($name, "DefFn", \%hash,
$modules{$m}->{parseParams} ? parseParams($def) : $def);
if($ret) {
- Log 1, "define $def: $ret" if(!$ignoreErr);
+ Log 1, "define $def: $ret" if(!$opt{ignoreErr});
delete $defs{$name}; # Veto
delete $attr{$name};
@@ -2131,12 +2139,12 @@ CommandDefine($$)
$modules{$m}{NotifyOrderPrefix} : "50-") . $name;
}
%ntfyHash = ();
- if(!$temporary && $init_done) {
- addStructChange("define", $name, $def);
+ if(!$opt{temporary} && $init_done) {
+ addStructChange("define", $name, $def) if(!$opt{silent});
DoTrigger("global", "DEFINED $name", 1);
}
}
- return ($ret && $ignoreErr ?
+ return ($ret && $opt{ignoreErr} ?
"Cannot define $name, remove -ignoreErr for details" : $ret);
}
@@ -2145,6 +2153,9 @@ sub
CommandModify($$)
{
my ($cl, $def) = @_;
+
+ my %opt;
+ $def = cmd_parseOpts($def, '-silent', \%opt);
my @a = split("[ \t]+", $def, 2);
return "Usage: modify "
@@ -2166,7 +2177,7 @@ CommandModify($$)
if($ret) {
$hash->{DEF} = $hash->{OLDDEF};
} else {
- addStructChange("modify", $a[0], $def);
+ addStructChange("modify", $a[0], $def) if(!$opt{silent});
DoTrigger("global", "MODIFIED $a[0]", 1) if($init_done);
}
@@ -2179,19 +2190,21 @@ sub
CommandDefMod($$)
{
my ($cl, $def) = @_;
+ my %opt;
+ my $optRegexp = '-ignoreErr|-temporary|-silent';
+ $def = cmd_parseOpts($def, $optRegexp, \%opt);
my @a = split("[ \t]+", $def, 3);
- return "Usage: defmod "
+
+ return "Usage: defmod [$optRegexp] "
if(int(@a) < 2);
- if($a[0] eq "-temporary" && $defs{$a[1]}) {
- @a = split("[ \t]+", $def, 4);
- shift @a;
- }
if($defs{$a[0]}) {
$def = $a[2] ? "$a[0] $a[2]" : $a[0];
return "defmod $a[0]: Cannot change the TYPE of an existing definition"
if($a[1] ne $defs{$a[0]}{TYPE});
+ $def = "-".join(" -", keys %opt)." ".$def if(%opt);
return CommandModify($cl, $def);
} else {
+ $def = "-".join(" -", keys %opt)." ".$def if(%opt);
return CommandDefine($cl, $def);
}
}