mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
stateFormat should be active after definition, not only after the first event.
git-svn-id: https://svn.fhem.de/fhem/trunk@2551 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
ea8815cbe9
commit
2a44fd97d0
75
fhem/fhem.pl
75
fhem/fhem.pl
@ -93,6 +93,7 @@ sub readingsSingleUpdate($$$$);
|
|||||||
sub redirectStdinStdErr();
|
sub redirectStdinStdErr();
|
||||||
sub setGlobalAttrBeforeFork($);
|
sub setGlobalAttrBeforeFork($);
|
||||||
sub setReadingsVal($$$$);
|
sub setReadingsVal($$$$);
|
||||||
|
sub evalStateFormat($);
|
||||||
|
|
||||||
sub CommandAttr($$);
|
sub CommandAttr($$);
|
||||||
sub CommandDefaultAttr($$);
|
sub CommandDefaultAttr($$);
|
||||||
@ -1772,7 +1773,8 @@ CommandAttr($$)
|
|||||||
my @rets;
|
my @rets;
|
||||||
foreach my $sdev (devspec2array($a[0])) {
|
foreach my $sdev (devspec2array($a[0])) {
|
||||||
|
|
||||||
if(!defined($defs{$sdev})) {
|
my $hash = $defs{$sdev};
|
||||||
|
if(!defined($hash)) {
|
||||||
push @rets, "Please define $sdev first";
|
push @rets, "Please define $sdev first";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
@ -1802,9 +1804,10 @@ CommandAttr($$)
|
|||||||
|
|
||||||
my %userReadings;
|
my %userReadings;
|
||||||
|
|
||||||
my $arg= $a[2]; # myReading1 { codecodecode1 }, myReading2 { codecodecode2 }, myReading3 { codecodecode3 }
|
# myReading1 { codecodecode1 }, myReading2 { codecodecode2 }, ...
|
||||||
|
my $arg= $a[2];
|
||||||
|
|
||||||
my $regexi= '\s*(\w+)\s+({.*?})\s*'; # matches myReading1 { codecodecode1 }
|
my $regexi= '\s*(\w+)\s+({.*?})\s*'; # matches myReading1 { codecode1 }
|
||||||
my $regexo= '^(' . $regexi . ')(,\s*(.*))*$';
|
my $regexo= '^(' . $regexi . ')(,\s*(.*))*$';
|
||||||
|
|
||||||
#Debug "arg is $arg";
|
#Debug "arg is $arg";
|
||||||
@ -1816,7 +1819,8 @@ CommandAttr($$)
|
|||||||
$userReadings{$userReading}= $perlCode;
|
$userReadings{$userReading}= $perlCode;
|
||||||
$arg= defined($5) ? $5 : "";
|
$arg= defined($5) ? $5 : "";
|
||||||
}
|
}
|
||||||
$defs{$sdev}{fhem}{'.userReadings'}= \%userReadings;
|
$hash->{fhem}{'.userReadings'}= \%userReadings;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($a[1] eq "IODev" && (!$a[2] || !defined($defs{$a[2]}))) {
|
if($a[1] eq "IODev" && (!$a[2] || !defined($defs{$a[2]}))) {
|
||||||
@ -1838,9 +1842,12 @@ CommandAttr($$)
|
|||||||
}
|
}
|
||||||
if($a[1] eq "IODev") {
|
if($a[1] eq "IODev") {
|
||||||
my $ioname = $a[2];
|
my $ioname = $a[2];
|
||||||
$defs{$sdev}{IODev} = $defs{$ioname};
|
$hash->{IODev} = $defs{$ioname};
|
||||||
$defs{$sdev}{NR} = $devcount++
|
$hash->{NR} = $devcount++
|
||||||
if($defs{$ioname}{NR} > $defs{$sdev}{NR});
|
if($defs{$ioname}{NR} > $hash->{NR});
|
||||||
|
}
|
||||||
|
if($a[1] eq "stateFormat") {
|
||||||
|
evalStateFormat($hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2994,6 +3001,36 @@ readingsBeginUpdate($)
|
|||||||
return $now;
|
return $now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
evalStateFormat($)
|
||||||
|
{
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# Set STATE
|
||||||
|
my $sr = AttrVal($name, "stateFormat", undef);
|
||||||
|
my $st = $hash->{READINGS}{state};
|
||||||
|
if(!$sr) {
|
||||||
|
$st = $st->{VAL} if(defined($st));
|
||||||
|
|
||||||
|
} elsif($sr =~ m/^{(.*)}$/) {
|
||||||
|
$st = eval $1;
|
||||||
|
if($@) {
|
||||||
|
$st = "Error evaluating $name stateFormat: $@";
|
||||||
|
Log 1, $st;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
# Substitute reading names with their values, leave the rest untouched.
|
||||||
|
$st = $sr;
|
||||||
|
my $r = $hash->{READINGS};
|
||||||
|
$st =~ s/\b([A-Za-z_-]+)\b/($r->{$1} ? $r->{$1}{VAL} : $1)/ge;
|
||||||
|
|
||||||
|
}
|
||||||
|
$hash->{STATE} = ReplaceEventMap($name, $st, 1) if(defined($st));
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Call readingsEndUpdate when you are done updating readings.
|
# Call readingsEndUpdate when you are done updating readings.
|
||||||
@ -3024,29 +3061,7 @@ readingsEndUpdate($$)
|
|||||||
delete $hash->{".attreour"};
|
delete $hash->{".attreour"};
|
||||||
delete $hash->{".attreocr"};
|
delete $hash->{".attreocr"};
|
||||||
|
|
||||||
|
evalStateFormat($hash);
|
||||||
###########################
|
|
||||||
# Set STATE
|
|
||||||
my $sr = AttrVal($name, "stateFormat", undef);
|
|
||||||
my $st = $hash->{READINGS}{state};
|
|
||||||
if(!$sr) {
|
|
||||||
$st = $st->{VAL} if(defined($st));
|
|
||||||
|
|
||||||
} elsif($sr =~ m/^{(.*)}$/) {
|
|
||||||
$st = eval $1;
|
|
||||||
if($@) {
|
|
||||||
$st = "Error evaluating $name stateFormat: $@";
|
|
||||||
Log 1, $st;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
# Substitute reading names with their values, leave the rest untouched.
|
|
||||||
$st = $sr;
|
|
||||||
my $r = $hash->{READINGS};
|
|
||||||
$st =~ s/\b([A-Za-z_-]+)\b/($r->{$1} ? $r->{$1}{VAL} : $1)/ge;
|
|
||||||
|
|
||||||
}
|
|
||||||
$hash->{STATE} = ReplaceEventMap($name, $st, 1) if(defined($st));
|
|
||||||
|
|
||||||
# propagate changes
|
# propagate changes
|
||||||
if($dotrigger && $init_done) {
|
if($dotrigger && $init_done) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user