Ankündigung

Einklappen
Keine Ankündigung bisher.

Mit LinKNX Temperatur auf den Bus senden...

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

    Mit LinKNX Temperatur auf den Bus senden...

    Moin Jungs,

    ich habe auf einem Linux Rechner LinKNX laufen. Ebenso hat dieser Rechner Zugriff auf ein Funksystem mit dem ich die Temperaturen in den einzelnen Räumen erkennen kann.

    Nun will ich diese Temperatur gerne auf dem Bus zur Verfügung stellen, damit ich ihn in eine KNX-Visio sehen kann. Es sollte also ein valides Temperatur-Objekt sein.

    Wie kann ich das machen? In welchem Format brauche ich die Temperatur? Wie sieht das mit normalen Thermometern aus? Senden die regelmäßig die Temperatur auf den Bus, oder nur, wenn sie über den Bus eine Anfrage bekommen.

    Kann ich in der ETS Dummy-Objekte einsetzen, die stattdessen dann von der LinKNX bedient werden?!


    Danke....Netsrac

    #2
    Zitat von netsrac Beitrag anzeigen
    Wie kann ich das machen? In welchem Format brauche ich die Temperatur? ... Kann ich in der ETS Dummy-Objekte einsetzen, die stattdessen dann von der LinKNX bedient werden?!
    Hoi Carsten
    Die Temperaturen sind gemäss KNX Association Datapoint Types Page 12 DTP 9.001 (F16).
    (3.10 Datapoint Types “2-Octet Float Value” Page 31)
    Das muss man umrechnen. ( SUFU )
    (Ich hab's selber umgerechnet, aber falsch, Minustemperaturen sind bei mir einfach immer noch falsch )
    Code:
    3.10 Datapoint Types “2-Octet Float Value”
    Format: 2 octets: F16
    octet nr 2 MSB 1 LSB
    field names FloatValue
    encoding ME E E E MMM MM MM M M MMM
    Encoding: 
    FloatValue = (0,01*M)*2(E)
    E = [0 … 15]
    M = [-2 048 … 2 047], two’s complement notation
    For all Datapoint Types 9.xxx, the encoded value 7FFFh shall always be used to denote invalid data.
    
    Range: [-671 088,64 … 670 760,96]
    PDT: PDT_KNX_FLOAT
    ID:     Name:          Range:             Unit: Resol.: Use:
    9.001  DPT_Value_Temp -273 °C … 670760 °C °C  0,01 °C G
    Verwendung einer entsprechenden GA in Linknx:
    Code:
      <!-- Termostaten -->
        <object id="temp_zi1"             gad="3/0/10"  type="9.xxx" init="persist">Temp. Zimmer 1</object>
    Grüsse Bodo
    Fragen gehören ins Forum, und nicht in mein Postfach;
    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

    Kommentar


      #3
      Zitat von Bodo Beitrag anzeigen
      Das muss man umrechnen. ( SUFU )
      (Ich hab's selber umgerechnet, aber falsch, Minustemperaturen sind bei mir einfach immer noch falsch )
      Kannst Du mir mal Deine Formel zeigen. Ersten habe ich dann eine Idee, wie Du es umrechnest und zweitens finde ich vielleicht Deinen Fehler.

      Ansonsten Danke erstmal...werde ich, wenn ich die Umrechnung habe, mal versuchen...

      Gruß, Netsrac

      Kommentar


        #4
        Hoi
        Oh nackisch ausziehen?
        An meinem quick and dirty "Perl" Code hast Du sicher keine Freude.
        Da gibt es wesentlich bessere Coder und Codes
        Na denn:
        Code:
        sub make9001 {
          my $it=0;
          my $fakt=0;
          my $expo=0;
          my $mant=0;
          my $binmant=0;
          my $binexpo=0;
          my $bin=0;
          my $it1=0;
          my $it2=0;
          my $it3=0;
          $it=sprintf("%.2f",$_[0])*100;  # auf zwei Stellen runden mal 100
          if($it>=0) {
            $it=abs($it);
            if($it<=2047) {
              $fakt=1; $expo=0;
            }
            elsif((2048<=$it)&&($it<=4095)) {
              $fakt=2; $expo=1;
            }
            elsif((4096<=$it)&&($it<=8191)) {
              $fakt=4; $expo=2;
            }
            elsif((8192<=$it)&&($it<=16383)) {
              $fakt=8; $expo=3;
            }
            else {
              $fakt=16; $expo=4;
            }
            $mant=$it/$fakt;
            $binmant=sprintf("%011b",$mant);
            $binexpo=sprintf("%04b",($expo<<11));
            $bin=$binmant + $binexpo;
            if(length($bin)<=4) {
              $it1=sprintf("%x",&bin2dec($bin));
            }
            elsif(length($bin)<=8) {
              $it1=sprintf("%x",&bin2dec(substr($bin,length($bin)-4,4)));
              $it2=sprintf("%x",&bin2dec(substr($bin,0,length($bin)-4)));
            }
            elsif(length($bin)<=12) {
              $it1=sprintf("%x",&bin2dec(substr($bin,length($bin)-4,4)));
              $it2=sprintf("%x",&bin2dec(substr($bin,length($bin)-8,4)));
              $it3=sprintf("%x",&bin2dec(substr($bin,0,length($bin)-8)));
            }
            return $it3." ".$it2.$it1;
          }
        }
        hab' nochwas gefunden, ist aber python und nicht von mir:
        Code:
        def decodeDPT9(self,raw):
                ## 2 Byte Float
                ## SEEEEMMM MMMMMMMM
                ## S Sign (0/1)
                ## E Exponent (0..15)
                ## M Mantisse (-2048 ... 2047)
                ## For all Datapoint Types 9.xxx, the encoded value 7FFFh shall always be used to denote invalid data.
                val = self.toBigInt(raw)
                sign = (val & 0x8000) >> 15
                exp = (val & 0x7800) >> 11
                mant = val & 0x07ff
                if sign <> 0:
                    mant = -(~(mant - 1) & 0x07ff) 
                self.debug("DPT9: value: %d sign: %d exp: %d mant: %f" % (val, sign,exp,mant))
                return (1 << exp) * 0.01 * mant
        
            def encodeDPT9(self,val):
                sign = 0
                exp = 0
                if val < 0:
                    sign = 0x8000
                mant = val * 100
                while mant > 0x07ff:
                    mant = mant >> 1
                    exp +=1
                data = sign | (exp << 11) | (int(mant) & 0x07ff)
                self.debug("DPT9: value: %d sign: %d exp: %d mant: %r" % (val, sign,exp,mant))
                ## change to 2Byte bytearray 
                return self.toByteArray(data,2)
        Aber das bit-shiften kommt mir bekannt vor.
        Angehängte Dateien
        Grüsse Bodo
        Fragen gehören ins Forum, und nicht in mein Postfach;
        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

        Kommentar


          #5
          Falls es jemandem hilft, ich habe den Code von Python auf Perl umgeschrieben (nicht schwierig, aber für Copy&Paste in ein Perl-Skript sicherlich praktisch):

          Code:
          sub encodeDPT9 {
            my $val = $_[0];
            my $sign = 0;
            my $exp = 0;
          
            my $mant = $val * 100;
            while($mant > 0x07FF) {
              $mant = $mant >> 1;
              $exp = $exp + 1;
            }
          
            $data = $sign | ($exp << 11) | ($mant & 0x07ff);
          
            return $data;
          }

          Kommentar

          Lädt...
          X