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

Hallo Hardlog,

kannst du mir die Trennzeichen schicken und auch ein Screenshot mit Infos für die erstellt Struktur in Objektbaum, auch wie du die Skripte eingebaut hast, wären für mich sehr hilfreich. Mir fehlt hier das notwendige Hintergrundwissen, von daher die Nachfrage.

Vielen Dank schon einmal.

Viele Grüße
tschmitt

Ich schau mir das am WE an.

Grüß
Hardlog

Hallo,

wie 2 Posts zuvor: Die Trennzeichen sind

und
aaað

Im Objektbaum:
image

was brauchst du noch?

1 „Gefällt mir“

Hallo hardlog,

super vielen Dank, ich hatte die Trennzeichen leider nicht geschrieben bekommen :-), danke dir für die tolle Unterstützung.

Mit der Struktur komme ich jetzt auch weiter, das hilft mir als Anfänger super.

Hallo Hardlog,

folgenden Cutter und I/O habe ich angelegt und mit den Infos von dir gefüttert

das Auslesescript habe ich so wie du in ComfoAir (Auslesen) hinterlegt.
→ Aktuelles Problem, nicht alle IDs im Script finde ich in deinem Auszug, besteht hier die Möglichkeit das du mir die gesamte Übersicht schickst?

Was hast du noch im Ordner „interpretierte Werte“ hinterlegt?

Der restliche Menübaum sieht so aus

Was muss ich mit dem includierten PHP-Script noch machen bzw. für was benötige ich dieses?

Sorry für die vielen Fragen

Ok,
läuft bei mir schon jahre ohne das ich dran war, von daher muss ich mich da auch rantasten:

erstmal welche IDs kannst du nicht finden?

Nicht erschrecken,

in der Reihenfolge im Script

13558
27308
29424
55491
11048
23216
38967
50627
16900
53470
58001
58539
50121
59110
24043
42133
31479
51809
39716
25005
15222

Ich vermute, das einige davon im Unterordner „interpretierte Werte“ stehen.

Bitte zeige mir auch noch die Positionen unter Komforttemperatur (eingestellt)

Ich bekomme auch bei Zeile 8 noch einen Fehler

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

Wo muss ich das php zum Auslesen ablegen?

Hier sind auch noch folgenden IDs enthalten

33407
37081
52520

Vielen Dank :slight_smile:

Das dient alles der Visualisierung im WF hier mein Objektbaum:



Das PHP-SAkript ComfoAir.ips.php muss in den Ordner Symcon/scripts

33407, 37081 und 52520 sind irgendwas Altes, die php-Zeilen sind bei mir komplett auskommentiert (können weg)

Ich hoffe du kommst so weiter.

Schönen 4. Advent

Hallo hardlog,

wow jetzt bin ich platt, da hast du aber wirklich eine sehr große Lösung aufgebaut :slight_smile:

Das Auslesescript von dir habe ich bei mir im Objektbaum unter Daten aus ComfoAir Auslesen (Aktionsscript) abgelegt.

Das includierte PHP-script, das muss ich im Bereich scripte unter Symcon ablegen, habe ich das richtig verstanden.

Du hast dann aber noch weiter Scripte in deinem Objektbaum oder sehe ich das falsch?

Wünsche dir auch einen schönen 4. Advent und nochmals 1000 Dank für die Unterstützung, hoffe ich bekomme es jetzt zum laufen :wink:

Das ist alles etwa 8 Jahre alt (aber läuft zuverlässig seit dem!).
Ob du das alles für dich brauchst muss du sehen.

hier noch die einzelnen Scripte:

22493:

<?php
/*******************************************************************************************
	Diese Script prüft unterschiedliche Sensordaten der COmfoAir auf Plausibilität
	und gibt interpretierte Betriebszustände oder Fehlermeldungen aus.
	CAVE: Dies sind keine Fehler o. Zustände die die ComfoAir meldet, sondern
	die aus den Daten interpretiert werden.
	
	Stand: 29.5.16
*******************************************************************************************/

$AussenAnsaugluft=GetValue(45026);
$NachComfoFond=GetValue(21743);
$Zuluft=getvalue(23022);
$bypass=getvalue(16977);

$DifferenzComfoFond=($NachComfoFond-$AussenAnsaugluft);
$DifferenzKreuzstromZuluft=($Zuluft-$NachComfoFond);

$betrArt=4; // undefinierter Status => prüfen!!

if (($DifferenzKreuzstromZuluft>=1.8)) $betrArt=1;// Kreuzstromtauscher wärmt Lüftung an
if (($DifferenzKreuzstromZuluft<=-1.8)) $betrArt=5;// Kreuzstromtauscher wärmt Lüftung an
if (($DifferenzComfoFond<1.8) and ($DifferenzComfoFond>-1.8)and ($DifferenzKreuzstromZuluft<1.8) and ($DifferenzKreuzstromZuluft>-1.8)) $betrArt=6;// mehr oder weniger reine Lüftung
if (($bypass==100) and ($DifferenzComfoFond<1.8) and ($DifferenzComfoFond>-1.8)) $betrArt=6;// mehr oder weniger reine Lüftung
if (($bypass==100) and ($DifferenzComfoFond>=1.8)) $betrArt=2;// L-Fond wärmm vor
if (($bypass==100) and ($DifferenzComfoFond<=-1.8)) $betrArt=3;// L-Fond kühl vor
if (($bypass<100) and ($DifferenzComfoFond>=1.8) and ($DifferenzKreuzstromZuluft<1.8)) $betrArt=2;// L-Fond wärmm vor
if (($bypass<100) and ($DifferenzKreuzstromZuluft>=1.8)) $betrArt=1;// Kreuzstrom wärmt
if (($bypass<100) and ($DifferenzKreuzstromZuluft<=-1.8)) $betrArt=5;// Kreuzstrom kühlt

// Fehler prüfen
// prüfen ob überhaupt akutelle Werte sonst Störung anzeigen
if (((time()-IPS_GetVariable(21743)['VariableUpdated'])/60)>20) {$betrArt=10; setvalue(33062,FALSE);}
		else { setvalue( 33062,TRUE);}// Fehler: Keine aktuellen Werte
if (($bypass>0) and ($AussenAnsaugluft>getvalue(58578)) and (getvalue(58578)<getvalue(45812))) $betrArt=11;// irgendwas stimmt mit dem Bypass nicht
if (($bypass>0) and ($AussenAnsaugluft<getvalue(45812))) $betrArt=11;// irgendwas stimmt mit dem Bypass nicht

setvalue(18713,$betrArt);
?>

24972:

<?php

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

25963:

<?php
// *****************************************************************************
// Script fragt nur Temp. ab (geht schneller als alles)
// *****************************************************************************
// ** F. Peters. Stand: 19.12.2015 8Uhr                                       **
// *****************************************************************************

include('ComfoAir.ips.php');

/*
$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);}
 
//Temp abrufen
//String2Hex(SendCommand(array(0x00,0x0F),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x0F),null,26492));

?>

46396:

<?php
// *****************************************************************************
// ** Script ruft relevante aus von Parameter der Comfoair über die TCP->Rs232
// ** Dafür ClientSocket auf den LAN-Adapter legen
// ** ALTERNATIE
// ** Script ruft relevante aus von Parameter der Comfoair über die Rs232 ab. **
// ** Entsprechender Coder wird gesendet und via RegisterVar wird dann durch  **
// ** die Antwirt das Script 55649 auf gerufen das den Rest macht.            **
// ** Script wird zusätzlich zyklisch alle 15min  ausgeführt                  **
// *****************************************************************************
// ** F. Peters. Stand: 19.12.2015 9:35Uhr                                    **
// *****************************************************************************

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



/*   Die folgenden Zeilen sind neötigt, wenn die ABfrage doch über ComPort erfolgen soll
$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);}
$IDRegVar=26492 ;

//Störungen abrufen
//String2Hex(SendCommand(array(0x00,0xD9),null,$IDcomPort)); // Wenn Abfrage via ComPort
String2Hex(SendCommandTCP(array(0x00,0xD9),null,$IDRegVar));
 sleep(1);
 
//Ventilationsstatus abrufen
//String2Hex(SendCommand(array(0x00,0x0B),null,$IDcomPort));// Wenn Abfrage via ComPort
String2Hex(SendCommandTCP(array(0x00,0x0B),null,$IDRegVar));// 
 sleep(1);
//   Bypassregelung
//String2Hex(SendCommand(array(0x00,0xDF),null,$IDcomPort));// Wenn Abfrage via ComPort
String2Hex(SendCommandTCP(array(0x00,0xDF),null,$IDRegVar));
 sleep(1);
//Temp abrufen
//String2Hex(SendCommand(array(0x00,0x0F),null,$IDcomPort));// Wenn Abfrage via ComPort
String2Hex(SendCommandTCP(array(0x00,0x0F),null,$IDRegVar));
?>

34745:

<?php
// *****************************************************************************
// ** Script ruft alle (für mich alle relevanten) Parameter der               **
// ** Comfoair über die Rs232 ab.                                             **
// ** Entsprechender Coder wird gesendet und via RegisterVar wird dann durch  **
// ** die Antwirt das Script 55649 auf gerufen das den Rest macht.            **
// ** Script kann manuell aus dem WF heraus aufgerufen werden                 **
// ** Script wird zusätzlich zyklisch (1x nachts) ausgeführt                  **
// *****************************************************************************
// ** F. Peters. Stand: 19.12.2015 8Uhr                                       **
// *****************************************************************************

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

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

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

WFC_SendNotification(ID_WFC,'Bitte warten!','dauert 25sec','Clock',23);
/*
// 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);
 }
*/
//Temp abrufen
//String2Hex(SendCommand(array(0x00,0xD1),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xD1),null,$IDRegVar));
 Sleep(2);
//Störungen abrufen
//String2Hex(SendCommand(array(0x00,0xD9),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xD9),null,$IDRegVar));
 sleep(2);
//Status abrufen
//String2Hex(SendCommand(array(0x00,0xD5),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xD5),null,$IDRegVar));
 sleep(2);
//Ventilationsstatus abrufen
//String2Hex(SendCommand(array(0x00,0x0B),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x0B),null,$IDRegVar));
 sleep(2);
//Ventilatorstufe
//String2Hex(SendCommand(array(0x00,0xCD),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xCD),null,$IDRegVar));
 sleep(2);
//Klappenstatus abrufen
//String2Hex(SendCommand(array(0x00,0x0D),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x0D),null,$IDRegVar));
 sleep(2);
//   Bypassregelung
//String2Hex(SendCommand(array(0x00,0xDF),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xDF),null,$IDRegVar));
 sleep(2);
//   Analoge EIngänge abrufen
//String2Hex(SendCommand(array(0x00,0x13),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x13),null,$IDRegVar));
 sleep(2);
// Eingänge abrufen
//String2Hex(SendCommand(array(0x00,0x03),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x03),null,$IDRegVar));
 sleep(2);
//Temp abrufen
//String2Hex(SendCommand(array(0x00,0x0F),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x0F),null,$IDRegVar));
 sleep(2);
//Betriebsstunden
//String2Hex(SendCommand(array(0x00,0xDD),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xDD),null,$IDRegVar));
 sleep(2);
//Zeitverzögerung
//String2Hex(SendCommand(array(0x00,0xC9),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0xC9),null,$IDRegVar));
?>

48983:

<?php
switch($_IPS['SENDER'])
{
 case "WebFront":
	 SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);

 switch($_IPS['VALUE'])
 {
  case 0: // Zyklisches Ausführen des AutoUmschaltscript deaktivieren
		IPS_SetEventActive(38570, false);
	  break;
  case 1: // Zyklisches Ausführen des AutoUmschaltscript aktivieren
		IPS_SetEventActive(38570, true);
	  break;
 }
 break;
}
?>

52933:

<?php
// *****************************************************************************
// ** Prüfen ob winter, dann KompfortTemp auf 22 °C, sonst auf 15°C				**
// ** Script wird zyklisch (1x nachts) ausgeführt                  				**
// *****************************************************************************
// ** F. Peters. Stand: 19.12.2015 9:15Uhr                                    **
// *****************************************************************************

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

// Vorgaben:
$SommerZiel=15;
$WinterZiel=22;

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

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

// 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(2);
 }*/

$Monat=date('m');
If (($Monat>4) and ($Monat<10)) // Sommer Jahreszeit => Komforttemp auf 15°C
  {
    SetValue(45812 ,$SommerZiel);
    //SendCommand(array(0x00,0xD3),array(($SommerZiel+20)*2),$IDcomPort);
    SendCommandTCP(array(0x00,0xD3),array(($SommerZiel+20)*2),$IDRegVar);
  }
  else // kalte Jahreszeit => Komforttemp auf 22°C
  {
   setvalue(45812 ,$WinterZiel);
//   SendCommand(array(0x00,0xD3),array(($WinterZiel+20)*2),$IDcomPort);
   SendCommandTCP(array(0x00,0xD3),array(($WinterZiel+20)*2),$IDRegVar);
  }
?>

54890:

<?php

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

//			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




switch($_IPS['SENDER'])
{
 case "WebFront":
	 SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);

 switch($_IPS['VALUE'])
 {
  case 0: // Abbruch
			IPS_SetHidden(16388,true);
			setvalue(22495,FALSE);
			setvalue(16388,FALSE);
	  break;
  case 1: // tatsächlich löschen
  			IPS_SetHidden(16388,true);
			setvalue(22495,FALSE);
			setvalue(16388,FALSE);
            SendCommandTCP(array(0x00,0xDB),array(0,0,0,1),$IDRegVar); // Reset des Filters
            SetValue(10906,'Filtertimer wurde auf'.PHP_EOL.'1/2 Jahr zurückgesetzt!');                        
            IPS_RunScript(21800); // Meldung aufpoppen, das umgestellt                                                
			WFC_SendNotification(ID_WFC,'Filtertimer wurde zurückgesetzt','','clock',5);
	  break;
 }
 break;
}

?>

13988:

<?php

switch($_IPS['SENDER'])
{
 case "WebFront":
	 SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);

 switch($_IPS['VALUE'])
 {
  case 1:
			IPS_SetHidden(16388,true);
			setvalue(22495,FALSE);
	  break;
  case 0:
			IPS_SetHidden(16388,False);
			setvalue(22495,TRUE);
	  break;
 }
 break;
}
?>

44574 (bin nicht sicher ober das im vorherigen Post mit abfotografiert war:

<?php
// *****************************************************************************
// ** Script nur die eigentlich unveränderlichen HARDWARE-Daten               **
// ** der Comfoair über die Rs232 ab.                                         **
// ** Entsprechender Coder wird gesendet und via RegisterVar wird dann durch  **
// ** die Antwirt das Script 55649 auf gerufen das den Rest macht.            **
// ** Script kann manuell aus dem WF heraus aufgerufen werden                 **
// *****************************************************************************
// ** F. Peters. Stand: 19.12.2015 8Uhr                                       **
// *****************************************************************************

include('ComfoAir.ips.php');

/*
$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);}

$IDRegVar=26492;
//Firmware abrufen
//String2Hex(SendCommand(array(0x00,0x69),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x69),null,$IDRegVar));
 sleep(1);

//Bootloader abrufen
//String2Hex(SendCommand(array(0x00,0x67),null,$IDcomPort));
String2Hex(SendCommandTCP(array(0x00,0x67),null,$IDRegVar));
 sleep(1);

//Konntektorplatine abrufen
 //String2Hex(SendCommand(array(0x00,0xA1),null,$IDcomPort));
  String2Hex(SendCommandTCP(array(0x00,0xA1),null,$IDRegVar));
?>

Ich bin nicht sicher ob ich da durch alles noch selbst durchsteige. Bin nicht vom Fach, hab mir das vor langer Zeit zusammengestrickt…

Also nicht vom FACH kann ich so nicht stehen lassen, was du hier aufgebaut hast und wie du mich unterstützt ist aller ACHTUNG wert :slight_smile:

Das unten rechts muss ich noch anlegen, im Weiteren auch die IDs in den Scripten noch anpassen

Die Zwei Links in ID30217 und ID 52877 wo hin lenken die? das habe ich noch nicht verstanden

Hallo Hardlog,

konnte jetzt soweit alles anpassen

A.) Frage, wohin verweist die Register Variable-ComfoAir (ID26492) bei dir?

B.) Weiterhin bekomme ich noch Fehlers bei folgenden Scripten und ID’s:

1. Script „löschen“
→ ID10906 und ID21800 ? (konnte ich nicht finden im Objektbaum)

2. Script „ComfortAir auslesen“
→ ID33879, ID31316, ID17398, ID12079, ID21927, ID23216, ID31671, ID42752 und ID15222? (konnte ich nicht finden im Objektbaum)

3. Script „bestimmen“
→ ID45026, ID42256 (konnte ich nicht finden im Objektbaum)

C.) Welche ModuleID muss ich nehmen für die IDcomPort

   $IDcomPort=IPS_GetInstanceListByModuleID("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}"

mit dem Tool ComPort Info habe ich folgende Info bekommen

Welche ID muss ich verwenden, da ich hier folgenden Fehler erhalte

D.) Folgende Fehler kommen in den Scripten noch hoch: