Ankündigung

Einklappen
Keine Ankündigung bisher.

eibd und groupreadresponse Temperatur

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • NetFritz
    antwortet
    Hallo

    Mit den gleichen Problem habe ich mich vor 4 Wochen auch beschäftigt.
    Mit Hilfe eines PHP Forums habe ich das so gelöst.
    Ich musste den Wärmezähler von RTS-Automation auslesen.
    Ich löse das mit eibd und PHP.
    Code:
      # EIS9 / DPT 14  4Byte IEEE-Gleitkomma (floating point)
       case "9":         
       $binary = str_pad(decbin(hexdec($eib_data[24].$eib_data[25].
                    $eib_data[26].$eib_data[27])),32,"0",STR_PAD_LEFT);
       #echo "bin= $binary \n";
       # Sign Bit 
       $fb = $binary[0];
       # Exponent 
       $exp = bindec(substr($binary, 1, 8));
       #echo "expo= $exp \n";
       # Mantisse
       $m = bindec(substr($binary, 9, 23));
       #echo "mant= $m \n"; 
       #aus Sign Bit , Exponent u. Mantisse die Flieskommazahl zusammenstellen 
       $out = pow(-1,$fb) * (1+$m/(pow(2,23))) * pow(2,$exp-127);
       # echo "out= $out \n";
       $value = round($out,3);  
       # echo "<= $value \n";            
       break;
    Gruß NetFritz

    Einen Kommentar schreiben:


  • spiderp2351
    antwortet
    Jetzt sollte es passen .. einige Test´s gemacht

    schaut meiner Meinung nach gut aus. Problem waren noch die Negativ werte welche durch einen Bitrevers angepasst werden mussten.

    Anbei das Script:

    #!/usr/bin/perl

    # 85DA -5.5
    # 8500 -7.68
    # 190F 21.68
    # 19CC 36.8

    my $bin = "";
    my $hex = "8500";
    my $temp = unpack("B32", pack("N", hex $hex));

    my $bin = substr($temp, -16);

    print "hex: $hex = bin: $bin\n";

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

    @chars = split //, $mant;

    $mantrev = "";
    foreach (@chars) {
    if ($_ eq "0") {
    $mantrev .= "1";
    } elsif ($_ eq "1") {
    $mantrev .= "0";
    }
    }

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

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

    my $mantdec = "";

    if ($signdec eq 0) {
    $mantdec = bin2dec($mant);
    } elsif ($signdec != 0) {
    $mantdec = bin2dec($mantrev);
    $mantdec =- $mantdec-1;
    }


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


    $value1 = $mantdec;
    $value2 = 2**$expdec;
    $value3 = $value1 * $value2;
    $value4 = $value3*(0.01);


    print "value1: $value1 value2: $value2 value3: $value3 value4: $value4 \n";

    print "\n ------------------------";
    print "\n Temperatur: $value4";
    print "\n ------------------------\n";


    sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
    }





    Ausgabe:
    verleihnix:/home/le/eib/Dokumentation # ./xx.pl
    hex: 8500 = bin: 1000010100000000
    sign: 1 exp: 0000 mant: 10100000000 mantreverse: 01011111111
    signdec: 1
    expdec: 0
    mantdec: -768
    value1: -768 value2: 1 value3: -768 value4: -7.68

    ------------------------
    Temperatur: -7.68
    ------------------------

    Danke an Alle für die Mithilfe
    Markus

    Einen Kommentar schreiben:


  • swenga
    antwortet
    Hallo Markus,

    Zitat von spiderp2351 Beitrag anzeigen
    $value3 =- $value3;
    Stehe mit der Syntax auf Kriegsfuss, da für diese Variablen keine eindeutigen Typdiskrimierungen existieren (Bin halt C-Fetischist....). Ich weiss nicht, wie sich da der Interpeter bei mathematischen Operationen verhält.

    Aber probier mal:
    $value3 = -1 * $value3;

    mfg

    Swen

    Einen Kommentar schreiben:


  • spiderp2351
    antwortet
    Ihr seit eine wucht... bald haben wirs

    Ich bin zwar auch nicht der perl Spezialist aber die Umrechung für alle Wert von 0.9 aufwärts scheinen zu funktionieren mit diesem script.

    Jetzt ist noch zu klären wie die negativen Werte berechnet werden, die gehen noch nicht.

    #!/usr/bin/perl

    # 85DA -5.5
    # 190F 21.68

    my $bin = "";
    my $hex = "190F";
    my $temp = unpack("B32", pack("N", hex $hex));
    my $bin = substr($temp, -16);

    print "hex: $hex = bin: $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\n expdec: $expdec\n mantdec: $mantdec\n";

    if ($signdec eq 0) {

    $value1 = $mantdec;
    $value2 = 2**$expdec;
    $value3 = $value1 * $value2;
    $value4 = $value3*(0.01);

    } elsif ($signdec != 0) {

    $value1 = (0,01*$mantdec);
    $value2 = 2**$expdec;
    $value3 = ($value1*$value2);
    $value3 =- $value3;
    }

    print "value1: $value1 value2: $value2 value3: $value3 value4: $value4 \n";

    exit;

    sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
    }


    verleihnix:/home/le/eib/Dokumentation # ./xx.pl
    hex: 190F = bin: 0001100100001111
    sign: 0 exp: 0011 mant: 00100001111
    signdec: 0
    expdec: 3
    mantdec: 271
    value1: 271 value2: 8 value3: 2168 value4: 21.68
    verleihnix:/home/le/eib/Dokumentation #

    verleihnix:/home/le/eib/Dokumentation # ./xx.pl
    hex: 85DA = bin: 1000010111011010
    sign: 1 exp: 0000 mant: 10111011010
    signdec: 1
    expdec: 0
    mantdec: 1498
    value1: 1498 value2: 1 value3: -1498 value4:
    verleihnix:/home/le/eib/Dokumentation #

    Danke für die rasche Unterstützung. Jetzt nur mehr die negativen Werte.. grübl .. grübl ...

    lg
    Markus

    Einen Kommentar schreiben:


  • DirkNienhaus
    antwortet
    Hi!

    also dein Bin-Wert ist doch schon nicht korret, oder?
    Bir mir entspricht 0x190F = 0b00011001 00001111

    Somit ist:
    sign: 0 exp: 0011 mant: 00100001111
    signdec: 0 expdec: 3 mantdec: 271

    Einen Kommentar schreiben:


  • swenga
    antwortet
    Hallo Markus,

    bin jetzt nicht der perl-Freak, aber bei Deiner Wertedecodierung liegt der Hase zeitig im Pfeffer: 19 0F ist binar

    1: 0001 9: 1001: 0: 0000 F: 1111
    hintereinander:
    0001 1001 0000 1111

    Zahlweise rechts nach links, LSB also rechts!
    Das Sign ist im obersten Bit, also 0
    Der Exponent ist von Bit 11 bis 14, also dezimal 3
    Die Mantisse sind die untersten 11 Bit, also 271 (256 für das 8. Bit und die untersten 4 sind 15)

    271 * 2^3 = 2168, multipliziert mit dem Wertfaktor 0,01 (um die zwei Dezimalstellen zu haben) ergibt 21,68 Grad.

    Schaue Dir also mal deine Auslesungen der Werte an, Mantisse ist richtig, aber dir geht ein Bit für den Exponenten ab, dafuer ist es zum Sign gerutscht. Ausserdem stimmt deine Mathematik nicht, da Du ein Sign hast, muesste ein negatives Ergebnis rauskommen.

    mfg

    Swen

    Einen Kommentar schreiben:


  • spiderp2351
    antwortet
    Temperatur in Perl

    Oh Danke
    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

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    ja! schau mal HIER auf Seite 29

    Einen Kommentar schreiben:


  • spiderp2351
    hat ein Thema erstellt KNX/EIB eibd und groupreadresponse Temperatur.

    eibd und groupreadresponse Temperatur

    Hallo Liebe Leute!

    Habe in der letzten Zeit den Eibd Daemon zum Laufen gebracht. Lichter können bereits ein- und ausgeschaltet werden von der Command line aus.. yep. Aber nun habe ich ein kleines Problem und benötige von Euch Unterstützung.

    Ich kann mit

    groupreadresponse ip:127.0.0.1 6/1/3
    Send request
    Read from 0.0.0
    Response from 1.1.31: 19 0D

    einen Temperaturwert auslesen. Ich bekomme den Wert 19 0D.
    Ich möchte diesen Wert mit Perl in eine Dezimalzahl umwandeln, aber wie ?
    Kann mir bitte jemand helfen ?

    Danke im Vorraus.
    lg
    Markus
Lädt...
X