From 34277e69572c1d68b8d9149298f53e768a4655ec Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sat, 5 Nov 2016 15:05:16 +0000 Subject: [PATCH] 33_readingsChange.pm: first check in git-svn-id: https://svn.fhem.de/fhem/trunk@12507 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/33_readingsChange.pm | 150 +++++++++++++++++++++++++++++++++ fhem/MAINTAINER.txt | 1 + 3 files changed, 152 insertions(+) create mode 100755 fhem/FHEM/33_readingsChange.pm diff --git a/fhem/CHANGED b/fhem/CHANGED index fef3b1789..3ed009d7c 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -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. + - feature: readingsChange FHEM helper module added - changed: 93_DbRep: daylight saving time check improved - changed: Pushsafer: added devicename to availableMessages reading name - feature: 98_Hyperion: new set toggleMode diff --git a/fhem/FHEM/33_readingsChange.pm b/fhem/FHEM/33_readingsChange.pm new file mode 100755 index 000000000..f5bea44e5 --- /dev/null +++ b/fhem/FHEM/33_readingsChange.pm @@ -0,0 +1,150 @@ +############################################## +# $Id$ +package main; + +use strict; +use warnings; +use vars qw($FW_ME); # webname (default is fhem) + +##################################### +sub +readingsChange_Initialize($) +{ + my ($hash) = @_; + + $hash->{DefFn} = "readingsChangeDefine"; + $hash->{NotifyFn} = "readingsChangeExec"; + $hash->{AttrList} ="disable:1,0 disabledForIntervals"; + $hash->{NotifyOrderPrefix} = "00-"; # be the first +} + + +##################################### +sub +readingsChangeDefine($$) +{ + my ($hash, $def) = @_; + my ($name, $type, @re) = split("[ \t]+", $def, 6); + + return "Usage: define readingsChange ". + " " + if(int(@re) != 4); + $hash->{".re"} = \@re; + + # Checking for misleading regexps + for(my $idx = 0; $idx < 3; $idx++) { + my $re = $re[$idx]; + return "Bad regexp: starting with *" if($re =~ m/^\*/); + eval { "Hallo" =~ m/^$re$/ }; + return "Bad regexp $re: $@" if($@); + } + + if($re[3] =~ m/^{.*}/) { + $hash->{".isPerl"} = 1; + my %specials= (); + my $err = perlSyntaxCheck($re[3], %specials); + return "$re[3]: $err" if($err); + } + + readingsSingleUpdate($hash, "state", "active", 0); + notifyRegexpChanged($hash, $re[0]); + + return undef; +} + +##################################### +sub +readingsChangeExec($$) +{ + my ($rc, $dev) = @_; + + my $SELF = $rc->{NAME}; + return "" if(IsDisabled($SELF)); + + my $re = $rc->{".re"}; + my $NAME = $dev->{NAME}; + return if($NAME !~ m/$re->[0]/ || !$dev->{READINGS}); + + my $events = $dev->{CHANGED}; + return if(!$events); + my $max = int(@{$events}); + + for (my $i = 0; $i < $max; $i++) { + my $EVENT = $events->[$i]; + next if(!defined($EVENT) || $EVENT !~ m/^([^ ]+): (.+)/); + my ($rg, $val) = ($1, $2); + next if($rg !~ m/$re->[1]/ || !$dev->{READINGS}{$rg}); + + Log3 $SELF, 5, "Changing $NAME:$rg $val via $SELF"; + if($rc->{".isPerl"}) { + eval "\$val =~ s/$re->[2]/$re->[3]/ge"; + } else { + eval "\$val =~ s/$re->[2]/$re->[3]/g"; + } + $events->[$i] = "$rg: $val"; + $dev->{READINGS}{$rg}{VAL} = $val; + } + return undef; +} + + +1; + +=pod +=item helper +=item summary modify reading value upon change +=item summary_DE Reading-Werte modifizieren bei Änderung +=begin html + + +

readingsChange

+
    +
    + + + Define +
      + define <name> readingsChange <device> <readingName> + <toReplace> <replaceWith>" +

      + Change the content of a reading if it changes, with the perl string + substitute mechanism. +

      + + <device>, <readingName> and <toReplace> are regular + expressions, and are not allowed to contain whitespace. + If replaceWith is enclosed in {}, then the content will be executed as a + perl expression for each match. +

      + + Examples: +
        + # shorten the reading power 0.5 W previous: 0 delta_time: 300
        + # to just power 0.5 W
        + define pShort readingsChange pm power (.*W).* $1
        +
        + # format each decimal number in the power reading to 2 decimal places
        + define p2dec readingsChange pm power (\d+\.\d+) {sprintf("%02.f", $1)} +
      +
    +
    + + + Set
      N/A

    + + + Get
      N/A

    + + + Attributes + +
    + +
+ +=end html + +=cut diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index ebf6c56bb..e32e52ff6 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -146,6 +146,7 @@ FHEM/32_TechemSD.pm herrmannj http://forum.fhem.de Sonstiges FHEM/32_WifiLight.pm herrmannj http://forum.fhem.de Beleuchtung FHEM/32_yowsup.pm justme1968 http://forum.fhem.de Unterstuetzende Dienste FHEM/32_withings.pm markus-m http://forum.fhem.de Sonstiges +FHEM/33_readingschange.pm rudolfkoenig http://forum.fhem.de Automatisierung FHEM/33_readingsGroup.pm justme1968 http://forum.fhem.de Frontends/readingsGroup readingsHistory FHEM/33_readingsHistory.pm justme1968 http://forum.fhem.de Frontends/readingsGroup readingsHistory FHEM/33_readingsProxy.pm justme1968 http://forum.fhem.de Automatisierung