From 3350f1a9b9dbc8329875f571b2b949d66a44ea9a Mon Sep 17 00:00:00 2001
From: rudolfkoenig <>
Date: Mon, 22 Jun 2015 18:24:59 +0000
Subject: [PATCH] fhem.pl: add featurelevel + set magic (Forum #38276)
git-svn-id: https://svn.fhem.de/fhem/trunk@8800 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/91_notify.pm | 45 ++++++++++++-----------
fhem/docs/commandref_frame.html | 25 +++++++++++--
fhem/docs/commandref_frame_DE.html | 40 ++++++++++++++------
fhem/fhem.pl | 59 ++++++++++++++++++++++++------
4 files changed, 121 insertions(+), 48 deletions(-)
diff --git a/fhem/FHEM/91_notify.pm b/fhem/FHEM/91_notify.pm
index e372a0b00..079bb2a7c 100755
--- a/fhem/FHEM/91_notify.pm
+++ b/fhem/FHEM/91_notify.pm
@@ -299,7 +299,8 @@ notify_fhemwebFn($$$$)
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.
- The character
%
will be replaced with the received
@@ -308,17 +309,16 @@ notify_fhemwebFn($$$$)
the %
into double quotes, else the shell may get a syntax
error.
- - The character
@
will be replaced with the device
+ - The character @ will be replaced with the device
name.
- To use % or @ in the text itself, use the double mode (%% or
@@).
- - 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 %
+ - 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.
@@ -481,32 +481,33 @@ notify_fhemwebFn($$$$)
Gerätes, z.B. myFht
- 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.
+ 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.
- - Das Zeichen
%
wird ersetzt mit dem empfangenen
- Ereignis (Event), z.B. mit on
oder off
oder
+ - Das Zeichen % wird ersetzt mit dem empfangenen
+ Ereignis (Event), z.B. mit on oder off oder
measured-temp: 21.7 (Celsius)
.
- - Das Zeichen
@
wird ersetzt durch den
+ - Das Zeichen @ wird ersetzt durch den
Gerätenamen.
- Um % oder @ im Text selbst benutzen zu können, müssen
sie verdoppelt werden (%% oder @@).
- - 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
+ - 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
%
verliert seine
- %oben beschriebene Bedeutung, falls auch nur einer dieser Parameter
- %in der Definition auftaucht.
+ %EVTPART1, usw. Ein einzeln stehendes % verliert seine
+ oben beschriebene Bedeutung, falls auch nur einer dieser Parameter
+ in der Definition auftaucht.
diff --git a/fhem/docs/commandref_frame.html b/fhem/docs/commandref_frame.html
index d3e81ddd6..ec0acc96b 100644
--- a/fhem/docs/commandref_frame.html
+++ b/fhem/docs/commandref_frame.html
@@ -1092,8 +1092,16 @@ The following local attributes are used by a wider range of devices:
Each device has different set parameters, see the corresponding device
section for details.
-
-
+
+ From featurelevel 5.7 on the set command replaces:
+
+ - [device:reading] with the corresponding reading of device, if both device
+ and reading exists.
+ - {perlExpression} with the result of perlExpression, if the expression
+ does not generates an error.
+
+
+
Some modules support a common list of set extensions, 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:
+
+ featurelevel
+ 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.
+
+
lastinclude
If this attribute is set, then the last command of the generated
configfile (see the save command) will be
include <lastinclude-value>
- This attribute is DEPRECATED, use notify, with
- the INITIALIZED event to execute commands after initialization.
+ This attribute is DEPRECATED and valid for featurelevel up to 5.6, use
+ notify, with the INITIALIZED event to execute
+ commands after initialization.
+
logfile
Specify the logfile to write. You can use "-" for
diff --git a/fhem/docs/commandref_frame_DE.html b/fhem/docs/commandref_frame_DE.html
index e0ea15c13..26514dfab 100644
--- a/fhem/docs/commandref_frame_DE.html
+++ b/fhem/docs/commandref_frame_DE.html
@@ -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.
-
+
+ Ab featurelevel 5.7 ersetzt das set Befehl
+
+ - [device:reading] mit dem Wert des Readings für device, falls sowohl
+ device, als auch Reading existiert, und nicht leer ist.
+ - {perlExpression} mit dem Ergebnis der perlExpression, falls der Ausdruck
+ keinen Fehler generiert.
+
+
-
Manche Module unterstützen die sog. set extensions, und in der
entsprechenden Dokumentation ist ein Link auf diesem Text zu finden. Falls im
@@ -1411,23 +1418,34 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
holiday2we
- Wenn dieses Attribut gesetzt wurde, dann wird die $we
- Variable
- als "true" betrachtet, wenn der Wert der holiday
- Variable zu diesem Attribut nicht "none" ist.
+ Wenn dieses Attribut gesetzt wurde, dann wird die $we Variable als "true" betrachtet, wenn der
+ Wert der holiday Variable zu diesem Attribut
+ nicht "none" ist.
Beispiel:
attr global holiday2we hessen
+
+ featurelevel
+ 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.
+
+
+
lastinclude
- Wurde dieses Attribut gesetzt, dann wird der letzte Befehl der generierten
- Konfigurationsdatei (siehe save Befehl) berücksichtigt <lastinclude-value>
- Dieses Attribut ist DEPRECATED, bitte benutzen Sie notify,
- mit dem INITIALIZED Ereignis um Befehle nach der Intialisierung
- auszuführen.
+ Wurde dieses Attribut gesetzt, dann wird der letzte Befehl der
+ generierten Konfigurationsdatei (siehe save Befehl)
+ berücksichtigt <lastinclude-value>
+ Dieses Attribut ist DEPRECATED und nur bis featurelevel 5.6
+ unterstützt, bitte benutzen Sie notify, mit
+ dem INITIALIZED Ereignis um Befehle nach der Intialisierung
+ auszuführen.
diff --git a/fhem/fhem.pl b/fhem/fhem.pl
index 5ba3bb84c..a1f351b1e 100755
--- a/fhem/fhem.pl
+++ b/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,8 +925,10 @@ AnalyzePerlCommand($$)
# Make life easier for oneliners:
%value = ();
- foreach my $d (keys %defs) {
- $value{$d} = $defs{$d}{STATE}
+ 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);
@@ -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(!$extsyntax) {
- $exec =~ s/%/$specials{"%EVENT"}/g;
- }
- $exec =~ s/____/%/g;
- $exec =~ s/@@/____/g;
- $exec =~ s/@/$specials{"%NAME"}/g;
- $exec =~ s/____/@/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;
}