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.
  • @@ -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.
  • 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: + +

    + 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 + +

    -
    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:

  • + +
  • 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; }