Raumtemperatur von Gira 3fach plus und 5fach plus abfragen

Begonnen von NehCoy, 13 Januar 2014, 14:55:44

Vorheriges Thema - Nächstes Thema

NehCoy

Hallo zusammen!

Haben eben diesen Beitrag http://forum.fhem.de/index.php/topic,16092.0.html im Forum gefunden.
Kann man auch die Ist- und Soll-Temperatur von 3fach plus und 5fach plus KNX-Tastern von Gira abfragen?
Wäre es sogar möglich die Soll-Temperatur über den Bus zu ändern?
Falls ja: Wie? Gibt es dafür Anleitungen?

Vielen Dank für eure Hilfe!

Viele Grüße
Neh Coy

mrabdip

Hallo,

an diesem Thema war ich vor kurzem auch dran. Als erstes muss im Tastsensor eine Gruppenadresse für die Ist-Temperatur festgelegt werden (ETS-Software). Dann kann man dort definieren, dass die Temperatur alle n-Minuten auf den Bus gesendet wird, sowie bei n-Kelvin Temperaturänderung. Alternativ kann aus FHEM mit get die Gruppenadresse abgefragt werden.

Temperaturänderung geht auch. Dazu wird eine Gruppenadresse für die Solltemperatut erstellt (ETS). Dann muss das Beschreiben über den Bus zugelassen werden.
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

NehCoy

Hallo mrabdip!

Vielen Dank für deine Antwort!
Mit anderen Worten:

  • Programmierungen des 3fach plus und 5fach plus Tastsensors zum automatischen Versenden der Temperatur
    => benötigte ETS
    => Schlecht für mich, da ich ETS nicht habe, sondern mein Elektriker
  • Mit dem Befehl "get", der vom FHEM an den jeweiligen Sensor gesendet wird, die Temperatur abfragen
    => benötigt kein ETS
    => wohl meine Option, wenn ich soweit bin!

Kann man dann auch mit "set" eine neue Raumtemperatur vorgeben!?

mrabdip

Vorraussetzung, dass die Ist-Temperatur ausgelesen werden kann, ist die Verbindung mit einer EIB-Gruppenadressse. Ob der Elektriker eine vergeben  hat, muss man erst herausfinden/fragen. Wenn ja, kann meines Wissens die Temperatur abgefragt werden. Ich hab es bei mir so eingestellt, dass die Temperatur zyklisch gesendet wird.
Setzen der Solltemperatur müsste mit set funktionieren - wenn eine Gruppenadresse vorhanden ist. Allerdings erwartet der Sensor einen der Temperatur entsprechenden HEX-Wert. Da bin ich auch noch am tüfteln.
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

NehCoy

Okay, dann muss ich mal mit dem Elektriker reden.

Der Tastsensor erwartet einen Hex-Wert?
Vermutlich ist das Problem, dass du nicht weißt, HEX-Codiert übertragen wird, oder?
Bei 4 Byte und der Tatsache, das man Zehntelgrad einstellen kann, sage ich aus dem Bauchgefühl "float".
2 Byte (also vier Hex-Werte) würden bei Raumtemperatur auch locker reichen (1 Byte Raumtemperatur Grad, 1 Byte Zehntelgrad).
Und da für Zehtnelgrad sogar ein Nibble, also 4 Bits ausreichen, könnte man das sogar noch auf 3 HEX-Werte reduzieren.

mrabdip

Sorry, bin noch nicht dazugekommen. Werde das mal austesten.
Fhem 5.8 auf Raspberry 3, KNX-Vollinstallation, Weinzierl-IP/KNX-Interface über KNXD, USB-RFXTRX, Youless110, SmartPI2, IP-Cams, FritzBox/DECT200, Tablet UI

NehCoy

Kein Stress... Habe Zeit.
Das heißt: Eigentlich habe ich recht wenig freie Zeit, von daher komme ich nicht so dazu "zu basteln", wie ich es gerne möchte.
Aber du kannst dir Zeit lassen und keinen Stress machen. ;)

NehCoy

#7
Hi!

Ich (glaube ich) habe die Lösung gefunden:
ZitatDPT 9.001 DPT_Value_Temp is a 2-octet float value.
The format is MEEEEMMM MMMM MMMM (16 bits). The value is then 0,01 x M x 2^E. The mantissa (M) is coded two's complement.
If I calculated correctly, $193D is 25,36 °C.

In Einzelschritten und händisch rechnet sich das also so:
0x193D  = 0b 0001 1001 0011 1101
M EEEE MMMMMMMMMMM
0 0011 00100111101

E = 0011 = 3
M = 0 0100111101 = 317

0,01 * M * 2^Ê=
0,01 * 317 * 2 ^ 3 =
0,01* 317 * 8 = 25,36

In C#-Code  steht nun bei mir das:
                    Int16 E, M;
                    double temperature;
                    value = Convert.ToInt16(textBox_value.Text, 16);
                    E = (Int16)(value & 0x7800);
                    E >>= 11;
                    M = (Int16)(value & ~0x7800);
                    temperature = 0.01 * M * Math.Pow(2, (double)E);
                    label_float_temp.Text = temperature.ToString() + "°C";


Scheint also zu passen!
Man muss nur bei negativen Temperaturen auf das Zweierkomplement achten.
Siehe: http://de.wikipedia.org/wiki/Zweierkomplement

In C würde ich das ganze so schreiben (ungetestet):
                    int16_t E, M;
                    float temperature;
                    /* value = ConvertToInt16(&ascii[pos]); */ /*<< Konvertierung über eine eigene Funktion eines ASCII Datenstroms bestehend aus HEX Zeichen in ein 16bit Integer*/
                    /* value = (int)strtol(&ascii[pos], NULL, 16); */ /*<< Konvertierung mit strtol-Funktion eines ASCII Datenstroms bestehend aus HEX Zeichen in ein 16bit Integer*/
                    E = value & 0x7800;
                    E >>= 11;
                    M = value & ~0x7800;
                    temperature = 0.01 * M *(1 << E);


Viele Grüße
NehCoy


P.S.:
Die Maske 0x7800 kommt daher:
MEEE EMMM MMMM MMMM
0111 1000 0000 0000
  7    8    0    0