$VarID_commandpart); } $VarID_time = IPS_GetVariableIDByName("Datum",$scriptID); if ($VarID_time == 0) { $VarID_time = IPS_CreateVariable(VSTRING); IPS_SetParent($VarID_time,$scriptID); IPS_SetName($VarID_time, "Datum"); } else { $BrVals = $BrVals + array("Datum" => $VarID_time); } $VarID_temp_aussen = IPS_GetVariableIDByName("Aussentemperatur",$scriptID); if ($VarID_temp_aussen == 0) { $VarID_temp_aussen = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_aussen,$scriptID); IPS_SetName($VarID_temp_aussen, "Aussentemperatur"); IPS_SetIcon($VarID_temp_aussen, "Temperature"); } $VarID_temp_warmw = IPS_GetVariableIDByName("Warmwassertemperatur",$scriptID); if ($VarID_temp_warmw == 0) { $VarID_temp_warmw = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_warmw,$scriptID); IPS_SetName($VarID_temp_warmw, "Warmwassertemperatur"); IPS_SetIcon($VarID_temp_warmw, "Temperature"); } $VarID_temp_kessel = IPS_GetVariableIDByName("Kesseltemperatur",$scriptID); if ($VarID_temp_kessel == 0) { $VarID_temp_kessel = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_kessel,$scriptID); IPS_SetName($VarID_temp_kessel, "Kesseltemperatur"); IPS_SetIcon($VarID_temp_kessel, "Temperature"); } $VarID_temp_raum1 = IPS_GetVariableIDByName("Raumtemperatur1",$scriptID); if ($VarID_temp_raum1 == 0) { $VarID_temp_raum1 = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_raum1,$scriptID); IPS_SetName($VarID_temp_rauml, "Raumtemperatur1"); IPS_SetIcon($VarID_temp_rauml, "Temperature"); } $VarID_temp_raum1soll = IPS_GetVariableIDByName("Raumtemperatur1_soll",$scriptID); if ($VarID_temp_raum1soll == 0) { $VarID_temp_raum1soll = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_raum1soll,$scriptID); IPS_SetName($VarID_temp_raum1soll, "Raumtemperatur1_soll"); IPS_SetIcon($VarID_temp_raum1soll, "Temperature"); } $VarID_temp_raum2 = IPS_GetVariableIDByName("Raumtemperatur2",$scriptID); if ($VarID_temp_raum2 == 0) { $VarID_temp_raum2 = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_raum2,$scriptID); IPS_SetName($VarID_temp_raum2, "Raumtemperatur2"); IPS_SetIcon($VarID_temp_raum2, "Temperature"); } $VarID_temp_raum2soll = IPS_GetVariableIDByName("Raumtemperatur2_soll",$scriptID); if ($VarID_temp_raum2soll == 0) { $VarID_temp_raum2soll = IPS_CreateVariable(VFLOAT); IPS_SetParent($VarID_temp_raum2soll,$scriptID); IPS_SetName($VarID_temp_raum2soll, "Raumtemperatur2_soll"); IPS_SetIcon($VarID_temp_raum2soll, "Temperature"); } else { } $VarID_brenner = IPS_GetVariableIDByName("Brenner",$scriptID); if ($VarID_brenner == 0) { $VarID_brenner = IPS_CreateVariable(VBOOL); IPS_SetParent($VarID_brenner,$scriptID); IPS_SetName($VarID_brenner, "Brenner"); IPS_SetIcon($VarID_brenner, "Flame"); } //print_r($BrVals); //IPS_GetObjectIDByName("Kesseltemperatur",$scriptID); //var für invertierte Daten anlegen $rev_comm = ""; //echo "\nstart\n"; if ($IPS_SENDER == "RegisterVariable"){ // 0x23 trennzeichen wieder anhängen $comm_part = GetValueString($VarID_commandpart); $rs232bus = chr(0x23) . $IPS_VALUE; // echo "\n" . $rs232bus . "\n"; // Laenge der Daten $len = strlen($rs232bus); if ($len <= 8){ $rs232bus = chr(0x23) . $comm_part . $rs232bus; $len = strlen($rs232bus); } //CRC abschneiden $command = substr($rs232bus, 0, -2); //Lange des Pakets aus dem Paket auslesen und invertieren $comm_len = substr($rs232bus, 3, 1); $comm_len = ord(~$comm_len); //checken der Paketlaenge, wenn falsch abbrechen if ($len == $comm_len) { analyze(); } elseif ($len > $comm_len) { echo "\nToo long\n"; } else { //echo "Laenge Falsch - "; //RegVar_SetBuffer(53020 /*[Develop\Broetje\Broetje_Input]*/,$IPS_VALUE . chr(0x23)); SetValueString($VarID_commandpart,$IPS_VALUE); $arr = str_split($rs232bus); //daten invertieren und in $rev_comm speichert array_walk($arr, 'test_alter'); //array_walk($arr, 'test_print'); //echo "\n"; } } else { echo $IPS_SENDER; echo ("==> SCHNITTSTELLE SCHLIESSEN COM Broetje !! ==> " . date("H:i:s") ."\r\n" ); COMPort_SetOpen($COM_PORT_ID,false); IPS_ApplyChanges($COM_PORT_ID); IPS_Sleep(1500); COMPort_SetOpen($COM_PORT_ID,true); IPS_ApplyChanges($COM_PORT_ID); echo ("==> SCHNITTSTELLE WIEDER OEFFNEN COM Broetje !! ==> " . date("H:i:s") ."\r\n" ); } //IPS_SetScriptTimer ($IPS_SELF,90); function analyze() { global $rs232bus, $command, $rev_comm, $comm_part, $VarID_commandpart,$VarID_time; global $VarID_temp_aussen, $VarID_temp_warmw, $VarID_temp_kessel, $VarID_temp_raum1, $VarID_temp_raum1soll, $VarID_temp_raum2, $VarID_temp_raum2soll; global $VarID_brenner; //echo "test\n"; //CRC auslesen $crc_org = (ord(~substr($rs232bus, -2, 1))*256) + ord(~substr($rs232bus, -1, 1)); //daten in array splitten $rec_arr = str_split($command); //daten invertieren und in $rev_comm speichert array_walk($rec_arr, 'chr_reverse'); //CRC checken if ($crc_org == CRC16Normal($rev_comm)) { $arr = str_split($rs232bus); array_walk($arr, 'test_alter'); // array_walk($arr, 'test_print'); //auswerten if ($arr[1] == 0x80){ //echo "Zentrale: "; if (($arr[4] == 0x07) && ($arr[5] == 0x0d) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x19)){ $kesseltemp = (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1); SetValueFloat ($VarID_temp_kessel, $kesseltemp); //echo "Kesseltemperatur: " . $kesseltemp . "\n"; } elseif (($arr[4] == 0x07) && ($arr[5] == 0x31) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x2f)){ $warmwassertemp = (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1); SetValueFloat ($VarID_temp_warmw, $warmwassertemp); //echo "Wamrwassertemperatur: " . $warmwassertemp . "\n"; } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x21)){ $aussentemp = (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1); SetValueFloat ($VarID_temp_aussen, $aussentemp); } elseif (($arr[4] == 0x07) && ($arr[5] == 0x2d) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x1e)){ SetValueFloat ($VarID_temp_raum1, (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1)); } elseif (($arr[4] == 0x07) && ($arr[5] == 0x2d) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x93)){ SetValueFloat ($VarID_temp_raum1soll, (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1)); } elseif (($arr[4] == 0x07) && ($arr[5] == 0x2e) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x1e)){ SetValueFloat ($VarID_temp_raum2, (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1)); } elseif (($arr[4] == 0x07) && ($arr[5] == 0x2e) && ($arr[6] == 0x3d) && ($arr[7] == 0x05) && ($arr[8] == 0x93)){ SetValueFloat ($VarID_temp_raum2soll, (float) round(((($arr[10] * 256) + ($arr[11])) / 64),1)); } elseif (($arr[4] == 0x07) && ($arr[5] == 0x09) && ($arr[6] == 0x3d) && ($arr[7] == 0x30) && ($arr[8] == 0x34)){ //Betriebsanzeige FA (0 aus / 10 an) } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x07) && ($arr[8] == 0xaa)){ //Status Kessel } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x07) && ($arr[8] == 0xa2)){ //Status Trinkwasser } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x07) && ($arr[8] == 0xa4)){ //Status Heizkreis1 } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x07) && ($arr[8] == 0xa6)){ //Status Heizkreis2 } elseif (($arr[4] == 0x07) && ($arr[5] == 0x05) && ($arr[6] == 0x3d) && ($arr[7] == 0x00) && ($arr[8] == 0x99)){ //SW Diagnosecode } elseif (($arr[4] == 0x02) && ($arr[5] == 0x05) && ($arr[6] == 0x00) && ($arr[7] == 0x02) && ($arr[8] == 0x13)){ //echo "Brenner\n"; if ($arr[9] == 0x04){ SetValueBoolean($VarID_brenner,True); } elseif ($arr[9] == 0x00){ SetValueBoolean($VarID_brenner,False); } } else { echo "Zentrale: "; echo "Unknown - "; array_walk($arr, 'test_print'); echo "\n"; } } elseif ($arr[1] == 0x8a) { //echo "Bedienteil: "; if (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x0d) && ($arr[7] == 0x05) && ($arr[8] == 0x19)) { //echo "Kesseltemperatur?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x31) && ($arr[7] == 0x05) && ($arr[8] == 0x2f)) { //echo "Warmwassertemperatur?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x05) && ($arr[8] == 0x21)) { //echo "Aussentemperatur?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x2d) && ($arr[7] == 0x05) && ($arr[8] == 0x1e)) { //echo "Raumtemperatur1?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x2d) && ($arr[7] == 0x05) && ($arr[8] == 0x93)) { //echo "Raumtemperatur1soll?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x2e) && ($arr[7] == 0x05) && ($arr[8] == 0x1e)) { //echo "Raumtemperatur2?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x2e) && ($arr[7] == 0x05) && ($arr[8] == 0x93)) { //echo "Raumtemperatur2soll?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x09) && ($arr[7] == 0x30) && ($arr[8] == 0x34)) { //echo "Betriebsanzeige FA?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x07) && ($arr[8] == 0xaa)) { //echo "Status Kessel?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x07) && ($arr[8] == 0xa2)) { //echo "Status Trinkwasser?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x07) && ($arr[8] == 0xa4)) { //echo "Status Heizkreis1?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x07) && ($arr[8] == 0xa6)) { //echo "Status Heizkreis2?\n"; } elseif (($arr[4] == 0x06) && ($arr[5] == 0x3d) && ($arr[6] == 0x05) && ($arr[7] == 0x00) && ($arr[8] == 0x99)) { //echo "SW Diagnosecode?\n"; } elseif (($arr[4] == 0x02) && ($arr[5] == 0x05) && ($arr[6] == 0x00) && ($arr[7] == 0x00) && ($arr[8] == 0x6c)) { //echo "Zeit: "; //echo $arr[12] . "/" . $arr[11] . "/" . ($arr[10]+1900) . "-" . $arr[14] . ":" . $arr[15] . ":" . $arr[16] . "\n"; echo date("r",mktime($arr[14],$arr[15],$arr[16],$arr[11],$arr[12],($arr[10]+1900))) . "\n"; } else { echo "Bedienteil: "; echo "Unknown - "; array_walk($arr, 'test_print'); echo "\n"; } } else { echo "Sender unbekannt\n"; array_walk($arr, 'test_print'); echo "\n"; } } else { echo "CRC error\n"; } if (strlen($comm_part)>0) { SetValueString($VarID_commandpart,""); } } function test_alter(&$item1, $key) { $item1 = ord(~$item1); } function chr_reverse(&$item1, $key) { global $rev_comm; $rev_comm = $rev_comm . chr(ord(~$item1)); } function test_print($item2, $key) { //echo dechex($item2) . " "; echo substr("0" . dechex($item2), -2, 2) . " "; } function make_var($scriptID, &$arrt, $vname, $vtype, $vicon) { //global $scriptID; $VarID_check = @IPS_GetVariableIDByName($vname,$scriptID); if ($VarID_check === false) { //echo "\nException: " . $e->getMessage() . "\n"; $VarID_check = IPS_CreateVariable($vtype); IPS_SetParent($VarID_check,$scriptID); IPS_SetName($VarID_check, $vname); IPS_SetIcon($VarID_check, $vicon); } $arrt = $arrt + array($vname => $VarID_check); } function CRC16Normal($buffer) { $result = 0x0000; if ( ($length = strlen($buffer)) > 0) { for ($offset = 0; $offset < $length; $offset++) { $result ^= (ord($buffer[$offset]) << 8); for ($bitwise = 0; $bitwise < 8; $bitwise++) { if (($result <<= 1) & 0x10000) $result ^= CRC16POLYN; $result &= 0xFFFF; /* gut the overflow as php has no 16 bit types */ } } } return $result; } ?>