FHEM Forum

FHEM - Hausautomations-Systeme => KNX/EIB => Thema gestartet von: Yogi221 am 31 Dezember 2013, 16:01:26

Titel: Ungenauigkeit in der dpt9-Encodierung
Beitrag von: Yogi221 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: 002092
Die 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: 000c97
Die 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
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: stefan.struhs 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).
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: aliate 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
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: Yogi221 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
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: aliate 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
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: Xcoder 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
Titel: Antw:Ungenauigkeit in der dpt9-Encodierung
Beitrag von: aliate am 30 Mai 2015, 13:30:45
Zitat von: Xcoder 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
Nein, andi hat das EIB Modul umfassend geupdated.