Da ich mich nicht mit fremden Federn schmücken will -> Wesentliche Teile dieses Skriptes kommen von Horst, um die eBus Informationen, an Hand von 2 eBus Service Beispielen von mir ergänzt.
Das Skript wird durch eine Registervariable getriggert, diese wiederum hängt am ComPort an den mit 2400/8/N/1 der Pegelwandler angeschlossen ist:
<?php
if ($IPS_SENDER == 'RegisterVariable')
{
$data = RegVar_GetBuffer($IPS_INSTANCE);
$data .= $IPS_VALUE;
if (strpos($data, chr(hexdec('AA'))) !== false)
{
$datasets = explode(chr(hexdec('AA')), $data);
for ($i = 0; $i < count($datasets) - 1; $i++)
{
$dataset = $datasets[$i];
if (strlen($dataset) >= 6 && ord($dataset[4]) <= 16 && strlen($dataset) >= 6 + ord($dataset[4]))
{
$telegram = array(
'QQ' => ord($dataset[0]),
'ZZ' => ord($dataset[1]),
'DH' => ord($dataset[2]),
'DU' => ord($dataset[3]),
'NN' => ord($dataset[4]),
'DATA' => substr($dataset, 5, ord($dataset[4])),
'CRC' => ord($dataset[5 + ord($dataset[4])])
);
if (strlen($dataset) > (6 + ord($dataset[4])) && (ord($dataset[6 + ord($dataset[4])]) == 255 || ord($dataset[6 + ord($dataset[4])]) == 0))
{
$telegram['ACK'] = ord($dataset[6 + ord($dataset[4])]) == 0;
}
parseTelegram($telegram);
}
}
$data = $datasets[count($datasets) - 1];
}
RegVar_SetBuffer($IPS_INSTANCE, $data);
}
function strToHex ($str)
{
$result = '';
for ($i = 0; $i < strlen($str); $i++)
{
$result .= strtoupper(((strlen(dechex(ord($str[$i]))) < 2) ? '0' : '').dechex(ord($str[$i]))).' ';
}
return $result;
}
function parseTelegram ($telegram)
{
//print_r($telegram);
//--------------------------------------------------- Service 0507 Start -------------------------------------------------------------------------
if ($telegram['DH'] == 0x05 && $telegram['DU'] == 0x07)
{
$service = "0507";
setvalue (21450 /*[Heizung\eBus\Services\Last Read Service]*/,$service);
switch (ord($telegram['DATA'][0]))
{
case 0x00: $meldung0 = 'Brenner ausschalten'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0x01: $meldung0 = 'Keine Aktion'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0x55: $meldung0 = 'Brauchwasserbereitung'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0xAA: $meldung0 = 'Heizbetrieb'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0xCC: $meldung0 = 'Emissionskontrolle'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0xDD: $meldung0 = 'TÜV-Funktion'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0xEe: $meldung0 = 'Reglerstop-Funktion'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0x66: $meldung0 = 'Brauchwasserbereitung bei Reglerstop'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0xBB: $meldung0 = 'Brauchwasserbereitung bei Heizbetrieb'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
case 0x44: $meldung0 = 'Reglerstop-Funktion stufiger Betrieb'; setvalue(40821 /*[Heizung\eBus\Services\0507\Status Wärmeanforderung]*/,$meldung0); break;
}
switch (ord($telegram['DATA'][1]))
{
case 0x00: $meldung1 = 'Keine Aktion'; setvalue (20586 /*[Heizung\eBus\Services\0507\Status Verbraucher]*/, $meldung1); break;
case 0x01: $meldung1 = 'Ausschalten Kesselpumpe'; setvalue (20586 /*[Heizung\eBus\Services\0507\Status Verbraucher]*/, $meldung1); break;
case 0x02: $meldung1 = 'Einschalten Kesselpumpe'; setvalue (20586 /*[Heizung\eBus\Services\0507\Status Verbraucher]*/, $meldung1); break;
case 0x03: $meldung1 = 'Ausschalten variabler Verbraucher'; setvalue (20586 /*[Heizung\eBus\Services\0507\Status Verbraucher]*/, $meldung1); break;
case 0x04: $meldung1 = 'Einschalten variabler Verbraucher'; setvalue (20586 /*[Heizung\eBus\Services\0507\Status Verbraucher]*/, $meldung1); break;
}
$Kesselsollwert_Temp = decodeDATA2c($telegram['DATA'][3].$telegram['DATA'][2]);
SetValue(32429 /*[Heizung\eBus\Services\0507\Kessel Sollwert Temperatur]*/ , $Kesselsollwert_Temp);
$Kesselsollwert_Druck = decodeDATA2b($telegram['DATA'][5].$telegram['DATA'][4]);
if ($Kesselsollwert_Druck == -128) {
$Kesselsollwert_Druck = "Ersatzwert";
}
SetValue(32845 /*[Heizung\eBus\Services\0507\Kessel Sollwert Druck]*/ , $Kesselsollwert_Druck);
if (ord($telegram['DATA'][6]) == 0xff) //abfangen Ersatzwert
{
$stellgrad = 'Ersatzwert';
}
else
{
$stellgrad = ord($telegram['DATA'][7])/2;
}
setvalue(32642 /*[Heizung\eBus\Services\0507\Stellgrad]*/, $stellgrad);
$brauchwassersolltemp = ord($telegram['DATA'][7])/2;
setvalue (12110 /*[Heizung\eBus\Services\0507\Brauchwasser Sollwert Temperatur]*/, $brauchwassersolltemp);
}
// ------------------------------------------------------------------------ Service 0507 Ende -----------------------------------------------------------------
// ------------------------------------------------------------------------ Service 0700 Start ---------------------------------------------------------------
if ($telegram['DH'] == 0x07 && $telegram['DU'] == 0x00)
{
$service = "0700";
setvalue (21450 /*[Heizung\eBus\Services\Last Read Service]*/,$service);
$Heizungsaussentemp = decodeDATA2b ($telegram['DATA'][1].$telegram['DATA'][0]);
setvalue (44308 /*[Heizung\eBus\Services\0700\Aussentemperatur Heizungsfühler]*/, $Heizungsaussentemp);
}
//--------------------------------------------------------------------------- Service 0700 Ende ----------------------
}
function decodeDATA2b ($data) //data[0] = high, data[1]=low
{
$result = false;
if ((ord($data[0]) & 0x80) == 0x80)//high byte muss 0x80 sein
{
$result = - (((~ ord($data[0])) & 0x000000ff) + ((((~ ord($data[1])) & 0x000000ff) + 1) / 256));
}
else
{
$result = (ord($data[0]))+ (ord($data[1])/256) ; // High Byte plus (Low Byte / 256)
}
return $result;
}
function decodeDATA2c ($data)
{
$result = false;
if ((ord($data[0]) & 0x80) == 0x80)
{
$result = - ((((~ ord($data[0])) & 0x000000ff) * 16) + (((~ ord($data[1])) & 0x000000f0) >> 4) + ((((~ ord($data[1])) & 0x0000000f) + 1) / 16));
}
else
{
$result = (ord($data[0]) * 16) + ((ord($data[1]) & 0xf0) >> 4) + ((ord($data[1]) & 0x0f) / 16);
}
return $result;
}
?>
An Horst nochmals herzlichen Dank für die Hilfe, hat mich auch Inhaltlich ein ganzes Stück weiter gebracht.