mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 06:39:11 +00:00
fhem.pl: add featurelevel + set magic (Forum #38276)
git-svn-id: https://svn.fhem.de/fhem/trunk@8800 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
596c804001
commit
3350f1a9b9
@ -299,7 +299,8 @@ notify_fhemwebFn($$$$)
|
||||
</ul></li>
|
||||
|
||||
<li>Note: the following is deprecated and will be removed in a future
|
||||
release. The described replacement is attempted if none of the above
|
||||
release. It is only active for featurelevel up to 5.6.
|
||||
The described replacement is attempted if none of the above
|
||||
variables ($NAME/$EVENT/etc) found in the command.
|
||||
<ul>
|
||||
<li>The character <code>%</code> will be replaced with the received
|
||||
@ -308,17 +309,16 @@ notify_fhemwebFn($$$$)
|
||||
the <code>%</code> into double quotes, else the shell may get a syntax
|
||||
error.</li>
|
||||
|
||||
<li>The character <code>@</code> will be replaced with the device
|
||||
<li>The character @ will be replaced with the device
|
||||
name.</li>
|
||||
|
||||
<li>To use % or @ in the text itself, use the double mode (%% or
|
||||
@@).</li>
|
||||
|
||||
<li>Instead of <code>%</code> and <code>@</code>, the parameters
|
||||
<code>%EVENT</code> (same as <code>%</code>), <code>%NAME</code> (same
|
||||
as <code>@</code>) and <code>%TYPE</code> (contains the device type,
|
||||
e.g. <code>FHT</code>) can be used. The space separated event "parts"
|
||||
are available as %EVTPART0, %EVTPART1, etc. A single <code>%</code>
|
||||
<li>Instead of % and @, the parameters %EVENT (same as %), %NAME (same
|
||||
as @) and %TYPE (contains the device type,
|
||||
e.g. FHT) can be used. The space separated event "parts"
|
||||
are available as %EVTPART0, %EVTPART1, etc. A single %
|
||||
looses its special meaning if any of these parameters appears in the
|
||||
definition.</li>
|
||||
</ul></li>
|
||||
@ -481,32 +481,33 @@ notify_fhemwebFn($$$$)
|
||||
Gerätes, z.B. <code>myFht</code></li>
|
||||
</ul></li>
|
||||
|
||||
<li>Achtung: Folgende Vorgehensweise ist abgekündigt und wird in
|
||||
einem zukünftigen Release von FHEM nicht mehr unterstützt.
|
||||
Wenn keine der oben genannten Variablen ($NAME/$EVENT/usw.) in der
|
||||
Anweisung gefunden wird, werden Platzhalter ersetzt.
|
||||
<li>Achtung: Folgende Vorgehensweise ist abgekündigt, funktioniert
|
||||
bis featurelevel 5.6 und wird in einem zukünftigen Release von
|
||||
FHEM nicht mehr unterstützt. Wenn keine der oben genannten
|
||||
Variablen ($NAME/$EVENT/usw.) in der Anweisung gefunden wird, werden
|
||||
Platzhalter ersetzt.
|
||||
|
||||
<ul>
|
||||
<li>Das Zeichen <code>%</code> wird ersetzt mit dem empfangenen
|
||||
Ereignis (Event), z.B. mit <code>on</code> oder <code>off</code> oder
|
||||
<li>Das Zeichen % wird ersetzt mit dem empfangenen
|
||||
Ereignis (Event), z.B. mit on oder off oder
|
||||
<code>measured-temp: 21.7 (Celsius)</code>.
|
||||
</li>
|
||||
|
||||
<li>Das Zeichen <code>@</code> wird ersetzt durch den
|
||||
<li>Das Zeichen @ wird ersetzt durch den
|
||||
Gerätenamen.</li>
|
||||
|
||||
<li>Um % oder @ im Text selbst benutzen zu können, müssen
|
||||
sie verdoppelt werden (%% oder @@).</li>
|
||||
|
||||
<li>Anstelle von <code>%</code> und <code>@</code>, können die
|
||||
Parameter <code>%EVENT</code> (funktionsgleich mit <code>%</code>),
|
||||
<code>%NAME</code> (funktionsgleich mit <code>@</code>) und
|
||||
<code>%TYPE</code> (enthält den Typ des Gerätes, z.B.
|
||||
<code>FHT</code>) benutzt werden. Die von Leerzeichen unterbrochenen
|
||||
<li>Anstelle von % und @, können die
|
||||
Parameter %EVENT (funktionsgleich mit %),
|
||||
%NAME (funktionsgleich mit @) und
|
||||
%TYPE (enthält den Typ des Gerätes, z.B.
|
||||
FHT) benutzt werden. Die von Leerzeichen unterbrochenen
|
||||
Teile eines Ereignisses (Event) sind verfügbar als %EVTPART0,
|
||||
%EVTPART1, usw. Ein einzeln stehendes <code>%</code> verliert seine
|
||||
%oben beschriebene Bedeutung, falls auch nur einer dieser Parameter
|
||||
%in der Definition auftaucht.</li>
|
||||
%EVTPART1, usw. Ein einzeln stehendes % verliert seine
|
||||
oben beschriebene Bedeutung, falls auch nur einer dieser Parameter
|
||||
in der Definition auftaucht.</li>
|
||||
|
||||
</ul></li>
|
||||
|
||||
|
@ -1092,8 +1092,16 @@ The following local attributes are used by a wider range of devices:
|
||||
<br>
|
||||
Each device has different set parameters, see the corresponding device
|
||||
section for details.<br>
|
||||
<br>
|
||||
<br>
|
||||
<br><br>
|
||||
From featurelevel 5.7 on the set command replaces:
|
||||
<ul>
|
||||
<li>[device:reading] with the corresponding reading of device, if both device
|
||||
and reading exists.</li>
|
||||
<li>{perlExpression} with the result of perlExpression, if the expression
|
||||
does not generates an error.</li>
|
||||
</ul>
|
||||
<br><br>
|
||||
|
||||
<a name="setExtensions"></a>
|
||||
Some modules support a common list of <b>set extensions</b>, and point in
|
||||
their documentation to this section. If the module itself implements one of
|
||||
@ -1335,15 +1343,24 @@ The following local attributes are used by a wider range of devices:
|
||||
</ul>
|
||||
</li><br>
|
||||
|
||||
<a name="featurelevel"></a>
|
||||
<li>featurelevel<br>
|
||||
Enable/disable old or new features, based on FHEM version.
|
||||
E.g. the $value hash for notify is only set for featurelevel up to 5.6,
|
||||
as it is deprecated, use the Value() function instead.
|
||||
</li><br>
|
||||
|
||||
<a name="lastinclude"></a>
|
||||
<li>lastinclude<br>
|
||||
If this attribute is set, then the last command of the generated
|
||||
configfile (see the <a href="#save">save</a> command) will be<br>
|
||||
include <lastinclude-value><br>
|
||||
This attribute is DEPRECATED, use <a href="#notify">notify</a>, with
|
||||
the INITIALIZED event to execute commands after initialization.
|
||||
This attribute is DEPRECATED and valid for featurelevel up to 5.6, use
|
||||
<a href="#notify">notify</a>, with the INITIALIZED event to execute
|
||||
commands after initialization.
|
||||
</li><br>
|
||||
|
||||
|
||||
<a name="logfile"></a>
|
||||
<li>logfile<br>
|
||||
Specify the logfile to write. You can use "-" for
|
||||
|
@ -1153,9 +1153,16 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
|
||||
Jedes Gerät hat verschiedene Parameter die mit "set" gesetzt
|
||||
werden können. Lesen Sie bitte den entsprechenden Abschnitt für
|
||||
das Gerät für Details durch.
|
||||
<br>
|
||||
<br><br>
|
||||
Ab featurelevel 5.7 ersetzt das set Befehl
|
||||
<ul>
|
||||
<li>[device:reading] mit dem Wert des Readings für device, falls sowohl
|
||||
device, als auch Reading existiert, und nicht leer ist.</li>
|
||||
<li>{perlExpression} mit dem Ergebnis der perlExpression, falls der Ausdruck
|
||||
keinen Fehler generiert.</li>
|
||||
</ul>
|
||||
<br><br>
|
||||
|
||||
<br>
|
||||
<a name="setExtensions"></a>
|
||||
Manche Module unterstützen die sog. <b>set extensions</b>, und in der
|
||||
entsprechenden Dokumentation ist ein Link auf diesem Text zu finden. Falls im
|
||||
@ -1411,22 +1418,33 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
|
||||
|
||||
<a name="holiday2we"></a>
|
||||
<li>holiday2we<br>
|
||||
Wenn dieses Attribut gesetzt wurde, dann wird die <a href="#perl">$we</a>
|
||||
Variable
|
||||
als "true" betrachtet, wenn der Wert der <a href="#holiday">holiday</a>
|
||||
Variable zu diesem Attribut nicht "none" ist.<br>
|
||||
Wenn dieses Attribut gesetzt wurde, dann wird die <a
|
||||
href="#perl">$we</a> Variable als "true" betrachtet, wenn der
|
||||
Wert der <a href="#holiday">holiday</a> Variable zu diesem Attribut
|
||||
nicht "none" ist.<br>
|
||||
Beispiel:<br>
|
||||
<ul>
|
||||
attr global holiday2we hessen
|
||||
</ul>
|
||||
</li><br>
|
||||
|
||||
<a name="featurelevel"></a>
|
||||
<li>featurelevel<br>
|
||||
Aktiviere bzw. deaktiviere bestimmte alte oder neue Funktionen, basierend
|
||||
auf die FHEM Version. Z.Bsp. das $value hash für notify wird nur bis featurelevel 5.6
|
||||
befüllt, da es unerwünscht ist. Stattdessen sollte man die
|
||||
Value() Funktion verwenden.
|
||||
</li><br>
|
||||
|
||||
|
||||
<a name="lastinclude"></a>
|
||||
<li>lastinclude<br>
|
||||
Wurde dieses Attribut gesetzt, dann wird der letzte Befehl der generierten
|
||||
Konfigurationsdatei (siehe <a href="#save">save</a> Befehl) berücksichtigt <lastinclude-value><br>
|
||||
Dieses Attribut ist DEPRECATED, bitte benutzen Sie <a href="#notify">notify</a>,
|
||||
mit dem INITIALIZED Ereignis um Befehle nach der Intialisierung
|
||||
Wurde dieses Attribut gesetzt, dann wird der letzte Befehl der
|
||||
generierten Konfigurationsdatei (siehe <a href="#save">save</a> Befehl)
|
||||
berücksichtigt <lastinclude-value><br>
|
||||
Dieses Attribut ist DEPRECATED und nur bis featurelevel 5.6
|
||||
unterstützt, bitte benutzen Sie <a href="#notify">notify</a>, mit
|
||||
dem INITIALIZED Ereignis um Befehle nach der Intialisierung
|
||||
auszuführen.
|
||||
</li><br>
|
||||
|
||||
|
41
fhem/fhem.pl
41
fhem/fhem.pl
@ -221,6 +221,7 @@ use vars qw(%value); # Current values, see commandref.html
|
||||
use vars qw($lastDefChange); # number of last def/attr change
|
||||
use vars qw(@structChangeHist); # Contains the last 10 structural changes
|
||||
use vars qw($cmdFromAnalyze); # used by the warnings-sub
|
||||
use vars qw($featurelevel);
|
||||
|
||||
my $AttrList = "verbose:0,1,2,3,4,5 room group comment alias ".
|
||||
"eventMap userReadings";
|
||||
@ -243,6 +244,7 @@ my @cmdList; # Remaining commands in a chain. Used by sleep
|
||||
$init_done = 0;
|
||||
$lastDefChange = 0;
|
||||
$readytimeout = ($^O eq "MSWin32") ? 0.1 : 5.0;
|
||||
$featurelevel = 5.6;
|
||||
|
||||
|
||||
$modules{Global}{ORDER} = -1;
|
||||
@ -261,6 +263,7 @@ my @globalAttrList = qw(
|
||||
configfile
|
||||
dupTimeout
|
||||
exclude_from_update
|
||||
featurelevel
|
||||
holiday2we
|
||||
language:EN,DE
|
||||
lastinclude
|
||||
@ -561,6 +564,7 @@ if($motd eq "$sc_text\n\n") {
|
||||
}
|
||||
|
||||
my $osuser = "os $^O, user ".(getlogin || getpwuid($<) || "unknown");
|
||||
Log 0, "Featurelevel: $featurelevel";
|
||||
Log 0, "Server started with ".int(keys %defs).
|
||||
" defined entities (version $attr{global}{version}, $osuser, pid $$)";
|
||||
|
||||
@ -921,9 +925,11 @@ AnalyzePerlCommand($$)
|
||||
|
||||
# Make life easier for oneliners:
|
||||
%value = ();
|
||||
if($featurelevel <= 5.6) {
|
||||
foreach my $d (keys %defs) {
|
||||
$value{$d} = $defs{$d}{STATE}
|
||||
}
|
||||
}
|
||||
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
|
||||
my $hms = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
|
||||
my $we = (($wday==0 || $wday==6) ? 1 : 0);
|
||||
@ -1437,8 +1443,9 @@ CommandSave($$)
|
||||
print $fh "attr $d $a $val\n";
|
||||
}
|
||||
}
|
||||
|
||||
print SFH "include $attr{global}{lastinclude}\n"
|
||||
if($attr{global}{lastinclude});
|
||||
if($attr{global}{lastinclude} && $featurelevel <= 5.6);
|
||||
|
||||
foreach my $key (keys %fh) {
|
||||
next if($fh{$key} eq "1"); ## R/O include files
|
||||
@ -1477,6 +1484,24 @@ CommandShutdown($$)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
#####################################
|
||||
sub
|
||||
ReplaceSetMagic(@) # Forum #38276
|
||||
{
|
||||
my $a = join(" ", @_);
|
||||
|
||||
$a =~ s/\[([a-z0-9._]+):([A-z0-9._]+)\]/{
|
||||
my $x = ReadingsVal($1,$2,""); $x eq "" ? "$1:$2" : $x
|
||||
}/egi;
|
||||
|
||||
$a =~ s/{([^}]+)}/{
|
||||
my $x = eval $1; $@ ? $1 : $x
|
||||
}/eg;
|
||||
|
||||
return split(" ", $a);
|
||||
}
|
||||
|
||||
#####################################
|
||||
sub
|
||||
DoSet(@)
|
||||
@ -1493,6 +1518,8 @@ DoSet(@)
|
||||
return CallFn($dev, "SetFn", $hash, @a) if($a[1] && $a[1] eq "?");
|
||||
|
||||
@a = ReplaceEventMap($dev, \@a, 0) if($attr{$dev}{eventMap});
|
||||
@a = ReplaceSetMagic(@a) if($featurelevel >= 5.7);
|
||||
|
||||
$hash->{".triggerUsed"} = 0;
|
||||
my ($ret, $skipTrigger) = CallFn($dev, "SetFn", $hash, @a);
|
||||
return $ret if($ret);
|
||||
@ -2269,6 +2296,11 @@ GlobalAttr($$$$)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
elsif($name eq "featurelevel") {
|
||||
return "$val is not in the form N.N" if($val !~ m/^\d\.\d$/);
|
||||
$featurelevel = $val;
|
||||
|
||||
}
|
||||
|
||||
return undef;
|
||||
@ -2822,7 +2854,7 @@ EvalSpecials($%)
|
||||
return $exec;
|
||||
}
|
||||
|
||||
$exec =~ s/%%/____/g;
|
||||
$exec =~ s/%%/____/g if($featurelevel < 5.7);
|
||||
|
||||
|
||||
# perform macro substitution
|
||||
@ -2830,14 +2862,19 @@ EvalSpecials($%)
|
||||
foreach my $special (keys %specials) {
|
||||
$extsyntax+= ($exec =~ s/$special/$specials{$special}/g);
|
||||
}
|
||||
|
||||
if($featurelevel < 5.7) {
|
||||
if(!$extsyntax) {
|
||||
$exec =~ s/%/$specials{"%EVENT"}/g;
|
||||
}
|
||||
$exec =~ s/____/%/g;
|
||||
}
|
||||
|
||||
if($featurelevel < 5.7) {
|
||||
$exec =~ s/@@/____/g;
|
||||
$exec =~ s/@/$specials{"%NAME"}/g;
|
||||
$exec =~ s/____/@/g;
|
||||
}
|
||||
|
||||
return $exec;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user