2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

98_GAEBUS.pm : add support if ebusd returns a list of semicolon separated values. now several readings can be defined to hold the values

git-svn-id: https://svn.fhem.de/fhem/trunk@9836 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jamesgo 2015-11-09 13:23:32 +00:00
parent e344956f20
commit 4c20b6fab3

View File

@ -21,6 +21,9 @@
# timeout for reads increased
# 19.10.2015 : A.Goebel : add attribute disable to disable loop to collect readings
# 05.11.2015 : A.Goebel : add support for "h" (broadcast update) commands from csv, handle them equal to (r)ead
# 09.11.2015 : A.Goebel : add support for multiple readings generated from one command to ebusd
# ebusd may return a list of values like "52.0;43.0;8.000;41.0;45.0;error"
# defining a reading "VL;RL;dummy;VLWW;RLWW" will create redings VL, RL, VLWW and RLWW
package main;
@ -586,8 +589,10 @@ GAEBUS_Attr(@)
$reading =~ s/ .*//;
$reading =~ s/:.*//;
Log3 ($name, 3, "$name: delete reading: $reading");
delete($defs{$name}{READINGS}{$reading});
foreach my $r (split /;/, $reading) {
Log3 ($name, 3, "$name: delete reading: $reading");
delete($defs{$name}{READINGS}{$reading});
}
}
return undef;
@ -603,23 +608,32 @@ GAEBUS_Attr(@)
my $newreading = $attrval;
$newreading =~ s/ .*//;
$newreading =~ s/:.*//;
if ($oldreading ne $newreading)
my @or = split /;/, $oldreading;
my @nr = split /;/, $newreading;
for (my $i; $i <= $#or; $i++)
{
#Log3 ($name, 2, "$name: adjust reading: $oldreading");
if (defined($defs{$name}{READINGS}{$oldreading}))
if ($or[$i] ne $nr[$i])
{
unless ($newreading =~ /^1*$/) # matches "1" or ""
#Log3 ($name, 2, "$name: adjust reading: $or[$i]");
if (defined($defs{$name}{READINGS}{$or[$i]}))
{
#Log3 ($name, 2, "$name: change attribute $attrname ($oldreading -> $newreading)");
if (defined ($nr[$i] and $nr[$i] ne "dummy" ))
{
unless ($nr[$i] =~ /^1*$/) # matches "1" or ""
{
#Log3 ($name, 2, "$name: change attribute $attrname ($or[$i] -> $nr[$i])");
$defs{$name}{READINGS}{$newreading}{VAL} = $defs{$name}{READINGS}{$oldreading}{VAL};
$defs{$name}{READINGS}{$newreading}{TIME} = $defs{$name}{READINGS}{$oldreading}{TIME};
}
$defs{$name}{READINGS}{$nr[$i]}{VAL} = $defs{$name}{READINGS}{$or[$i]}{VAL};
$defs{$name}{READINGS}{$nr[$i]}{TIME} = $defs{$name}{READINGS}{$or[$i]}{TIME};
}
}
delete($defs{$name}{READINGS}{$oldreading});
delete($defs{$name}{READINGS}{$or[$i]});
}
}
}
}
@ -884,7 +898,7 @@ GAEBUS_doEbusCmd($$$$$$$)
#Log3 ($name, 2, "$name try to read");
sysread ($hash->{TCPDev}, $actMessage, 4096);
$actMessage =~ s/\n//g;
$actMessage =~ s/;/ /g;
#$actMessage =~ s/;/ /g;
Log3 ($name, 3, "$name answer $action $readingname $actMessage");
@ -907,17 +921,53 @@ GAEBUS_doEbusCmd($$$$$$$)
Log3 ($name, 2, "$name $actMessage");
}
if ($action eq "r") {
if (defined ($readingname)) {
# BlockingCall changes
readingsSingleUpdate ($hash, $readingname, "$actMessage", 1);
my @values = split /;/, $actMessage;
my @targetreading = defined ($readingname) ? split /;/, $readingname : ();
if ($inBlockingCall)
{
$actMessage = "";
for (my $i=0; $i <= $#targetreading; $i++)
{
next if ($targetreading[$i] eq "dummy");
my $v = defined($values[$i]) ? $values[$i] : "";
$actMessage .= $targetreading[$i]."|".$v."|";
}
$actMessage =~ s/\|$//;
}
if ($inBlockingCall) {
$actMessage = $readingname."|".$actMessage;
if ($action eq "r")
{
readingsBeginUpdate ($hash);
for (my $i=0; $i <= $#targetreading; $i++)
{
next if ($targetreading[$i] eq "dummy");
my $v = defined($values[$i]) ? $values[$i] : "";
readingsBulkUpdate ($hash, $targetreading[$i], $v);
}
readingsEndUpdate($hash, 1);
}
#if ($inBlockingCall) {
# $actMessage = $readingname."|".$actMessage;
#}
#else {
#
# if ($action eq "r") {
# if (defined ($readingname)) {
# # BlockingCall changes
# readingsSingleUpdate ($hash, $readingname, "$actMessage", 1);
# }
# }
#}
return $actMessage;
@ -1016,7 +1066,7 @@ GAEBUS_GetUpdatesDoit($)
}
# returnvalue for BlockingCall ... done routine
return "$name".$readingsToUpdate;
return $name.$readingsToUpdate;
}
@ -1153,7 +1203,9 @@ GAEBUS_GetUpdatesAborted($)
define variables that can be retrieved from the ebusd.
They will appear when they are defined by a "set" command as described above.<br>
The value assigned to an attribute specifies the name of the reading for this variable.<br>
The name of the reading can be suffixed by "&lt;number&gt;" which is a multiplicator for
If ebusd returns a list of semicolon separated values then several semicolon separated readings can be defined.<br>
"dummy" is a placeholder for a reading that will be ignored. (e.g.: temperature;dummy;pressure).<br>
The name of the reading can be suffixed by "&lt;:number&gt;" which is a multiplicator for
the evaluation within the specified interval. (eg. OutsideTemp:3 will evaluate this reading every 3-th cycle)<br>
All text followed the reading seperated by a blank is given as an additional parameter to ebusd.
This can be used to request a single value if more than one is retrieved from ebus.<br>