Autor Thema: Ungenauigkeit in der dpt9-Encodierung  (Gelesen 3617 mal)

Yogi221

  • Gast
Ungenauigkeit in der dpt9-Encodierung
« am: 31 Dezember 2013, 16:01:26 »
Hallo,

dies ist mein erster Post.
Daher erst Mal vielen Dank an alle, die zum guten Funktionieren von FHEM beigetragen haben!

Heute habe ich versucht, meine EIB-Thermostate von FHEM aus zu verstellen. Dabei ist mir aufgefallen, dass das Senden von dpt9-Werten eine Ungenauigkeit aufweist. Die Empfangs(Parse)-Routine für dpt9-Werte ist OK.

Das Senden von z.B 23.5 führt zu folgendem Output im Log(5):
EIB dpt9 encode 23.5 = 8338.875 sign: 1 mant: 146.875 exp: 4 translated: 002092Die ETS3 zeigt dafür 23.36 an.
Das rückwärts Parsen des gesendeten dpt9-Wertes 002092 im EIB-Modul ist deckungsgleich mit der ETS3:
EIB dpt9 parse 002092 = 8338 sign: 1 mant: 146 exp: 4 translated: 23.36
Eigentlich sollte aber ja 23.5 gesendet werden...

Im Netz habe ich eine genauere dpt9-Encodierung gefunden und lokal ins EIB-Modul eingebaut:
...
elsif($code eq "dpt9")
{
$transval = sprintf("00%.4x",encode_dpt9($value));
Log(5,"EIB $code encode $value translated: $transval");
}
...
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
}
...

Damit ist die Ausgabe des FHEM-EIB-Moduls deckungsgleich mit der ETS-Gruppenmonitor-Anzeige:
Das Senden von z.B 23.5 führt nach der oben beschriebenen lokalen Änderung im EIB-Modul zu folgendem Output im Log:
EIB dpt9 encode 23.5 translated: 000c97Die ETS3 zeigt dafür auch 23.5 an.
Das rückwärts Parsen des gesendeten dpt9-Wertes 000c97 im EIB-Modul ist deckungsgleich mit der ETS3:
EIB dpt9 parse 000c97 = 3223 sign: 1 mant: 1175 exp: 1 translated: 23.5
Kann das bitte jemand versuchen nachzustellen und gegebenenfalls im EIB-Modul korrigieren?

Danke und viele Grüße
Jochen

stefan.struhs

  • Gast
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #1 am: 04 Januar 2014, 14:24:49 »
Gleiche Beobachtung hier; vorgeschlagener Fix funzt (allerdings habe ich den Code direkt eingebunden, um den bisherigen Stil beizubehalten).

Offline aliate

  • Jr. Member
  • **
  • Beiträge: 73
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #2 am: 23 Januar 2015, 07:02:48 »
Guten Morgen Zusammen,
der Beitrag ist zwar schon etwas älter, aber der Sachverhalt ist noch aktuell.

Nun zu meiner Frage: Kann man den Fix von Jochen einfach in die Datei 10_EIB.pm kopieren? Muss hier ein bestehender Eintrag ersetzt werden? Zeile/Stelle innerhalb der Datei egal?

Vielen Dank

Gruß
Hermann

Yogi221

  • Gast
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #3 am: 24 Januar 2015, 23:32:33 »
Hallo Hermann,

Du musst nach elsif($code eq "dpt9") suchen und den Abschnitt durch den von mir angegebenen ersetzen.
Die Unterfunktion encode_dpt9 kopierst Du am besten oberhalb der Unterfunktion EIB_EncodeByDatapointType rein.

Mach Dir aber von Deiner geänderten 10_EIB.pm eine Kopie - sonst ist sie verloren, falls es mal ein EIB-Update gibt.

Gruß
Jochen

Offline aliate

  • Jr. Member
  • **
  • Beiträge: 73
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #4 am: 25 Januar 2015, 16:58:28 »
Servus Jochen,

vielen Dank, habe es (beim zweiten Mal) hinbekommen ;)
Gibt es eine Möglichkeit die Temperaturanzeige, also die Ist-Werte die mir der Taster an der Wand liefert, mit nur einer Dezimalstelle anzeigen zu lassen? Fhem zeigt mir ja hier die Temperatur mit zwei Dezimalstellen an. Wäre nur ein rein optischer Wunsch :)

Aber nochmal zurück zu Deinem Fix. Möchte nur noch kurz etwas ergänzen. Hilft vielleicht dem ein oder anderen Anfänger weiter (so wie mir :D ).
In der Datei 10_EIB.pm gibt es zweimal den Eintrag elsif ($code eq "dpt9") einmal unter sub EIB_EncodeByDatapointType ($$$) und ein zweites Mal unter sub EIB_ParseByDatapointType ($$$)
Der zweite Eintrag interessiert nicht und wird auch nicht geändert. Beim ersten wird der Inhalt mit dem Code von Jochen $transval = sprintf("00%.4x",encode_dpt9($value));
Log(5,"EIB $code encode $value translated: $transval");
ersetzt.

Der zweite Teil von Jochens Code wird z.B. Einfach über sub EIB_EncodeDatapointType ($$$) eingefügt. Wobei das wahrscheinlich egal wäre wo es genau steht.

Hoffe ich schreib nichts falsches :D

Danke und Gruß

Hermann

Offline Xcoder

  • Jr. Member
  • **
  • Beiträge: 64
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #5 am: 30 Mai 2015, 13:27:11 »
Hallo,
Sehe ich das richtig, dass dieser Fix noch nicht eingeflossen ist? Was ist der Grund?
Gruss, Xcoder

Offline aliate

  • Jr. Member
  • **
  • Beiträge: 73
Antw:Ungenauigkeit in der dpt9-Encodierung
« Antwort #6 am: 30 Mai 2015, 13:30:45 »
Hallo,
Sehe ich das richtig, dass dieser Fix noch nicht eingeflossen ist? Was ist der Grund?
Gruss, Xcoder
Nein, andi hat das EIB Modul umfassend geupdated.
« Letzte Änderung: 30 Mai 2015, 13:33:38 von aliate »