Ergebnis 1 bis 2 von 2

Thema: Bitte um kurze Unterstützung, bin ich zu doof ? EIS5

  1. #1
    Registriert seit
    Dec 2004
    Ort
    Wiener Neudorf
    Beiträge
    4

    Bitte um kurze Unterstützung, bin ich zu doof ? EIS5

    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

  2. #2
    Registriert seit
    Dec 2004
    Ort
    Wiener Neudorf
    Beiträge
    4

    Also das habe ich bis jetzt selbst heraus gefunden, Bitte um Hilfe

    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/

    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


    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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •