Ankündigung

Einklappen
Keine Ankündigung bisher.

eibd und groupreadresponse Temperatur

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

    KNX/EIB 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

    #2
    ja! schau mal HIER auf Seite 29

    Kommentar


      #3
      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

      Kommentar


        #4
        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
        2 Objekte, 6 Linien + KNX/IP-Bereich, HS 3 SW 2.8, Visu mit 2x 15"-Touch, Softwaregateway KNX/IP für 2x Novelan Wärmepumpe, viele Ideen und wenig Zeit

        Kommentar


          #5
          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
          Gruß Dirk

          Kommentar


            #6
            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

            Kommentar


              #7
              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
              2 Objekte, 6 Linien + KNX/IP-Bereich, HS 3 SW 2.8, Visu mit 2x 15"-Touch, Softwaregateway KNX/IP für 2x Novelan Wärmepumpe, viele Ideen und wenig Zeit

              Kommentar


                #8
                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

                Kommentar


                  #9
                  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
                  KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                  WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                  PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                  Kommentar

                  Lädt...
                  X