Auswertung eBus

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.

Wenn ich die verschiedenen Threads so lese, ist dein Skript aber für eine Wolf Heizung zugeschnitten richtig?

Bei meiner Vaillaint Ecotherm mit Auromatic 620 kann ich da wahrscheinlich nichts mit anfangen oder?

Habe gerade einen Adapter von Helmut vor mir liegen und wollte mal anfangen zu experimentieren.

Gruss,
Christian

Nö, Weishaupt

Du musst halt die für dich relevanten Services einfügen.

Willkommen im Club, viel Spass.

Ja, soweit der Versuch, siehe anderer Thread. Ich nehme mal an zur Auswertung der Slave Geschichten müsste man dein Skript umstricken oder?

Gruss,
Christian