Hallo zusammen!
Haben eben diesen Beitrag http://forum.fhem.de/index.php/topic,16092.0.html (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
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.
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!?
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.
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.
Sorry, bin noch nicht dazugekommen. Werde das mal austesten.
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. ;)
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