Ankündigung

Einklappen
Keine Ankündigung bisher.

brauche Hilfe bei Datentypen

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

    KNX/EIB brauche Hilfe bei Datentypen

    Hallo,

    brauch mal eure Hilfe bei Der Darstellung von Werte bei bestimmten Datentypen.

    Ein Gerät sendet als 2 Byte Wert die Rohdaten 00 1C. Das ganze ist eigentlich ein Temperaturwert von 28°C. Wenn ich es in der ETS als 2-Byte-mit-Vorzeichen anzeigen lasse, sehe ich 28, lasse ich es Temperatur anzeigen sehe ich 0,28°C

    1. Frage: Wird ein Tempwert immer als "Hundertstel" interpretiert?

    Ich kann dem Gerät Konvertierungsregeln mitgeben, in dem Fall hab ich es mit "Multiplikation mit 100" versucht.

    Als Rohdaten kommen jetzt 0A F0 an, das ist das 100fache von 00 1C. Als 2-Byte mit Vorzeichen wird 2800, angezeigt, das 100fache von 28. Als Temperatur wird 15,04°C angezeigt, das ist NICHT das 100fache von 0,28°

    2. Frage: wie erfolgt hier die Umrechnung???

    Danke für eure Hilfe!

    Uwe
    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

    #2
    Ohne das jetzt nachzuprüfen ob sich dabei um sowas handelt:
    es gib da einen (IMHO ziemlich lustigen oder kranken - je nach Tageszeit) EIS5
    das ist nach einem Mathe-Leistungskurs (den ich dummerweise verpasst habe) sicher alles ganz übersichtlich aber wenn man "Mantisse" so wie ich eher für einen Unterart der Mantelrochen hält kann das ganz schön nerven
    Nachdem ich kürzlich dazu eine Stoffsammlung erstellt habe, ohne mich dafür zu interessieren was zum Henker Mantissen sind und warum man in 2 Byte nicht einfach den Wert mit Vorzeichen reinschreiben kann oder halt gigantische 4 Byte nehmen kann

    Das hier uvm bei der Suche nach EIS5 in Excel

    In Perl gibts auch was, suche misterhouse + eis5

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Hallo Makki,

      da geht es Dir wie mir....

      Also die Excel-Formel liefert so wie die ETS einmal 0,28 und einmal 15,04. Hab zwar noch nicht verstanden, warum, aber da werd ich wohl die Konnex-Doku zu den Datentypen noch mal studieren.

      Heißt für mich aber, dass die Funktion "Multipliziere mit 100" völliger Quatsch ist, weil dass durch die "Mantissen-Codierung" zu unbrauchbaren Werten führt, wenn einfach nur die Rohdaten multipliziert werden.
      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

      Kommentar


        #4
        ok, hab's verstanden. 2-Byte Werte könne (u. a.) "signed value" (-32.768 bis +32.767), "unsigend value" (0 bis 65.535) oder "float" (-671.088,64 bis +670.760,96) sein. Bei "signed" und "unsigend" ist der Wert "normal" als Hex-Zahl gespeichert, bei "float" sind ein paar Bits die Mantisse und ein paar Bits der Exponent, also einfach ein x hoch y, wobei die Basis als 0,01 definiert ist, also 0,01 mal Mantisse hoch Exponent.

        Zu meinem Beispiel:

        bei "00 1C" sind nur Bits der Mantisse auf 1

        bei "0A F0" sind auch Bits vom Exponent auf 1, daher kommt da plötzlich ein völlig anderes Ergebnis raus und nicht das 100fache von "00 1C".

        => was nicht ganz logisch ist: im ersten Fall ist der Exponent eigentlich 0, was als Ergbnis immer 1 liefern müsste, das Ergbnis ist aber so, als ob der Exponent 1 wäre?!

        was ich nicht wusste: Wenn ich in der ETS als DPT "Temperatur in °C" auswähle, interpretiert die ETS das autoamtsich als "float", ich dachte es gibt auch einen "signed value als °C", aber das ist wohl nicht definiert.

        Lehre: wenn ich einen Wert als "signed Value" auf den Bus schicke, kann ich ihn nicht als Temperatur interpretieren, dazu muss ich ihn als "float" schicken!
        ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

        Kommentar


          #5
          Hallo Uwe,
          versuchs doch mal mit (mantisse *0.01) * 2 ^Exponent,
          Mantisse 11Bit, dann 4 Bit exponent, dann Vorzeichen der mantisse.
          Die Mantisse ist im 2erKomplement gespeichert,
          Der Exponent geht von 0..15.

          2 hoch 0 ist 1.

          Grüsse von Gamma!
          Never stop thinkin´

          Kommentar


            #6
            Hallo Gamma,

            so auf die Schnelle kann ich Dir glaube ich nicht folgen...

            2 hoch 0 ist 1.
            Richtig, so wie 3 hoch 0 und 4 hoch 0 auch 1 ist weil alles hoch 0 1 ist, oder?

            (mantisse *0.01) * 2 ^Exponent
            ok, das *2 hab ich "unterschlagen"? Aber trotzdem ist doch jede Wert hoch 0 1, oder? Und bei Hex "00 1C" hab ich bin "00000000 00011100". Der Exponent sind die Bits 2-5 vom "linken" Byte, also 0, demzufolge müsste nach meinem Verstandis die Rohdaten "00 1C" bei Interpretation als "float" (9.001) eine 1 ergeben (28*0,01*2 hoch 0= arrrrggghhh!!!!
            Jetzt wo ich die Formel mal richtig aufschreibe wird's klar, ich hab "Punkt vor Strich" nicht beachtet:

            (28*0,01) * (2^0) => die letzte Klammer nur zur Verdeutlichung, wo mein Fehler lag!
            (0,28) * (1)
            =0,28
            Sprich es wird nicht "hoch 0" sonder "mal 2 hoch 0" gerechnet.

            Ok, jetzt erlaube ich mir mal den Spaß und rechne die "0A F0" per Hand nach. In bin ist das 00001010 11110000, damit haben wir einen Exponnet "0001"=1 und eine Mantisse "01011110000"=752, ergibt:
            (752*0,01) * 2^1
            7,52 * 2
            =15,04

            Passt!

            Danke!
            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

            Kommentar


              #7
              Ich möchte das Thema EIS5 und perl nochmal aufwärmen. Ich habe verschiedene Temperaturen im float Format, die nicht aus dem EIB kommen, die ich aber auf den Bus schicken will.

              Ich nutze mistereib und habe daher die EIB5 Klasse in perl zu Verfügung, aber ich komme damit mangels tiefer perl Kenntnisse nicht zurecht. Kann mir vielleicht jemand Hilfestellung leisten, wie ich die encode (und vielleicht auch decode) Methoden in meinem perl code (der als deamon ausserhalb von mistereib arbeitet) nutzen kann? Ich bin auch für jeden Hinweis dankbar, wie das ohne die EIB5 Klasse funktioniert.

              Vielen Dank!
              Gruss Boxerfahrer

              Kommentar


                #8
                Bis auf die leicht geänderte (ohne den Fehler bei Werten unter -20,47) kann ich Dir auch nur folgendes anbieten:

                Code:
                sub encode_dpt9 { # 2byte signed float
                    my $state = shift;
                    my $data;
                
                        my $sign = ($state <0 ? 0x8000 : 0);
                    my $exp  = 0;
                    my $mant = 0;
                
                    $mant = int($state * 100.0);
                    while (abs($mant) > 2047) {
                        $mant /= 2;
                        $exp++;
                    }
                    $data = $sign | ($exp << 11) | ($mant & 0x07ff);
                    return $data >> 8, $data & 0xff;
                }
                Zahl rein, die zwei bytes auf den Bus raus, fertig.
                Den ganzen Topf mit Spaghetticode - garantiert frei von OO&Klassen - gibts hier (in der sub knx_write sollten die 4 Zeilen zu finden sein, das dann auch via eibd rauszubringen)

                Makki
                EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                -> Bitte KEINE PNs!

                Kommentar


                  #9
                  Makki, herzlichen Dank. Werde ich ausprobieren.

                  Ich habe mir den Link angeschaut - eine decode Funktion für EIS5/dpt9 habe ich nicht gefunden. Hast Du da noch was in der Schatztruhe ?

                  EDIT - sorry, gefunden, hatte Tomaten vor den Augen

                  - boxerfahrer

                  Kommentar


                    #10
                    Hallo Makki,

                    dekodieren funktioniert prima, mit dem encodieren von floats habe ich aber Probleme - vermutlich wegen meiner beschränkten Programmierkenntnisse.

                    Ich nutze die encode_dpt9 Routine aus Deinem Link. Wenn ich mit einem formatierten Float die Funktion aufrufe:

                    Code:
                    $log_value_dec = sprintf "%2.1F", $temperature;
                    $log_value_hex = encode_dpt9($log_value_dec);
                    dann kommt bei einer Temperatur von 7.5° aus der Routine eine "238" zurück statt der erwarteten "02EE" (tapko tools).
                    Ich kann mir jetzt mit meinen beschränkten perl Kenntnissen nur vorstellen, dass ich keine 2 byte beim Aufruf übergebe.

                    Ich wäre für jede Hilfe dankbar
                    - boxerfahrer

                    Kommentar


                      #11
                      Poste bitte mal den ganzen Code vom Aufruf bis zum schreiben auf den KNX.
                      Programmieren kann ich auch nicht, weiss aber das Perl für aussenstehende wie mich teils ziemlich braindead erscheint

                      (Jemand der das wirklich kapiert könnte das mit den Skalars usw jetzt auch erklären aber ich vermute wo der Fehler liegt: encode_dpt9 liefert zwei Byte zurück, Du packst das in eine "Variable" [ich nenne es mal laienhaft so, weil das ist einer der Punkte die ich bei Perl nie verstehen werden - ref,skalar,array,...])

                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        Makki, ich hab's, dank Deiner Hilfe. Nachdem ich im Aufruf ein Feld genutzt habe
                        Code:
                        @byte_result = encode_dpt9($log_value_dec);
                        und die 2 Bytes jeweils mit sprintf in Hex Werte umgewandelt habe klappte es endlich.
                        Herzlichen Dank für Deine Hilfe!

                        - boxerfahrer

                        Kommentar


                          #13
                          Na denn..
                          Genau diese sch*****, das dann noch \@{ / $_[0] oder %{$}{hurz}[0] davor muss, versuche ich in den WG-Plugins übrigens zu vermeiden, weil es eh keiner - mir inkl. - versteht
                          Perl hat in dem Bereich IMHO nicht gerade seine Stärke, weil man 2 Bytes aus einer Funktion eben auch in einen String schreiben kann..
                          Ist zwar einfach und in der universitären Megarelationalen-OO-Welt bestimmt auch alles ganz wertvoll, führt aber nicht unbedingt zu dem was man als normaldenkender so erwartet

                          Makki
                          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                          -> Bitte KEINE PNs!

                          Kommentar


                            #14
                            Zitat von boxerfahrer Beitrag anzeigen
                            Ich möchte das Thema EIS5 und perl nochmal aufwärmen. Ich habe verschiedene Temperaturen im float Format, die nicht aus dem EIB kommen, die ich aber auf den Bus schicken will.

                            Ich nutze mistereib und habe daher die EIB5 Klasse in perl zu Verfügung, aber ich komme damit mangels tiefer perl Kenntnisse nicht zurecht. Kann mir vielleicht jemand Hilfestellung leisten, wie ich die encode (und vielleicht auch decode) Methoden in meinem perl code (der als deamon ausserhalb von mistereib arbeitet) nutzen kann? Ich bin auch für jeden Hinweis dankbar, wie das ohne die EIB5 Klasse funktioniert.

                            Vielen Dank!
                            Gruss Boxerfahrer
                            Hallo boxerfahrer,

                            wieso lässt du nicht mistereib das externe Skript als Usercode ausführen?
                            Du kriegst die Sachen dann wie folgt auf den Bus:

                            $MeinEIB5Objekt->set($externerWert)

                            auslesen kannst du wieder so:

                            $wert = $MeinEIB5Objekt->state();

                            Gruß,
                            thoern

                            Kommentar


                              #15
                              Hallo thoern,

                              ... freue mich über Deine Antwort. ich bin mit dem mistereib weiterhin zugange und nutze auch die 0.84 alpha Version - den Thread habe ich nicht vergessen :-)

                              ... weil ich keine Ahnung von UserCode habe :-)
                              Ich habe ein perl script, das alle 5 Minuten Daten aus meiner Wärmepumpe ausliest und auf den Bus schreiben soll. Das mache ich derzeit über einen crontab-Eintrag. Wie wird den mistereib UserCode abgearbeitet? Muss ich in einer Endlosschleife mit sleep arbeiten? Ich würde das schon gerne umstellen, weil ich auch noch weitere Datentypen aus der WP bekomme, für die ich noch keine EIS Kodierung habe. Die könnte mir mistereib wohl abnehmen.

                              Viele Grüße
                              - boxerfahrer

                              Kommentar

                              Lädt...
                              X