OpenTherm über OTGW + LAN RS232 Adater

Hallo,

Vieleicht ist ja jemand an einer Lösung zur einbindung von OpenTherm in IPS interesiert.
Ich löse das über das OTGW von Nodo mit dem Ethernet Modul (RS232 TTL zu LAN) USR-TCP232-T2.
Bei mir Läuft das Ganze an einer Brötje WGB20.2 mit einem QAA73 Raumregler

In IPS habe ich einen Client Socket angelegt und eine Registervariable die mein Script zur auswertung Aufruft

Hier findet man die Comandos
Firmware for the OpenTherm Gateway

Es funktionieren aber auch nur die vom Gerät unterstützten.
Dazu mal zwei Beispiel diese nutze ich momentan quick and dirty in anderen Skripten
//Hier kann ich dei Warmwasserbereitung aktivieren oder Deaktivieren

$Message = "HW=1";  //Warmwasser ein   HW=0 Warmwasser aus
RegVar_SendText(23321, "".$Message."".chr(0x0D).chr(0x0A));

//Hier kann ich meine wunschsollwert für den Heizkreis vorgeben

$Message = "CS=13";//Sollwert Rücklauf   (CS=0 gibt die deaktiviert das überschreiben)
 RegVar_SendText(23321, "".$Message."".chr(0x0D).chr(0x0A));

Hier mein Script zur auswertung der MSG

<?
$buf = $_IPS['VALUE'];

$OpenThermMsg = $buf ; 
$temp = substr($OpenThermMsg, 0, 1);
$OpenTherm = substr($OpenThermMsg, 3, 2);
$OpenTherm = $temp .= $OpenTherm;

$OpenThermDec = hexdec(substr($OpenThermMsg, 5, 4));

IF ($OpenTherm === "B1A") 
{
		//Boiler Temeratur
    	$BoilerTemp = ($OpenThermDec / 256.0);
		SetValue(51604, $BoilerTemp);
}
ELSEIF ($OpenTherm === "B1C")
{ 
		//Rücklauf Temperatur Therme
   		$RuecklaufTemp = ($OpenThermDec / 256.0);
        SetValue(55974, $RuecklaufTemp); 
}
ELSEIF ($OpenTherm === "B19")
{ 
		//Vorlauf Temperatur Therme
   		$VorlaufTemp = ($OpenThermDec / 256.0);
        SetValue(13307, $VorlaufTemp); 
}
ELSEIF ($OpenTherm === "B1B")
{ 
		//Aussen Temperatur Zusätzlich auf negative werte reagieren da sonst nur Positive werte angezeigt werden

        IF ($OpenThermDec >> 15)
        {
             
        $AussenTemp = (((65536 - $OpenThermDec) / 256) * -1);  
        }
        else
        { 
        $AussenTemp = ($OpenThermDec / 256.0);
        }


        SetValue(15564, $AussenTemp); 
}
ELSEIF ($OpenTherm === "B11")
{ 
		//Modulation
   		$Modulation = ($OpenThermDec / 256.0);
        SetValue(49125, $Modulation); 
}
ELSEIF ($OpenTherm === "B38")
{ 
		//Sollwert Warmwasser
   		$SollWaterTemp = ($OpenThermDec / 256.0);
        SetValue(23029, $SollWaterTemp); 
}
ELSEIF ($OpenTherm === "B01")
{ 
		//Sollwert Warmwasser
   		$Setpoint = ($OpenThermDec / 256.0);
        SetValue(10660, $Setpoint); 
}
ELSEIF ($OpenTherm === "B10")
{ 
		//Sollwert Raum
   		$RoomSetpoint = ($OpenThermDec / 256.0);
        SetValue(41844, $RoomSetpoint); 
}
ELSEIF ($OpenTherm === "B00")
{ 
		//Status aus den einzelnden BIT´s auswerten
   		$ThermeStatus = decbin($OpenThermDec);
		$ThermeStatus = str_pad($ThermeStatus,  16, '0', STR_PAD_LEFT);  
		$bitArray = str_split($ThermeStatus);
		
		SetValue(29464, $bitArray[7]);
		SetValue(31232, $bitArray[6]);
		SetValue(44719, $bitArray[15]);
		SetValue(58869, $bitArray[14]);
		SetValue(20427, $bitArray[13]);
		SetValue(29165, $bitArray[12]);		
}	
?>

Liste der Möglichen Messages unterscheidet sich aber von Gerät zu Gerät

[ol]
[li]Status (MsgID=0) - Printed as two 8-bit bitfields
[/li][li]Control setpoint (MsgID=1) - Printed as a floating point value
[/li][li]Remote parameter flags (MsgID= 6) - Printed as two 8-bit bitfields
[/li][li]Maximum relative modulation level (MsgID=14) - Printed as a floating point value
[/li][li]Boiler capacity and modulation limits (MsgID=15) - Printed as two bytes
[/li][li]Room Setpoint (MsgID=16) - Printed as a floating point value
[/li][li]Relative modulation level (MsgID=17) - Printed as a floating point value
[/li][li]CH water pressure (MsgID=18) - Printed as a floating point value
[/li][li]Room temperature (MsgID=24) - Printed as a floating point value
[/li][li]Boiler water temperature (MsgID=25) - Printed as a floating point value
[/li][li]DHW temperature (MsgID=26) - Printed as a floating point value
[/li][li]Outside temperature (MsgID=27) - Printed as a floating point value
[/li][li]Return water temperature (MsgID=28) - Printed as a floating point value
[/li][li]DHW setpoint boundaries (MsgID=48) - Printed as two bytes
[/li][li]Max CH setpoint boundaries (MsgID=49) - Printed as two bytes
[/li][li]DHW setpoint (MsgID=56) - Printed as a floating point value
[/li][li]Max CH water setpoint (MsgID=57) - Printed as a floating point value
[/li][li]Burner starts (MsgID=116) - Printed as a decimal value
[/li][li]CH pump starts (MsgID=117) - Printed as a decimal value
[/li][li]DHW pump/valve starts (MsgID=118) - Printed as a decimal value
[/li][li]DHW burner starts (MsgID=119) - Printed as a decimal value
[/li][li]Burner operation hours (MsgID=120) - Printed as a decimal value
[/li][li]CH pump operation hours (MsgID=121) - Printed as a decimal value
[/li][li]DHW pump/valve operation hours (MsgID=122) - Printed as a decimal value
[/li][li]DHW burner operation hours (MsgID=123) - Printed as a decimal value
[/li][/ol]

Vieleicht findet sich ja sogar jemand der das in ein PHP Modul verpaken könnet.

mfg
KingPin