From ad6800faaf648c12d91a6658ce55ce85bd1a9d6f Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Tue, 14 Feb 2012 08:13:08 +0000 Subject: [PATCH] Slight changes to Boris's additions git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@1260 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/00_KM271.pm | 27 ++----- fhem.pl | 178 +++++++++++++++++++++++++---------------------- 2 files changed, 99 insertions(+), 106 deletions(-) diff --git a/FHEM/00_KM271.pm b/FHEM/00_KM271.pm index 138486b95..4e70e362e 100755 --- a/FHEM/00_KM271.pm +++ b/FHEM/00_KM271.pm @@ -16,7 +16,6 @@ sub KM271_Read($); sub KM271_Ready($); sub KM271_crc($); sub KM271_setbits($$); -sub KM271_GetReading($$); sub KM271_SetReading($$$$$); my %km271_sets = ( @@ -351,7 +350,7 @@ KM271_Read($) # Analyze the data my ($fn, $arg) = ($1, $2); my $msghash = $km271_rev{$fn}; - my $all_events = KM271_attr($name, "all_km271_events") ; + my $all_events = AttrVal($name, "all_km271_events", "") ; my $tn = TimeNow(); #Log 1, "$data" if($fn ne "0400"); @@ -374,8 +373,8 @@ KM271_Read($) elsif($f eq "bf") { $val = KM271_setbits($val, $farg); } elsif($f eq "a") { $val = $km271_arrays[$farg][$val]; } elsif($f eq "mb") { - $val += KM271_GetReading($hash, $key."1") * 256; - $val += KM271_GetReading($hash, $key."2") * 65536 if($farg == 3); + $val += ReadingsVal($name, $key."1", 0) * 256; + $val += ReadingsVal($name, $key."2", 0) * 65536 if($farg == 3); } } KM271_SetReading($hash, $tn, $key, $val, $ntfy); @@ -443,31 +442,13 @@ KM271_crc($) return sprintf("%02x", $x); } -sub -KM271_attr($$) -{ - my ($name, $attr) = @_; - return $attr{$name}{$attr} if($attr{$name} && $attr{$name}{$attr}); - return ""; -} - -sub -KM271_GetReading($$) -{ - my ($hash, $msg) = @_; - return $hash->{READINGS}{$msg}{VAL} - if($hash->{READINGS} && $hash->{READINGS}{$msg}); - return 0; -} - sub KM271_SetReading($$$$$) { my ($hash,$tn,$key,$val,$ntfy) = @_; my $name = $hash->{NAME}; Log GetLogLevel($name,4), "$name: $key $val" if($key ne "NoData"); - $hash->{READINGS}{$key}{TIME} = $tn; - $hash->{READINGS}{$key}{VAL} = $val; + setReadingsVal($hash, $key, $val, $tn); DoTrigger($name, "$key: $val") if($ntfy); } diff --git a/fhem.pl b/fhem.pl index e40c08ffc..9860873ab 100755 --- a/fhem.pl +++ b/fhem.pl @@ -83,6 +83,8 @@ sub IsDummy($); sub IsIgnored($); sub setGlobalAttrBeforeFork(); sub redirectStdinStdErr(); +sub setReadingsVal($$$$); +sub addEvent($$); sub CommandAttr($$); sub CommandDefaultAttr($$); @@ -2530,71 +2532,6 @@ SecondsTillTomorrow($) # 86400, if tomorrow is no DST change return $stt_sec; } -sub -ReadingsVal($$$) -{ - my ($d,$n,$default) = @_; - if(defined($defs{$d}) && - defined($defs{$d}{READINGS}) && - defined($defs{$d}{READINGS}{$n}) && - defined($defs{$d}{READINGS}{$n}{VAL})) { - return $defs{$d}{READINGS}{$n}{VAL}; - } - return $default; -} - -sub -ReadingsTimestamp($$$) -{ - my ($d,$n,$default) = @_; - if(defined($defs{$d}) && - defined($defs{$d}{READINGS}) && - defined($defs{$d}{READINGS}{$n}) && - defined($defs{$d}{READINGS}{$n}{TIME})) { - return $defs{$d}{READINGS}{$n}{TIME}; - } - return $default; -} - - -sub -Value($) -{ - my ($d) = @_; - if(defined($defs{$d}) && - defined($defs{$d}{STATE})) { - return $defs{$d}{STATE}; - } - return ""; -} - -sub -OldValue($) -{ - my ($d) = @_; - return $oldvalue{$d}{VAL} if(defined($oldvalue{$d})) ; - return ""; -} - -sub -OldTimestamp($) -{ - my ($d) = @_; - return $oldvalue{$d}{TIME} if(defined($oldvalue{$d})) ; - return ""; -} - - - - -sub -AttrVal($$$) -{ - my ($d,$n,$default) = @_; - return $attr{$d}{$n} if($d && defined($attr{$d}) && defined($attr{$d}{$n})); - return $default; -} - # Add an attribute to the userattr list, if not yet present sub addToAttrList($) @@ -2670,10 +2607,92 @@ setGlobalAttrBeforeFork() } +########################################### +# Functions used to make fhem-oneliners more readable, +# but also recommended to be used by modules +sub +ReadingsVal($$$) +{ + my ($d,$n,$default) = @_; + if(defined($defs{$d}) && + defined($defs{$d}{READINGS}) && + defined($defs{$d}{READINGS}{$n}) && + defined($defs{$d}{READINGS}{$n}{VAL})) { + return $defs{$d}{READINGS}{$n}{VAL}; + } + return $default; +} + +sub +ReadingsTimestamp($$$) +{ + my ($d,$n,$default) = @_; + if(defined($defs{$d}) && + defined($defs{$d}{READINGS}) && + defined($defs{$d}{READINGS}{$n}) && + defined($defs{$d}{READINGS}{$n}{TIME})) { + return $defs{$d}{READINGS}{$n}{TIME}; + } + return $default; +} + +sub +Value($) +{ + my ($d) = @_; + if(defined($defs{$d}) && + defined($defs{$d}{STATE})) { + return $defs{$d}{STATE}; + } + return ""; +} + +sub +OldValue($) +{ + my ($d) = @_; + return $oldvalue{$d}{VAL} if(defined($oldvalue{$d})) ; + return ""; +} + +sub +OldTimestamp($) +{ + my ($d) = @_; + return $oldvalue{$d}{TIME} if(defined($oldvalue{$d})) ; + return ""; +} + +sub +AttrVal($$$) +{ + my ($d,$n,$default) = @_; + return $attr{$d}{$n} if($d && defined($attr{$d}) && defined($attr{$d}{$n})); + return $default; +} + +################################################################ +# Functions used by modules. +sub +setReadingsVal($$$$) +{ + my ($hash,$rname,$val,$ts) = @_; + $hash->{READINGS}{$rname}{VAL} = $val; + $hash->{READINGS}{$rname}{TIME} = $ts; +} + +sub +addEvent($$) +{ + my ($hash,$event) = @_; + push(@{$hash->{CHANGED}}, $event); +} + + + ################################################################ # -# What follows are wrappers for commonly used core functions -# in device-specific modules. +# Wrappers for commonly used core functions in device-specific modules. # This part written by Boris Neubert omega at online dot de # ################################################################ @@ -2728,7 +2747,6 @@ readingsUpdate($$$) { my ($hash,$reading,$value)= @_; my $name= $hash->{NAME}; - # sanity check defined($hash->{helper}{updating}) || die "fhem.pl: readingsUpdateReading: you must call readingsBeginUpdate first."; @@ -2737,32 +2755,26 @@ readingsUpdate($$$) { my $readings= $hash->{READINGS}; # these flags determine if any of the "event-on" attributes are set; - my $attreocr= defined($attr{$name}{"event-on-change-reading"}); - my $attreour= defined($attr{$name}{"event-on-update-reading"}); + my $attreocr= AttrVal($name, "event-on-change-reading", ""); + my $attreour= AttrVal($name, "event-on-update-reading", ""); # these flags determine whether the reading is listed in any of the attributes - my $eocr= $attreocr && grep($_ eq $reading, split /,/,$attr{$name}{"event-on-change-reading"}); - my $eour= $attreour && grep($_ eq $reading, split /,/,$attr{$name}{"event-on-update-reading"}); + my $eocr= $attreocr && grep($_ eq $reading, split /,/,$attreocr); + my $eour= $attreour && grep($_ eq $reading, split /,/,$attreour); # determine if an event should be created my $changed= !($attreocr || $attreour) # always create event if no attribute is set - || $eour # or if the reading is listed in event-on-change-reading - || ($eocr && # or if the reading is listed in event-on-update-reading... + || $eour # or if the reading is listed in event-on-update-reading + || ($eocr && # or if the reading is listed in event-on-change-reading... ($value ne $readings->{$reading}{VAL})); # ...and its value has changed. - #Log 1, "changed!" if($changed); # DEBUG - - # update reading 5.x - $readings->{$reading}{TIME}= $hash->{helper}{updating}{latestUpdate}; - $readings->{$reading}{VAL}= $value; - # update reading (upward compatibility), see http://fhemwiki.de/wiki/DevelopmentGuidelines#Struktur_im_Code - #$hash->{"readings"}{$reading}{"time"}= $hash->{helper}{updating}{latestUpdate}; - #$hash->{"readings"}{$reading}{"value"}= $value; + setReadingsVal($hash, $reading, $value, $hash->{helper}{updating}{latestUpdate}); # add to CHANGED hash + #Log 1, "changed!" if($changed); # DEBUG my $rv= "$reading: $value"; - push(@{$hash->{CHANGED}}, $rv) if($changed); + addEvent($hash, $rv) if($changed); return $rv; }