PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitte um kurze Unterstützung, bin ich zu doof ? EIS5



spiderp2351
21.12.08, 19:42
Kann über Linux und eidb usw. einen Zimmertemparatur wert wie folgt auslesen:

0C29 = 21.3 Grad laut http://www.tapko.de/index.php/Tools/31/0/

Habe im Misterhouse folgende Funktion gefunden für die Umrechung von 2 byte hex auf dec

Datei EIB_Items.pm

sub decode {
my ($self, @data) = @_;
my $res;

unless ($#data == 2) {
&main: print_log("Not EIS type 5 data received for $self->{groupaddr}: \[@data\]") if $main::config_parms{eib_errata} >= 2;
return;
}
my $sign = $data[1] & 0x80;
my $exp = ($data[1] & 0x78) >> 3;
my $mant = (($data[1] & 0x7) << 8) | $data[2];

$mant = -(~($mant - 1) & 0x7ff) if $sign != 0;
$res = (1 << $exp) * 0.01 * $mant;
return $res;
}


Meine Frage was steht denn in $data[1] und $data[2] in Bezug auf meinen Wert 0C29 oder kann ich das garn nicht so rechnen ? Ich nehme an, wenn die @data richtig befüllt wurde steht dann in $res = 21.3 oder ?

Habe schon alles möglich probiert aber dieser Wert kommt bei mir überhaupt nicht raus...

Bitte um kurze Hilfe.
Danke

spiderp2351
27.12.08, 16:14
Also der Tempwert ist ein 2 Octet Float Value.
D.h. 2 x 8 bits (1 Octet ist eine Serie von 8 Bits)

Am Bus bekomme ich die Info 19 0F also ein HEX Wert
Auf der WEB Seite konnte ich den Hex Wert umrechen http://www.tapko.de/index.php/Tools/31/0/ (http://www.tapko.de/index.php/Tools/31/0/)

19 0F = 21.68 Grad

Habe nun mein Perl Script erstellt und bekomme aber leider nur 5.42 Grad raus, in Anlehnung auf die Erklärung von Michel http://www.eib-userclub.de/forum/showthread.php?t=7081 (http://www.eib-userclub.de/forum/showthread.php?t=7081)


my $hex1 = "19";
my $hex2 = "0F";
my $bin1 = "";
my $bin2 = "";
my $bin = "";
$bin1 = unpack("b*", pack("h*",$hex1));
$bin2 = unpack("b*", pack("h*",$hex2));
$bin = $bin1.$bin2;

print "$hex1 $hex2 .... $bin1 $bin2 $bin\n";

my $sign = substr($bin,0,1);
my $exp = substr($bin,1,4);
my $mant = substr($bin,5,11);

print "sign: $sign exp: $exp mant: $mant\n";

my $signdec = bin2dec($sign);
my $expdec = bin2dec($exp);
my $mantdec = bin2dec($mant);

print "signdec: $signdec expdec: $expdec mantdec: $mantdec\n";

$value1 = (0,01*$mantdec);
$value2 = 2**$expdec;
$value3 = ($value1*$value2)/100;

print "$value1 $value2 Temperatur $value3\n";
exit;

sub bin2dec {
return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
sub dec2bin {
my $str = unpack("B32", pack("N", shift));
$str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros
return $str;
}

Output:

19 0F .... 10001001 00001111 1000100100001111
sign: 1 exp: 0001 mant: 00100001111
signdec: 1 expdec: 1 mantdec: 271
271 2 Temperatur 5.42


Kann mir irgendwer helfen ?

lg
Markus