Hallo Spechtel,
wie versprochen meine Scripte:
Das Senden Script:
<?
/*=============================================================
ViessmannSenden - Martin Heinzel - 05.02.2013
Version: 0.1
Beschreibung:
Mit diesem Script werden Daten gesendet
Änderungen
----------
tt.mm.jjjj von Version x.x -> y.y
Beschreibung:
================================================================*/
// Variablen Deklaration --------------------------------------
// ID's
//--------------
$ID_Connect = 47954 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Connect]*/;
$ID_Connect_Done = 38994 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Connect_Done]*/;
$ID_Token = 24085 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Token]*/;
// Variablen
//--------------
$Connect_Done = GetValueBoolean($ID_Connect_Done);
$Connect = GetValueBoolean($ID_Connect);
$Token = GetValueInteger($ID_Token);
// Konstanten
//--------------
//-------------------------------------------------------------
require IPS_GetKernelDir()."scripts\\ViessmannVariablen.ips.php";
//--------------------------- Main ----------------------------
// Verbindung zu Viessmann herstellen
if(!$Connect_Done and !$Connect)
{
SetValueBoolean($ID_Connect, true);
}
// Verbindung zu Viessmann OK
if($Connect_Done)
{
Switch($Token)
{
//######### Temperaturen ##################
case 1:
// abfragen der Aussentemperatur
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Aussen_ACT );
break;
case 2:
// abfragen der Kesseltemperatur ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Kessel_ACT );
break;
case 3:
// abfragen der Kesseltemperatur SET
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Kessel_SET );
break;
case 4:
// abfragen der Speichertemperatur ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Speicher_ACT );
break;
case 5:
// abfragen der Speichertemperatur SET
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Speicher_SET );
break;
case 6:
// abfragen der Vorlauftemperatur ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Vorlauf_ACT );
break;
case 7:
// abfragen der Vorlauftemperatur SET
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Vorlauf_SET );
break;
case 8:
// abfragen der Rücklauftemperatur ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Temp_Ruecklauf_ACT );
break;
case 9:
// abfragen der Betriebsart ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 11);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Betriebsart_ACT );
break;
case 10:
// abfragen der Brennerstarts ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 13);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Brenner_Starts_ACT );
break;
case 11:
// abfragen der Brenner Stunden ACT
SetValueString(39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/, "");
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 13);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_Brenner_Stunden_ACT );
break;
case 12:
// Verbindung zu Viessmann abbauen
SetValueBoolean($ID_Connect, false);
SetValueInteger(21524 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_lenght]*/, 0);
SetValueInteger($ID_Token, 0);
COMPort_SendText(43855 /*[Viessmann]*/, IPS_DISCONNECT );
//IPS_SetScriptTimer($_IPS['SELF'], 30);
}
}
//------------------------- Main ENDE --------------------------
?>
Das Empfangen Script:
<?
/*=============================================================
ViessmannEmpfangen - Martin Heinzel - 05.02.2013
Version: 0.1
Beschreibung:
Dieses Script wertet die Empfangenen Daten der Viessmann aus.
Änderungen
----------
tt.mm.jjjj von Version x.x -> y.y
Beschreibung:
================================================================*/
// Variablen Deklaration --------------------------------------
// ID's
//--------------
$ID_Receive = 39800 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive]*/;
$ID_Connect = 47954 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Connect]*/;
$ID_Connect_Done = 38994 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Connect_Done]*/;
$ID_Token = 24085 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Token]*/;
$ID_TimeOutCounter = 17928 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\TimeOutCounter]*/;
$ID_CommFaultCounter = 34278 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\CommFaultCounter]*/;
$ID_TimeOut = 38680 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\TimeOut]*/;
$SID_ViessmannSenden = 25080 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\ViessmannSenden]*/;
$ID_Temp_Aussen_ACT = 40248 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Aussen_ACT]*/;
$ID_Temp_Kessel_ACT = 30466 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Kessel_ACT]*/;
$ID_Temp_Kessel_SET = 12619 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Kessel_SET]*/;
$ID_Temp_Speicher_ACT = 27117 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Speicher_ACT]*/;
$ID_Temp_Speicher_SET = 22278 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Speicher_SET]*/;
$ID_Temp_Vorlauf_ACT = 48976 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Vorlauf_ACT]*/;
$ID_Temp_Vorlauf_SET = 35626 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Vorlauf_SET]*/;
$ID_Temp_Ruecklauf_ACT = 43689 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Temp_Ruecklauf_ACT]*/;
$ID_Betriebsart_ACT = 50731 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Betriebsart_ACT]*/;
$ID_Brennerstarts_ACT = 40380 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Brennerstarts_ACT]*/;
$ID_Brenner_Stunden_ACT = 42523 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\Receive_Data\Brenner_Stunden_ACT]*/;
// Variablen
//--------------
$Receive = GetValueString($ID_Receive);
$Connect_Done = GetValueBoolean($ID_Connect_Done);
$Connect = GetValueBoolean($ID_Connect);
$Token = GetValueInteger($ID_Token);
$Receive_Byte = array();
$TimeOutCounter = GetValueInteger($ID_TimeOutCounter);
$CommFaultCounter = GetValueInteger($ID_CommFaultCounter);
// Konstanten
//--------------
//-------------------------------------------------------------
//--------------------------- Main ----------------------------
// Byteweise einlesen der Daten
for ($i = 0; $i < strlen($Receive); $i++)
{
// wandeln der einzelnen Zeichen von String in Hex
$Receive_Byte[$i] = dechex(ord(substr($Receive ,$i)));
//echo $Receive_Byte[$i]. "
";
}
// Wenn die Checksumme OK ist
if(checksum($Receive_Byte) == $Receive_Byte[strlen($Receive)-1])
{
//zurücksetzen des TimeOut Counters
SetValueInteger($ID_TimeOutCounter, 0);
//rücksetzen des TimeOut Flag
SetValueBoolean($ID_TimeOut, false);
Switch($Token)
{
//######### Temperaturen ##################
case 1:
// Auslesen der Aussentemperatur
ViesmannTemp($Receive_Byte, $ID_Temp_Aussen_ACT);
SetValueInteger($ID_Token, 2);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 2:
// Auslesen der Kesseltemperatur ACT
ViesmannTemp($Receive_Byte, $ID_Temp_Kessel_ACT);
SetValueInteger($ID_Token, 3);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 3:
// Auslesen der Kesseltemperatur SET
ViesmannTemp($Receive_Byte, $ID_Temp_Kessel_SET);
SetValueInteger($ID_Token, 4);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 4:
// Auslesen der Speichertemperatur ACT
ViesmannTemp($Receive_Byte, $ID_Temp_Speicher_ACT);
SetValueInteger($ID_Token, 5);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 5:
// Auslesen der Speichertemperatur SET
ViesmannTemp($Receive_Byte, $ID_Temp_Speicher_SET);
SetValueInteger($ID_Token, 6);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 6:
// Auslesen der Vorlauftemperatur ACT
ViesmannTemp($Receive_Byte, $ID_Temp_Vorlauf_ACT);
SetValueInteger($ID_Token, 7);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 7:
// Auslesen der Vorlauftemperatur SET
ViesmannTemp($Receive_Byte, $ID_Temp_Vorlauf_SET);
SetValueInteger($ID_Token, 8);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 8:
// Auslesen der Rücklauftemperatur ACT
ViesmannTemp($Receive_Byte, $ID_Temp_Ruecklauf_ACT);
SetValueInteger($ID_Token, 9);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 9:
// Auslesen der Betriebsart ACT
Switch($Receive_Byte[8])
{
case 0:
SetValueString($ID_Betriebsart_ACT, "Aus");
break;
case 1:
SetValueString($ID_Betriebsart_ACT, "Warmwasser");
break;
case 2:
SetValueString($ID_Betriebsart_ACT, "Warmwasser + Heizen");
}
SetValueInteger($ID_Token, 10);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 10:
ViesmannCount($Receive_Byte, $ID_Brennerstarts_ACT);
SetValueInteger($ID_Token, 11);
IPS_SetScriptTimer($_IPS['SELF'], 5);
break;
case 11:
$Count_HEX = $Receive_Byte[11].$Receive_Byte[10].$Receive_Byte[9].$Receive_Byte[8];
$Counter = hexdec($Count_HEX)/3600;
SetValueInteger($ID_Brenner_Stunden_ACT, (int)$Counter);
SetValueInteger($ID_Token, 12);
IPS_SetScriptTimer($_IPS['SELF'], 5);
}
}
// Wenn die Verbindung zu Viessmann herstellt ist
if($Connect_Done and $Connect and ($Token == 0))
{
//Erste Abfrage starten
SetValueInteger($ID_Token, 1);
IPS_SetScriptTimer($_IPS['SELF'], 5);
IPS_SetScriptTimer($SID_ViessmannSenden, 0);
}
// TimeOut
if($_IPS['SENDER'] == "TimerEvent")
{
//Erhöhen des TimeOut
if($TimeOutCounter <= 2)
{
$TimeOutCounter += 1;
SetValueInteger($ID_TimeOutCounter, $TimeOutCounter);
IPS_RunScript(25080 /*[Schäferweg\Dachgeschoss\Heizungsraum\Viessmann Heizung\ViessmannSenden]*/);
}
else
{
//zurücksetzen des TimeOut Counters
SetValueInteger($ID_TimeOutCounter, 0);
//erhöhen des gesamten Fault counters
$CommFaultCounter += 1;
SetValueInteger($ID_CommFaultCounter, $CommFaultCounter);
//setzen des TimeOut Flag
SetValueBoolean($ID_TimeOut, true);
//erhöhen des Token
if($Token <= 12)
{
$Token += 1;
SetValueInteger($ID_Token , $Token);
}
else
{
// Verbindung zu Viessmann beenden
SetValueBoolean($ID_Connect_Done, false);
}
}
}
//------------------------- Main ENDE --------------------------
//------------------------ Funktionen -------------------------
/**
* Returns the calculated checksum.
*
* @param Byte_array $Receive_Byte Array of the received Bytes
* @return Calculated checksum in hex
*/
function checksum($Receive_Byte)
{
// Prüfen der Lämge
$Receive_lenght = count($Receive_Byte);
// initialisieren der Checksumme
$checksum = 0;
// Aufaddieren der Byte's
for ($i = 2; $i < $Receive_lenght-1; $i++)
{
$checksum += hexdec($Receive_Byte[$i]);
}
// wandeln in hex und ausgeben der ersten beiden Zeichen
$checksum_hex = substr(dechex($checksum), -2);
//if(substr($checksum_hex, 0) == 0)
//{
// $checksum_hex = substr(dechex($checksum), -1);
//}
return $checksum_hex;
}
function ViesmannTemp($Receive_Byte, $ID)
{
$Temp_HEX = $Receive_Byte[9].$Receive_Byte[8];
$Temperatur = hexdec($Temp_HEX)/10.0;
SetValueFloat($ID, $Temperatur);
}
function ViesmannCount($Receive_Byte, $ID)
{
$Count_HEX = $Receive_Byte[11].$Receive_Byte[10].$Receive_Byte[9].$Receive_Byte[8];
$Counter = hexdec($Count_HEX);
SetValueInteger($ID, $Counter);
}
//--------------------- Funktionen ENDE ------------------------
?>
Das sind noch keine fertigen Scripte!!
Es sind nur Beispiele wie man Sendet und Empfängt.