Zehnder ComfoAir 350 über RS232 anbinden

Hi,
vielleicht könnt ihr mir weiterhelfen. Ich versuche erfolglos meine Lüftungsanlage anzusprechen. Wie kann ich testen, dass die Kommunikation mit der Lüftungsanlage richtig funktioniert? Ich habe mal testweise mit dem Programm ComfoPC „gespielt“. Aber ich werde aus den Rückmeldungen nicht schlau.

In IP-Symcon habe ich die Variablen und die Programme wie in der Anleitung angelegt und mit den richtigen IDs angepasst. Wass jetzt noch fehlt sind die Updateskripte. Den Schreenshot konnte ich nicht anschauen, weil es Google+ nicht mehr gibt.

Hat jemand zufällig ein fertiges Modul, was ich verwenden kann oder kann mir die Updateskripte schicken? Habe bis jetzt noch nicht allzuviel in IP-Symcon gemacht.

Danke für Eure Hilfe
Grüße
Symbuddy

Hallo PreinfalkG,

erstmal Danke für Deine klasse Vorarbeit und Bereitstellung der Scripte.
Leider sind die WebFront Screenshots nicht mehr online.

Hast Du oder jemand anderes die Möglichkeit diese nochmal online zu stellen ?
Auch ein Script-Export aus IPS mit dem super Tool von Raketenschnecke ( https://www.raketenschnecke.net/rs-projekte/rs-ips-project-exporter/) würde allen das mühselige Anlegen der einzelnen Variablen + Austauschen der ID’s sparen.

Für die Mühe vielen Dank im voraus !

Das wäre super, habe es immer noch nicht zum Laufen bekommen

Ich würde mich auch noch immer über SCRIPTE für die REGVAR freuen. Ich habe (so hoffe ich) HEX-Zeichen, die ich über die RS232 empfange im DEBUG. Ob die OK sind kann ich nicht sagen. Ein Script, welches ich hinter meine REGVAR hängen könnte würde mir MEGA helfen um wieder ins Thema einzusteigen.

DANKE

Ich hoffe der THREAD lässt sich wiederbeleben und es gibt jemanden, der die SCRIPTE noch in Betrieb hat und mir zukommen lassen könnte ???

Hallo,
ich bin jetzt auch mal, nach über 10 Jahren, auf die glorreiche Idee gekommen, die ComfoAir 350 einzubinden.
Hab mir einen Serial zu Wlan Adapter besorgt und den auch so weit eingebunden. Die Daten kommen also schon mal an und landen auch im Cutter, aber dort bleiben sie dann im Buffer.
Ich vermute, ich muss dort die richtigen Trennzeichen eingeben. Bevor ich das Rad neu erfinde und die Scripte alle neu schreibe, dachte ich, ich frage mal nach ob die hier vielleicht nochmal gepostet werden könnten. Ich finde hier nur links zu externen Quellen, die leider nicht mehr funktionieren.
Dazu passend dann vielleicht auch die Konfiguration des Cutters.
Ich hoffe hier ist nach so langer Zeit noch jemand aktiv :wink: .

Gruß
Smudo

Morgen,

ich versuchs mal (bei mir läuft es noch (problemlos)):
Der Cutter:

Hier mein auslesescript:

<?php
// *****************************************************************************
//
// *****************************************************************************
// ** Stand: 25.05.2016 9:35Uhr                                    **
// *****************************************************************************

Include('ComfoAir.ips.php'); // 	Funktionen für ComfoAir-Auslesung inkludieren

$IDRegVar=26492;
//			SendCommandTCP(array(0x00,0xDB),array(1,0,0,0),$IDRegVar); // Reset der Fehlermeldungen
//			return;
/*
Sonstige wichteige Steuerkommandos:
//			SendCommandTCP(array(0x00,0xDB),array(0,0,0,1),$IDRegVar); // Reset des Filters
//			SendCommandTCP(array(0x00,0xDB),array(1,0,0,0),$IDRegVar); // Reset der Fehlermeldungen
//			SendCommandTCP(array(0x00,0xDB),array(0,1,0,0),$IDRegVar); // CAVE komplett Reset möglichst NIE unbedacht !!!!!
//			SendCommandTCP(array(0x00,0xDB),array(0,0,1,0),$IDRegVar); // Selbsttest
*/


/*
$IDcomPort=IPS_GetInstanceListByModuleID("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}")[0]; // ID des ComPortsSuchen

// Serialport öffnen (nur wenn geschlossen)
IPS_SetProperty ($IDcomPort, "Open", TRUE );
if(IPS_HasChanges($IDcomPort)) // nur wenn Konfig. der INstanz sich ändern würde ...
 {
 	$ok=@IPS_ApplyChanges($IDcomPort); // ... dann ändern
	If ($ok==FALSE) {SetValue(16900,"COM-Port nicht auslesebar!"); return;} else {SetValue(16900,"");}
/*	sleep(1);
 }
*/

if (IPS_GetInstance(13558)['InstanceStatus']<>102) // Wenn IO-Instanz fehlerhaft
 {
   Setvalue(33062,0);
	return;
 } else {Setvalue(33062,1);}


// ********************* Folgender Absatz reagiert auf Rückmeldung der ComfoAir über die RegisterVar 26492
if ($_IPS['SENDER'] == "RegisterVariable") {
        $RawData = $_IPS['VALUE'];  

        if(startsWith($RawData,"\x00\x9C"))                                //RS232 Modus
        {
                //echo "WRL :: RS232 Modus :: 0x00 0x9C";
 //               SetValueInteger(33879,GetValueInteger(33879)+1);
                Extract_C9C($RawData,27308);
        }
        else if(startsWith($RawData,"\x00\xCE"))                                //Ventilationssufe abrufen 
        {
                //echo "WRL :: Ventilationssufe :: 0x00 0xCE";
 //               SetValueInteger(31316,GetValueInteger(31316)+1);
                Extract_CCE($RawData,29424);

        }
        else if(startsWith($RawData,"\x00\xE0"))                                //Bypassregelung
        {
                //echo "WRL :: Bypassregelung :: 0x00 0xE0";
 //              SetValueInteger(17398,GetValueInteger(17398)+1);
                Extract_CE0($RawData,55491,16977,47643);
        }
        else if(startsWith($RawData,"\x00\xD2"))                                //Temperaturen abrufen 
        {
                //echo "WRL :: Temperaturen abrufen :: 0x00 0xD2";
 //               SetValueInteger(12079,GetValueInteger(12079)+1);
                Extract_CD2($RawData,11048,45812  );
        }
        else if(startsWith($RawData,"\x00\x98"))                        //Sensordaten 
        {
                //echo "WRL :: Sensordaten :: 0x00 0x98";
//                SetValueInteger(21927,GetValueInteger(21927)+1);
                Extract_C98($RawData,23216);
        }
        else if(startsWith($RawData,"\x00\xD6"))                                //Status abrufen 
        {
                echo "WRL :: Status abrufen :: ";
                Extract_CD5($RawData,38967);
        }
        else if(startsWith($RawData,"\x00\xDA"))                                //Störungen und Filterstatus abrufen
        {
                echo "WRL :: Störungen und Filterstatus abrufen :: ";
                Extract_CDA($RawData,50027,45968,16900);
        }
        else if(startsWith($RawData,"\x00\x68")) //Bootloader Version 
        {
                echo "WRL :: Bootloader Version :: ";
                Extract_C68($RawData,53470);
        }
        else if(startsWith($RawData,"\x00\x6A")) //Abfrage des Gerättytps 
        {
                echo "WRL :: Firmware Version :: ";
                Extract_C6A($RawData,58001);
        }
        else if(startsWith($RawData,"\x00\xA2")) //Abfrage Konnektorplatine 
        {
                echo "WRL :: Konnektorplatine :: ";
                Extract_CA2($RawData,58539);
        }
        else if(startsWith($RawData,"\x00\x04")) //Eingänge abrufen
        {
                echo "WRL :: Eing?nge abrufen :: ";
                Extract_C04($RawData,50121);
        }
        else if(startsWith($RawData,"\x00\x0C")) //Ventilatorstatus, Drehzahl und Stufe
        {
                echo "WRL :: Ventilatorstatus :: ";
                Extract_C0C($RawData,59110 ,25005,17864,24043,42133,56190);
        }
        else if(startsWith($RawData,"\x00\x0E")) //Klappenstatus 
        {
                echo "WRL :: Klappenstatus :: ";
                Extract_C0E($RawData,31479);
        }
        else if(startsWith($RawData,"\x00\x10")) //Temperaturstatus
        {
                echo "WRL :: Temperaturstatus :: ";
                Extract_C10($RawData,21743,23022,58578,25089);
        }
        else if(startsWith($RawData,"\x00\x12")) //Tastenstatus 
        {
                echo "WRL :: Tastenstatus :: ";
          //      Extract_C12($RawData,31671); //??????????????????????????
        }
        else if(startsWith($RawData,"\x00\x14")) //Analoge Eingänge
        {
                echo "WRL :: Analoge Eingaenge :: ";
                Extract_C14($RawData,51809);
        }
        else if(startsWith($RawData,"\x00\xCA")) //Zeitverzögerung
        {
                echo "WRL :: Zeitverzoegerung :: ";
                Extract_CCA($RawData,59802);
        }
        else if(startsWith($RawData,"\x00\xDE")) //Betriebsstunden 
        {
                echo "WRL :: Betriebsstunden :: ";
                Extract_CDE($RawData,39716,18586);
        }

//        SetValueInteger(42752,GetValueInteger(42752)+1);
}

// ********************* Folgender Absatz reagiert auf Manuelle aus dem WF
else if ($_IPS['SENDER'] == "WebFront") {

        if($_IPS['VARIABLE'] == 25005) { // Lüfterstufe per wahlschalter einstellen

                SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

                switch($_IPS['VALUE']) {
                case 0:
                        //SendCommand(array(0x00,0x99),array(0x01),$IDcomPort);
                        SendCommandTCP(array(0x00,0x99),array(0x01),$IDRegVar);
                        break;
                case 1:
                        // SendCommand(array(0x00,0x99),array(0x02),$IDcomPort);
                        SendCommandTCP(array(0x00,0x99),array(0x02),$IDRegVar);
                        break;
       			 case 2:
                        //SendCommand(array(0x00,0x99),array(0x03),$IDcomPort);
                        SendCommandTCP(array(0x00,0x99),array(0x03),$IDRegVar);
                        break;
        			case 3:
                        //SendCommand(array(0x00,0x99),array(0x04),$IDcomPort);
                        SendCommandTCP(array(0x00,0x99),array(0x04),$IDRegVar);
                        break;
        			default:
                        echo "Keine gueltige Stufe!";
//SendCommandTCP(array(0x00,0xDB),array(0x04),$IDRegVar);
                break;
                }
        }
        else if($_IPS['VARIABLE'] == 15222) {
                //Komfort Temperatur setzen
				 SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
				 switch($_IPS['VALUE'])
				 {
				  case 0:
						 $temp=GetValue(45812);
						 if ($temp>15) $temp=$temp-1;
						 Setvalue(45812,$temp);
						 IPS_SetVariableProfileAssociation("TempAuswahl2", 1, $temp." °C", "", 0xFFFFFF);
						 Setvalue($_IPS['VARIABLE'],1);
						 //SendCommand(array(0x00,0xD3),array(($temp+20)*2),$IDcomPort);
						 SendCommandTCP(array(0x00,0xD3),array(($temp+20)*2),$IDRegVar);
					  break;
				  case 2:
						 $temp=GetValue(45812);
						 if ($temp<24) $temp=$temp+1;
						 Setvalue(45812,$temp);
						 IPS_SetVariableProfileAssociation("TempAuswahl2", 1, $temp." °C", "", 0xFFFFFF);
						 Setvalue($_IPS['VARIABLE'],1);
						 //SendCommand(array(0x00,0xD3),array(($temp+20)*2),$IDcomPort);
						 SendCommandTCP(array(0x00,0xD3),array(($temp+20)*2),$IDRegVar);
					  break;
				}
        }
} else {
        echo "only nix";
       }

?>

Und hier das includierte php-script:

<?

// Funktion ist nötig wenn Request via SeriellPort erfolgen soll
/*
function SendCommand($byteArr,$dataArr,$SerialPortID) {
                $request = CreateRequest($byteArr,$dataArr);
                $requestStr="";
                foreach($request as $byte) {
                        $requestStr = $requestStr . chr($byte);
                }
                COMPort_SendText($SerialPortID,$requestStr); 
                return $requestStr;
}
*/

// Funktion ist nötig wenn Request via LAN/TCP auf RS232- Adapter  erfolgen soll
function SendCommandTCP($byteArr,$dataArr,$IDRegVar) {
                $request = CreateRequest($byteArr,$dataArr);
                $requestStr="";
                foreach($request as $byte) {
                        $requestStr = $requestStr . chr($byte);
                }
				RegVar_SendText($IDRegVar,$requestStr);				
                return $requestStr;
}


function CreateRequest($byteArr,$dataArr) {
        if($dataArr == null)
                array_push($byteArr,0);
        else {
                array_push($byteArr,dechex(count($dataArr)));
                $byteArr = array_merge($byteArr,$dataArr);
        }
        $crc = CalcCRC($byteArr);
        array_push($byteArr,$crc);
        $byteArr = array_merge(array(0x07,0xF0),$byteArr);
        $byteArr = array_merge($byteArr,array(0x07,0x0F));
        return $byteArr;
}

// Bootloader Version abrufen
function Extract_C68($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                $Arr = array();
                if(count($dataArr) == 13) {
                   $Arr["Major"] = array_shift($dataArr);
                        $Arr["Minor"] = array_shift($dataArr);
                        $Arr["Beta"] = array_shift($dataArr);
                        $Arr["Geraetename"] = Arr2String($dataArr);
                } else {
                   $str = "Bootloader :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                //$Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);                                      
                return $str;
}

// Firmware Version abrufen
function Extract_C6A($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 13) {
                   $Arr["Major"] = array_shift($dataArr);
                        $Arr["Minor"] = array_shift($dataArr);
                        $Arr["Beta"] = array_shift($dataArr);
                        $Arr["Geraetename"] = Arr2String($dataArr);
                } else {
                   $str = "Bootloader :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                //$Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

// Konnektorplatine Version abrufen
function Extract_CA2($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 14) {
                   $Arr["Major"] = array_shift($dataArr);
                        $Arr["Minor"] = array_shift($dataArr);
                        $CCLuxeVer = array_pop($dataArr);
                        $CCEaseVer = array_pop($dataArr);
                        $Arr["Geraetename"] = Arr2String($dataArr);
                        
                        $CCEaseMajor = ($CCEaseVer & bindec('11110000')) >> 4;
                        $CCEaseMinor = $CCEaseVer & bindec('00001111');
                        $CCLuxeMajor = ($CCLuxeVer & bindec('11110000')) >> 4;
                        $CCLuxeMinor = $CCLuxeVer & bindec('00001111');
                        
                        $Arr["CC-Ease"] = $CCEaseMajor . "." . $CCEaseMinor;
                        $Arr["CC-Luxe"] = $CCLuxeMajor . "." . $CCLuxeMinor;
                } else {
                   $str = "Konnektorplatine :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                //$Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

// Eingänge abrufen                     
function Extract_C04($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                $Arr = array();
                if(count($dataArr) == 2) {
                        $Schalteingaenge = array_pop($dataArr);
                        $Stufenschalter = array_pop($dataArr);
                   $Arr["Stufenschalter-L1"] = $Stufenschalter & bindec('00000001');
                        $Arr["Stufenschalter-L2"] =  ($Stufenschalter & bindec('00000010')) >> 1;
                        $Arr["Schalteingang-Kueche"] =($Schalteingaenge & bindec('00000010')) >> 1;
                        $Arr["Schalteingang-Bad1"] =  $Schalteingaenge & bindec('00000001');
                        $Arr["Schalteingang-Bad2"] = ($Schalteingaenge & bindec('00010000')) >> 4;
                        $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                } else {
                   $str = "Eingänge :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Ventilatorstatus
function Extract_C0C($rawDataStr,$varID,$varIDstufe,$IDvHZuluft,$IDvHAbluft,$IDDZZuluft,$IDDZAbluft) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                $Arr = array();
                if(count($dataArr) == 6) {
						$Arr["Zuluft"] = array_shift($dataArr) ." %";
                        $Arr["Abluft"] =  array_shift($dataArr) ." %";
                        $Arr["Drehzahl-Zuluft"] = round(1875000 / ((array_shift($dataArr) * 255 + array_shift($dataArr)) -4),2) . " U/Min";
                        $Arr["Drehzahl-Abluft"] = round(1875000 / ((array_shift($dataArr) * 255 + array_shift($dataArr)) -4),2) . " U/Min";
						SetValue($IDvHZuluft,(int)$Arr["Zuluft"]);
						SetValue($IDvHAbluft,(int)$Arr["Abluft"]);
						SetValue($IDDZZuluft,(int)$Arr["Drehzahl-Zuluft"]);
						SetValue($IDDZAbluft,(int)$Arr["Drehzahl-Abluft"]);
						if ((int)$Arr["Zuluft"]==15) SetValue($varIDstufe,0);
						if ((int)$Arr["Zuluft"]==35) SetValue($varIDstufe,1);
						if ((int)$Arr["Zuluft"]==50) SetValue($varIDstufe,2);
						if ((int)$Arr["Zuluft"]==75) SetValue($varIDstufe,3);
                } else {
                   $str = "Eingaenge :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Klappenstatus                       
function Extract_C0E($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                $Arr = array();
                if(count($dataArr) == 4) {
                   $BypassInProzent = array_shift($dataArr) ." %";
                   $Arr["Bypass"] = $BypassInProzent;
                   $vorheizung = array_shift($dataArr);
                   $Arr["Vorheizung"] =   $vorheizung . " ";
                   switch($vorheizung) {
                                        case 0:
                                                $Arr["Vorheizung"] .=  " - Offen";
                                                break;
                                        case 1:
                                                $Arr["Vorheizung"] .=  " - Zu";
                                                break;
                                        case 2:
                                                $Arr["Vorheizung"] .=  " - Unbekannt";
                                                break;
                        }
                        $Arr["Motorstrom-Bypass"] = array_shift($dataArr);
                        $Arr["Motorstrom-Vorheizung"] = array_shift($dataArr);
                } else {
                   $str = "Klappenstatus :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Temperaturstatus abrufen                                             
function Extract_C10($rawDataStr,$ID_T1,$ID_T2,$ID_T3,$ID_T4) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                if(count($dataArr) == 4) {
                   SetValueFloat($ID_T1,array_shift($dataArr) / 2 - 20);
                   SetValueFloat($ID_T2,array_shift($dataArr) / 2 - 20);
                   SetValueFloat($ID_T3,array_shift($dataArr) / 2 - 20);
                   SetValueFloat($ID_T4,array_shift($dataArr) / 2 - 20);
                } else {
                        LogMsg(__FUNCTION__,"Temperaturstatus :: more then 4 Data Bytes received");
                }
                return $dataArr;
}

//Tastenstatus abrufen                      
function Extract_C12($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                $Arr = array();
                if(count($dataArr) == 1) {
                        $tastenStatus = array_shift($dataArr);
                   switch ($tastenStatus) {
                        case 0:
                                                $Arr["Taste"] =  "nichts gedrückt";
                                                break;
                                        case 255:
                                                $Arr["Taste"] =  "Fehler";
                                                break;
                                        default:
                                                $Arr["Taste"] =  $TastenStatus;
                                                break;
                   }
                } else {
                   $str = "Tastenstatus :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
               // $Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Analoge Eingänge abrfufen                       
function Extract_C14($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 4) {
                   $analog1 = array_shift($dataArr);
                        $analog2 = array_shift($dataArr);
                        $analog3 = array_shift($dataArr);
                        $analog4 = array_shift($dataArr);
                        $Arr["Analog-1"] = $analog1 . " :: " . number_format($analog1*10/255,2) . "V";
                        $Arr["Analog-2"] = $analog2 . " :: " . number_format($analog2*10/255,2) . "V";
                        $Arr["Analog-3"] = $analog3 . " :: " . number_format($analog3*10/255,2) . "V";
                        $Arr["Analog-4"] = $analog4 . " :: " . number_format($analog4*10/255,2) . "V";
                } else {
                   $str = "Analoge Eingaenge :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Sensordaten abrufen                       
function Extract_C98($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 17) {
                   $Arr["EnthalpieSensor-Temperatur"] = array_shift($dataArr) / 2 - 20 ." °C";
                        $Arr["EnthalpieSensor-Feuchtigkeit"] = array_shift($dataArr)." %";
                   $Arr["Analog-1"] = array_shift($dataArr) ." %";
                        $Arr["Analog-2"] = array_shift($dataArr)." %";
                        $Arr["Enthalpie-Koeffizient"] = array_shift($dataArr) ." %";
                        $Arr["Enthalpie-Time"] = array_shift($dataArr) * 12 . " min";
                        $Arr["0x00"] = array_shift($dataArr);
                        $Arr["Analog-1_ZuGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-1_AbGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-2_ZuGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-2_AbGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-3"] = array_shift($dataArr) ." %";
                        $Arr["Analog-4"] = array_shift($dataArr) ." %";
                        $Arr["Analog-3_ZuGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-3_AbGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-4_ZuGewuenscht"] = array_shift($dataArr) ." %";
                        $Arr["Analog-4_AbGewuenscht"] = array_shift($dataArr) ." %";
                } else {
                   $str = "Sensordaten :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        //LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//RS232 Modus                       
function Extract_C9C($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 1) {
                $data = array_shift($dataArr);
                        switch($data ) {
                           case 0:
                                        $Arr["RS232 Modus"] = "Ohne Verbindung";
                                        break;
                        case 1:
                                        $Arr["RS232 Modus"] = "Nur PC";
                                        break;
                        case 2:
                                        $Arr["RS232 Modus"] = "Nur CC-Ease";
                                        break;
                                 case 3:
                                        $Arr["RS232 Modus"] = "PC Master";
                                        break;
                        case 4:
                                        $Arr["RS232 Modus"] = "PC Logmodus";
                                        break;
                                default:
                                        $arr["RS232"]["Modus"] = $data . " (unknown)";
                                        break;
                        }
                } else {
                   $str = "RS232 Modus :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Zeit Verzögerungen                      
function Extract_CCA($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 8) {
                        $Arr["Badezimmer Einschaltverzoegerung"] = array_shift($dataArr) . " min";
                        $Arr["Badezimmer Ausschaltverzoegerung"] = array_shift($dataArr) . " min";
                        $Arr["L1 Ausschaltverzoegerung"] = array_shift($dataArr) . " min";
                        $Arr["Stosslueftung"] = array_shift($dataArr) . " min";
                        $Arr["Filter Zaehler"] = array_shift($dataArr) . " Wochen";
                        $Arr["RF hoch Zeit kurz"] = array_shift($dataArr) . " min";
                        $Arr["RF hoch Zeit lang"] = array_shift($dataArr) . " min";
                        $Arr["Kuechenhaube Ausschaltverzoegerung"] = array_shift($dataArr) . " min";
                } else {
                   $str = "Zeit-Verz?gerungen :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Ventilationsstufe abrufen
function Extract_CCE($rawDataStr,$varID) {   
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 14) {
                        $AbluftAbwesend = array_shift($dataArr);
                        $AbluftStufe1 = array_shift($dataArr);
                        $AbluftStufe2 = array_shift($dataArr);
                        $ZuluftAbwesend =array_shift($dataArr);
                        $ZuluftStufe1 =array_shift($dataArr);
                        $ZuluftStufe2 = array_shift($dataArr);
                        //SetValueInteger(33407,array_shift($dataArr)); // abluft in %
                        $aktuelleStufe = array_shift($dataArr);
                        //SetValueInteger(37081,$aktuelleStufe); // zuluft in %
                        //SetValueInteger(52520,array_shift($dataArr)-1); // vent stufe
                        $AbluftStufe3 =array_shift($dataArr);
                        $ZuluftStufe3 = array_shift($dataArr);
                        
                        $Arr["Abluft-Abwesend"] = $AbluftAbwesend . " %";
                        $Arr["Abluft-Stufe1"] = $AbluftStufe1 . " %";
                        $Arr["Abluft-Stufe2"] = $AbluftStufe2  . " %";
                        $Arr["Abluft-Stufe3"] = $AbluftStufe3  . " %";
                        
                        $Arr["Zuluft-Abwesend"] = $ZuluftAbwesend . " %";
                        $Arr["Zuluft-Stufe1"] = $ZuluftStufe1 . " %";
                        $Arr["Zuluft-Stufe2"] = $ZuluftStufe2 . " %";
                        $Arr["Zuluft-Stufe3"] = $ZuluftStufe3 . " %";
                } else {
                $str = "Ventilationsstufe :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}


//Temperaturen abrufen                       
function Extract_CD2($rawDataStr,$varID,$ID_KomfortTemp) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 9) {
                        $Arr["KomfortTemperatur"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C";
						SetValue($ID_KomfortTemp,(int)$Arr["KomfortTemperatur"]);
			            $Arr["T1-Aussenluft"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C";
                        $Arr["T2-Zuluft"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C";
                        $Arr["T3-Abluft"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C";
                        $Arr["T4-Fortluft"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C";
                        
                        $Fuehler = array_shift($dataArr);
						$FuehlerT1 = $Fuehler & hexdec(0x01);
                        $FuehlerT2 = ($Fuehler & hexdec(0x02)) >> 1;
                        $FuehlerT3 = ($Fuehler & hexdec(0x04)) >> 2;
                        $FuehlerT4 =  ($Fuehler & hexdec(0x08)) >> 3;
                        $FuehlerEWT = ($Fuehler & hexdec(0x10)) >> 4;
                        $FuehlerNachheizung = ($Fuehler & hexdec(0x20)) >> 5;
                        $FuehlerKuechenhaube = ($Fuehler & hexdec(0x40)) >> 6;
                        
                        $Arr["Fuehler-T1"] = $FuehlerT1;
                        $Arr["Fuehler-T2"] = $FuehlerT2;
                        $Arr["Fuehler-T3"] = $FuehlerT3;
                        $Arr["Fuehler-T4"] =  $FuehlerT4;
                        $Arr["Fuehler-EWT"] =  $FuehlerEWT;
                        $Arr["Fuehler-Nachheizung"] = $FuehlerNachheizung;
                        $Arr["Fuehler-Kuechenhaube"] = $FuehlerKuechenhaube;
                        
                        if($FuehlerEWT) { $Arr["EWT"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C"; } else { $Arr["EWT"] = "-";}
                        if($FuehlerNachheizung) { $Arr["Nachheizung"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C"; } else { $Arr["Nachheizung"] = "-";}
                        if($FuehlerKuechenhaube) { $Arr["Kuechenhaube"] = number_format(array_shift($dataArr) / 2 - 20,1) ." °C"; } else { $Arr["Kuechenhaube"] = "-";}
                } else {
                $str = "Temperaturen :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Status abrufen                       
function Extract_CD5($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 11) {
                        if(array_shift($dataArr)) { $Arr["Vorheizung"] = "vorhanden"; } else { $Arr["Vorheizung"] = "nicht vorhanden"; };
                        if(array_shift($dataArr)) { $Arr["Bypass"] = "vorhanden"; } else { $Arr["Bypass"] = "nicht vorhanden"; };
                        if(array_shift($dataArr)) { $Arr["Typ"] = "rechts"; } else { $Arr["Typ"] = "links"; };
                        if(array_shift($dataArr)) { $Arr["Groesse"] = "gross"; } else { $Arr["Typ"] = "klein"; };

                        $Optionen = array_shift($dataArr);
                   $Feuerstaette = $Optionen & hexdec(0x01);
                        $Kuechenhaube = ($Optionen & hexdec(0x02)) >> 1;
                        $Nachheizung = ($Optionen & hexdec(0x04)) >> 2;
                        if($Feuerstaette) { $Arr["Option-Feuerstaette"] = "vorhanden"; } else { $Arr["Option-Feuerstaette"] = "nicht vorhanden"; };
                        if($Kuechenhaube) { $Arr["Option-Kuechenhaube"] = "vorhanden"; } else { $Arr["Option-Kuechenhaube"] = "nicht vorhanden"; };
                        if($Nachheizung) { $Arr["Option-Nachheizung"] = "vorhanden"; } else { $Arr["Option-Nachheizung"] = "nicht vorhanden"; };

                        $xx = array_shift($dataArr);
                        $P10_17 = array_shift($dataArr);
                        $Arr["Status-P10"] = ($P10_17 & hexdec(0x01));
                        $Arr["Status-P11"] = ($P10_17 & hexdec(0x02)) >> 1;
                        $Arr["Status-P12"] = ($P10_17 & hexdec(0x04)) >> 2;
                        $Arr["Status-P13"] = ($P10_17 & hexdec(0x08)) >> 3;
                        $Arr["Status-P14"] = ($P10_17 & hexdec(0x10)) >> 4;
                        $Arr["Status-P15"] = ($P10_17 & hexdec(0x20)) >> 5;
                        $Arr["Status-P16"] = ($P10_17 & hexdec(0x40)) >> 6;
                        $Arr["Status-P17"] = ($P10_17 & hexdec(0x80)) >> 7;

                        $P18_19 = array_shift($dataArr);
                        $Arr["Status-P18"] = ($P18_19 & hexdec(0x01));
                        $Arr["Status-P19"] = ($P18_19 & hexdec(0x02)) >> 1;

                        $P90_96 = array_shift($dataArr);
                        $Arr["Status-P90"] = ($P90_96 & hexdec(0x01));
                        $Arr["Status-P91"] = ($P90_96 & hexdec(0x02)) >> 1;
                        $Arr["Status-P92"] = ($P90_96 & hexdec(0x04)) >> 2;
                        $Arr["Status-P93"] = ($P90_96 & hexdec(0x08)) >> 3;
                        $Arr["Status-P94"] = ($P90_96 & hexdec(0x10)) >> 4;
                        $Arr["Status-P95"] = ($P90_96 & hexdec(0x20)) >> 5;
                        $Arr["Status-P96"] = ($P90_96 & hexdec(0x40)) >> 6;

                        $Enthalpie = array_shift($dataArr);
                        switch($Enthalpie) {
                           case 0:
                              $Arr["Enthalpie"] = "abwesend";
                                   break;
                           case 1:
                              $Arr["Enthalpie"] = "anwesend";
                                   break;
                           case 2:
                              $Arr["Enthalpie"] = "ohne Fühler";
                                   break;
                           default:
                              $Arr["Enthalpie"] = "???";
                                   break;
                        }
                        $EWT = array_shift($dataArr);
                        switch($EWT) {
                           case 0:
                              $Arr["EWT"] = "abwesend";
                                   break;
                           case 1:
                              $Arr["EWT"] = "geregelt";
                                   break;
                           case 2:
                              $Arr["EWT"] = "ungeregelt";
                                   break;
                           default:
                              $Arr["EWT"] = "???";
                                   break;
                        }
                } else {
                $str = "Status :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

//Störungen und Filter abrufen
function Extract_CDA($rawDataStr,$varID,$varIDFilter,$varIDError) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
			$Arr = array();
				$Arr["Filter"] = "";
				$Arr["ERROR"]="";
                $Arr["AktuellerFehler-A"]  = "";
                   $Arr["AktuellerFehler-E"]  = "";
                   $Arr["LetzterFehler-A"]  = "";
                   $Arr["LetzterFehler-E"]  = "";
                   $Arr["VorletzterFehler-A"]  = "";
                   $Arr["VorletzterFehler-E"]  = "";
                   $Arr["VorvorletzterFehler-A"]  = "";
                   $Arr["VorvorletzterFehler-E"]  = "";
                   $Arr["AktuellerFehler-EA"]  = "";
                   $Arr["LetzterFehler-EA"]  = "";
                   $Arr["VorletzterFehler-EA"]  = "";
                   $Arr["VorvorletzterFehler-EA"]  = "";
                   $Arr["AktuellerFehler-A_high"]  = "";
                   $Arr["LetzterFehler-A_high"]  = "";
                   $Arr["VorletzterFehler-A_high"]  = "";
                   $Arr["VorvorletzterFehler-A_high"]  = "";				
                if(count($dataArr) == 17) {
				   $Arr["ERROR"]="";
                   $Arr["AktuellerFehler-A"]  = array_shift($dataArr);
                   $Arr["AktuellerFehler-E"]  = array_shift($dataArr);
                   $Arr["LetzterFehler-A"]  = array_shift($dataArr);
                   $Arr["LetzterFehler-E"]  = array_shift($dataArr);
                   $Arr["VorletzterFehler-A"]  = array_shift($dataArr);
                   $Arr["VorletzterFehler-E"]  = array_shift($dataArr);
                   $Arr["VorvorletzterFehler-A"]  = array_shift($dataArr);
                   $Arr["VorvorletzterFehler-E"]  = array_shift($dataArr);
                        if(array_shift($dataArr)) { $Arr["Filter"] = "voll"; } else { $Arr["Filter"] = "OK"; };
                        $Arr["AktuellerFehler-EA"]  = array_shift($dataArr);
                   $Arr["LetzterFehler-EA"]  = array_shift($dataArr);
                   $Arr["VorletzterFehler-EA"]  = array_shift($dataArr);
                   $Arr["VorvorletzterFehler-EA"]  = array_shift($dataArr);
                   
                   $Arr["AktuellerFehler-A_high"]  = array_shift($dataArr);
                   $Arr["LetzterFehler-A_high"]  = array_shift($dataArr);
                   $Arr["VorletzterFehler-A_high"]  = array_shift($dataArr);
                   $Arr["VorvorletzterFehler-A_high"]  = array_shift($dataArr);
                } else {
                $str = "Stoerungen :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
             //   $Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
				setValue($varIDFilter,$Arr["Filter"]);
				setValue($varIDError,"");	
				if ($Arr["ERROR"]=="Stoerungen :: no valid Data received") $Arr["ERROR"]="";
				if (($Arr["ERROR"]<>"") or ($Arr["AktuellerFehler-A"]<>"") or ($Arr["AktuellerFehler-E"]<>"") or ($Arr["AktuellerFehler-A_high"]<>""))
				 {
				  setValue($varIDError,"ComfoBoxFEHLER: ".$Arr["ERROR"]." FehlerA: ".$Arr["AktuellerFehler-A"]." / FehlerE: ".$Arr["AktuellerFehler-E"]." / FehlerA_high: ".$Arr["AktuellerFehler-A_high"]);} 
			       else
				   {setValue($varIDError,"");}
                SetValue($varID,$str);
                return $str;
}

//Betriebsstunden                       
function Extract_CDE($rawDataStr,$varID,$FilterCountdown) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 20) {
                   $Abwesend = array_shift($dataArr)*256*256 + array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Stufe1 = array_shift($dataArr)*256*256 + array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Stufe2 = array_shift($dataArr)*256*256 + array_shift($dataArr) * 256 + array_shift($dataArr);

                   $Frostschutz = array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Vorheizung =  array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Bypass =  array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Filter = array_shift($dataArr) * 256 + array_shift($dataArr);
                   $Stufe3 = array_shift($dataArr)*256*256 + array_shift($dataArr) * 256 + array_shift($dataArr);

                        $Arr["Abwesend"] =  $Abwesend . " h -> " . number_format((float)$Abwesend/24/360,2) . " Jahre";
                        $Arr["Stufe-1"] = $Stufe1 . " h -> ". number_format((float)$Stufe1/24/360,2) . " Jahre";
                        $Arr["Stufe-2"] = $Stufe2 . " h -> ". number_format((float)$Stufe2/24/360,2) . " Jahre";
                        $Arr["Stufe-3"] = $Stufe3 . " h -> ". number_format((float)$Stufe3/24/360,2) . " Jahre";
						$Arr["Gesamtlaufzeit"] = ($Abwesend+$Stufe1+$Stufe2+$Stufe3) . " h -> ". number_format((float)($Abwesend+$Stufe1+$Stufe2+$Stufe3)/24/360,2) . " Jahre";
                        $Arr["Bypass"] = $Bypass . " h -> ". number_format((float)$Bypass/24/360,2) . " Jahre";
                        $Arr["Filter"] = $Filter . " h -> ". number_format((float)$Filter/24/360,2) . " Jahre";
                        SetValue($FilterCountdown,182-(int)number_format((float)$Filter/24,2));
                        $Arr["Frostschutz"] = $Frostschutz . " h -> ". number_format((float)$Frostschutz/24/360,2) . " Jahre";
                        $Arr["Vorheizung"] = $Vorheizung . " h -> ". number_format((float)$Vorheizung/24/360,2) . " Jahre";
                } else {
                        $str = "Betriebsstunden :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}


//Bypassregelung abrufen                      
function Extract_CE0($rawDataStr,$VisID,$BypassStufe,$BypassModus) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
      $Arr = array();
                if(count($dataArr) == 7) {
                   array_shift($dataArr);
                   array_shift($dataArr);
                   $Arr["Bypass-Faktor"] = array_shift($dataArr);
                   $Arr["Bypass-Stufe"] = array_shift($dataArr);
                   $Arr["Bypass-Korrektur"]  = array_shift($dataArr);
                   array_shift($dataArr);
                   $Arr["Modus"] = array_shift($dataArr);
                   if($Arr["Modus"]==1) { $Arr["Modus"] = "Sommermodus"; } else { $Arr["Modus"]  = "Wintermodus"; };
				   SetValue($BypassStufe,(int)$Arr["Bypass-Stufe"]);
				   SetValue($BypassModus,$Arr["Modus"]);
    		    } else {
                $str = "Bypassregelung :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($VisID,$str);
                return $str;
}

// Vorheizung abrufen  => in meinem Fall uninteressant, da kein Frostschutz eingebaut !!
function Extract_CE2($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 6) {
                   switch(array_shift($dataArr)) {
                           case 0:
                              $Arr["StatusKlappe"] = "geschlossen";
                              break;
                           case 1:
                              $Arr["StatusKlappe"] = "offen";
                              break;
                           case 2:
                              $Arr["StatusKlappe"] = "unbekannt";
                              break;
                           default:
                              $Arr["StatusKlappe"] = "???";
                              break;
                   }
                        if(array_shift($dataArr)) {$Arr["Frostschutz"] = "aktiv";} else {$Arr["Frostschutz"] = "inaktiv";}
                        if(array_shift($dataArr)) {$Arr["Vorheizung"] = "aktiv";} else {$Arr["Vorheizung"] = "inaktiv";}
                        $Arr["Frostminuten"] = array_shift($dataArr) * 256 + array_shift($dataArr) . " min";
                        if(array_shift($dataArr)) {$Arr["Frostsicherheit"] = "extra sicher";} else {$Arr["Frostsicherheit"] = "sicher";}
                } else {
                   $str = "Vorheizung :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                //$Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

// RF Status abrufen, uninteressant, da nicht verbaut
function Extract_CE6($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 7) {
                 
                        $RF_Adr4 = array_shift($dataArr);
                   $RF_Adr3 =  array_shift($dataArr);
                   $RF_Adr2 =  array_shift($dataArr);
                   $RF_Adr1 = array_shift($dataArr);
                   $RF_ID = array_shift($dataArr);

                        $Arr["RF Adresse"] =  dechex($RF_Adr1) ." ". dechex($RF_Adr2) ." ". dechex($RF_Adr3) ." ". dechex($RF_Adr4);
                        $Arr["RF ID"] = dechex($RF_ID);
                } else {
                   $str = "RF Status :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                $Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

// Letzte 8 mal Vorheizung => in meinem Fall uninteressant
function Extract_CEA($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 8) {
                        $Arr["Wert 8 (Neuster Wert)"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 7"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 6"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 5"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 4"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 3"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 2"]  = array_pop($dataArr) . " ?C";
                        $Arr["Wert 1 (Aeltester Wert)"]  = array_pop($dataArr) . " ?C";
                } else {
                   $str = "Letzte 8 mal Vorheizung :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                $Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

// EWT Nachheizung => in meinem Fall uninteressant, da nicht eingebaut !!
function Extract_CEC($rawDataStr,$varID) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
           $Arr = array();
                if(count($dataArr) == 8) {
                        $Arr["EWT-niedrig"]  = array_shift($dataArr) . " °C";
                        $Arr["EWT-hoch"]  = array_shift($dataArr) . " °C";
                        $Arr["EWT-speedUp"]  = array_shift($dataArr) . " %";
                        $Arr["Kuechenhaube-speedUp"]  = array_shift($dataArr) . " %";
                        $Arr["NachheizungLeistung"]  = array_shift($dataArr);
                        $Arr["NachheizungLeistung_I-Parameter"]  = array_shift($dataArr) . " " . array_shift($dataArr);;
                        $Arr["NachheizungTempGewuenscht"]  = array_shift($dataArr) . " °C";
                } else {
                   $str = "EWT Nachheizung :: no valid Data received";
                   $Arr["ERROR"] = $str;
                        LogMsg(__FUNCTION__,$str);
                }
                $Arr["RawData"] = String2Hex($rawDataStr);
                $Arr["Update-TimeStamp"] = date('d-m-Y H:i:s',time());
                $str = Array2HtmlTable($Arr);
                SetValue($varID,$str);
                return $str;
}

function Extract_Unknown($rawDataStr) {
      $rawDataStr = str_replace("\x07\x07","\x07",$rawDataStr);
           $str = "WRL WARNING :: unknown Command received -> " . String2Hex($RawData) . "((" . $RawData;
                LogMsg(__FUNCTION__,$str);
                return $str;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function ExtractString($rawDataStr) {
                $rawDataArr = String2Arr($rawDataStr);
                $dataArr = ExtractData($rawDataArr);
                return Arr2String($dataArr);
}


function ExtractData($byteArr) {
        $crc = array_pop($byteArr);
        //echo "\r\ncrc: " . $crc;
        //print_r($byteArr);
        $crcOK = CheckCRC($byteArr,$crc);
        if($crcOK) {
                //print_r($byteArr);
                //echo "\r\nlen: " . dechex($byteArr[2]);
                return array_slice($byteArr,3,ord($byteArr[2]));
        } else {
           return array ("\x00");
        }
}

function CheckCRC($byteArr,$crc) {
        $crcCalculated = CalcCRC($byteArr);
        //echo "\r\ncrc: " .$crc;
        //echo "\r\ncrcCalculated: " . $crcCalculated;
        if ($crc == $crcCalculated) {
                //echo "\r\nCRC OK";
                return true;
        } else {
                //echo "\r\nCRC !not! OK";
                LogMsg(__FUNCTION__,"CRC NOT OK :>: " . String2Hex(Arr2String($byteArr)));
                return false;
        }
}

function CalcCRC($byteArr) {
        $crc = 0;
        $cnt07 =0;
        foreach($byteArr as $byte) {
                //echo "\r\n  Byte: " . $byte . " :: " . dechex($byte) . " :: " .  chr($byte);
                /*
                if(($byte == 07) AND ($cnt07==0)) {
                        $cnt07++;
                } else {
                        $cnt07 =0;
                        $crc = $crc + $byte;
           }
           */
                $crc = $crc + $byte;
        }
        $crc = $crc + 173;
        $crc = $crc & 255;
        return $crc;
}


function String2Hex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        //$hex .= dechex(ord($string[$i]));
        $hex .= "0x" . sprintf("%02X", ord($string[$i])) . " ";
    }
    return $hex;
}


function String2Arr($string){
    $arr = array();
    for ($i=0; $i < strlen($string); $i++){
       $arr[] = ord($string[$i]);
    }
    return $arr;
}

function Arr2String($arr){
                $str = '';
                foreach ($arr as $arrElem) {
                          $str .= chr($arrElem);
                }
        return $str;
}

function DebugArray($arr) {
                foreach ($arr as $arrElem) {
                        echo "\r\n   Byte: " . $arrElem . " :: " . dechex($arrElem) . " :: " .  chr($arrElem);
                }
}

function startsWith($haystack, $needle)
{
    return !strncmp($haystack, $needle, strlen($needle));
}

function LogMsg($functionName,$logMessage) {

        $logEntry = date('Y-m-d H:i:s', time()) . " : " . $functionName . " : " . $logMessage;

        $Path1 = IPS_GetKernelDir();
        $Path2 = "logs\\";
        $File = "ComfoAir550.log";   //date("Y-m-d His",time())
        $Filename = $Path1 . $Path2 . $File;

   $datei = fopen($Filename , "a+");
   fwrite($datei, $logEntry . "\r\n");
   fclose($datei);
}

function Array2HtmlTable($Arr) {
        //print_r($Arr);
        $html = "<table width='100%' cellspacing='0'>";
        $keys = array_keys($Arr);
   for($i=0;$i<count($keys);$i++)
   {
      $html.= "<tr>";
      switch ($keys[$i]) { // spezellie farbdarstellungen im htmlbox
                        case "Gesamtlaufzeit":
                                $html.= "<td><font color='#7E7979'>" . $keys[$i] . "</font></td><td align='right'><font color='#7E7979'>" . $Arr[$keys[$i]] ."</font></td>";
                                break;                        
						case "Update-TimeStamp":
                                $html.= "<td><font size=2 color='#7E7979'>" . $keys[$i] . "</font></td><td align='right'><font size=2 color='#7E7979'>" . $Arr[$keys[$i]] ."</font></td>";
                                break;
                        case "RawData":
                                $html.= "<td><font size=2 color='#7E7979'>" . $keys[$i] . "</td><td align='right'><font size=2 color='#7E7979'>" . $Arr[$keys[$i]] ."</font></td>";
                                break;
                        default:
                                $html.= "<td>" . $keys[$i] . "</td><td align='right'>" . $Arr[$keys[$i]] ."</td>";
                                break;
                }
                $html.= "</tr>";
   }
        $html .= "</table>";
        return $html;
}


?>

Gruß
hardlog

Vielen Dank Hardlog,
das hat mir sehr geholfen.
Gruß
Smudo