Anbindung WOLF Therme mittels eBus-Adapter und eBus-Modul

Hallo Leute,

anbei das Script um die Daten meines eBus-Adapters mittels Anbindung mit meinem eBus-Modul auszuwerten.

Es ist letztendlich eine Weiterentwicklung von diesem Thread (Dank an Wupperi, Helmut und all den anderen).
Habe noch einige neue Funktionen für die diversen verwendeten Datentypen hinzugefügt.
Auch einige neue Methoden entwickelt, um Werte auf Variablen zu schreiben und diese gegebenenfalls auch gleich mit dem richtigen DatenType und Profile anlegt.

Bei einigen Bezeichnern bin ich mir noch nicht ganz sicher, wenn also wer Verbesserungsvorschläge hat - immer her damit …

Zusätzliche Informationen gibts auch noch im WIKI

Installation:

[ul]
[li] Installation der IPSLibrary (wird für den IPSLogger benötigt)
[/li][li] Anlegen einer eBus Adapter Instance
[/li][li] Auswerte Script anlegen (siehe unten)
[/li][li] Event anlegen, damit das Script bei jeder Datenänderung getriggert wird
[/li][li] Variablen werden autom. angelegt, sobald das erste mal Daten für das entsprechende Feld empfangen werden
[/li][/ul]


<?php
    IPSUtils_Include ("IPSLogger.inc.php",  "IPSLibrary::app::core::IPSLogger");

    define ("HEATING_DT_STRING",            '~String');
    define ("HEATING_DT_DEGREE",            'Heating_Temperature');
    define ("HEATING_DT_PRESSURE",        'Heating_Pressure');
    define ("HEATING_DT_PERCENT",        'Heating_Percent');

    if ($IPS_SENDER == 'Variable' or $IPS_SENDER == 'RegisterVariable') {
       $data         = str_replace (" ", "", $IPS_VALUE);
       $rootId       = IPS_GetParent($IPS_SELF);
       $dataSender   = substr($data,0,2);
       $dataReceiver = substr($data,2,2);
       $dataCommand  = substr($data,4,4);
       $dataLen      = substr($data,8,2);
       $dataVal      = substr($data,10,(int)$dataLen*2);

        // Heating to Controller
        if ($dataCommand=='0503' and substr($data,10,2)=='01') {
            storeData('Data.Heating-Controller.HeatingCircuit Temperature',           decodeDATA1c($data,10),     $rootId, 20, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.ReturnCircuit Temperature',            decodeChar($data,11),       $rootId, 30, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.WaterCircuit Temperature',             decodeChar($data,12),       $rootId, 40, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.Outdoor Temperature',                  decodeSignedChar($data,13), $rootId, 50, HEATING_DT_DEGREE);
            
        // Controller to Heating
        } else if ($dataCommand=='0507') {
            storeData('Data.Controller-Heating.Heating Command',                      decodeData0507M6($data,6),  $rootId, 10, HEATING_DT_STRING);
            storeData('Data.Controller-Heating.Consumer Command',                     decodeData0507M7($data,7),  $rootId, 20, HEATING_DT_STRING);
            storeData('Data.Controller-Heating.HeatingCircuit Target Temperature',    decodeDATA2c($data, 8),     $rootId, 30, HEATING_DT_DEGREE);
            storeData('Data.Controller-Heating.HeatingCircuit Target Pressuer',       decodeDATA2b($data,10),     $rootId, 40, HEATING_DT_PRESSURE);
            storeData('Data.Controller-Heating.Water Target Temperature',             decodeDATA1c($data,13),     $rootId, 50, HEATING_DT_DEGREE);
            
        // System
        } else if ($dataCommand=='0700') {
            storeData('Data.System.Outdoor Temperature',                              decodeDATA2b($data,6),      $rootId, 10, HEATING_DT_DEGREE);
            
        // Identification
        } else if ($dataCommand=='0704') {

        // Controller to Controller
        } else if ($dataCommand=='0800') {
            storeData('Data.Controller-Controller.HeatingCircuit Target Temperature', decodeDATA2b($data, 6),     $rootId, 10, HEATING_DT_DEGREE);
            storeData('Data.Controller-Controller.Outdoor Temperature',               decodeDATA2b($data, 8),     $rootId, 20, HEATING_DT_DEGREE);
            storeData('Data.Controller-Controller.Water Target Temperature',          decodeDATA2b($data,12),     $rootId, 30, HEATING_DT_DEGREE);
        } else {
            IPSLogger_Inf(__file__, 'Unknown Command: '.$dataCommand.', Data='.$data);
        }

   }

    if ($IPS_SENDER == 'Execute') {
       // Testing ...
        echo decodeSignedChar('0F',1);
    }


    // ----------------------------------------------------------------------------------------------------------------
    function decodeSignedChar ($hexData, $byte) {
        $data     = substr(hexToStr($hexData), $byte-1,1);
       if (ord($data)== 0x80) {        //Ersatzwert
            $result = false;
       } else if ((ord($data) & 0x80) == 0x80) {        //Negativ
           $result = - ((~ ord($data)) & 0x000000ff);
       } else {
            $result = ord($data);
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeChar ($hexData, $byte) {
        $data     = substr(hexToStr($hexData), $byte-1,1);
       if (ord($data)== 0xFF) {        //Ersatzwert
            $result = false;
       } else {
          $result = ord($data);
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeByte ($hexData, $byte) {
       return decodeChar($hexData, $byte);
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData2b ($hexData, $byte) {     //data[0] = high, data[1]=low
        $data     = hexToStr($hexData);
       $lowByte  = substr($data, $byte-1,1);
       $highByte = substr($data, $byte,1);

       if (ord($highByte) == 0x80) {        //Ersatzwert
            $result = false;
       } else if ((ord($highByte) & 0x80) == 0x80) {        //high byte muss 0x80 sein
           $result = - (((~ ord($highByte)) & 0x000000ff) + ((((~ ord($lowByte)) & 0x000000ff) + 1) / 256));
       } else {
            $result = (ord($highByte))+ (ord($lowByte)/256) ; // High Byte plus (Low Byte / 256)
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData1c ($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
       $value = ord(hexToStr($data))/2;
        return $value;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData2c ($hexData, $byte) {
        $data     = hexToStr($hexData);
       $lowByte  = substr($data, $byte-1,1);
       $highByte = substr($data, $byte,1);

       if ((ord($data[0]) & 0x80) == 0x80) {
           $result = - ((((~ ord($highByte)) & 0x000000ff) * 16) + (((~ ord($lowByte)) & 0x000000f0) >> 4) + ((((~ ord($lowByte)) & 0x0000000f) + 1) / 16));
        } else {
           $result = (ord($highByte) * 16) + ((ord($lowByte) & 0xf0) >> 4) + ((ord($lowByte) & 0x0f) / 16);
        }
        return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData0507M6($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
        switch ($data) {
            case '00': $msg = 'Brenner ausschalten';  break;
            case '01': $msg = 'Keine Aktion';  break;
            case '55': $msg = 'Brauchwasserbereitung';  break;
          case 'AA': $msg = 'Heizbetrieb';  break;
         case 'CC': $msg = 'Emissionskontrolle';  break;
         case 'DD': $msg = 'TÜV-Funktion';  break;
         case 'EE': $msg = 'Reglerstop-Funktion';  break;
         case '66': $msg = 'Brauchwasserbereitung bei Reglerstop';  break;
         case 'BB': $msg = 'Brauchwasserbereitung bei Heizbetrieb';  break;
         case '44': $msg = 'Reglerstop-Funktion stufiger Betrieb';  break;
         default : $msg='-';
      }
      return $msg;
   }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData0507M7($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
        switch ($data) {
          case '00': $msg = 'Keine Aktion';  break;
         case '01': $msg = 'Ausschalten Kesselpumpe';  break;
         case '02': $msg = 'Einschalten Kesselpumpe';  break;
         case '03': $msg = 'Ausschalten variabler Verbraucher';  break;
         case '04': $msg = 'Einschalten variabler Verbraucher';  break;
         default : $msg='-';
      }
      return $msg;
   }


    // ----------------------------------------------------------------------------------------------------------------
    function storeData($path, $value, $rootId, $order, $dataType) {
       if ($value===false) {
          return; // Ersatzwert ...
       }
        $variableId = storeDataGetId($path, $rootId, $order, $dataType);
        switch ($dataType) {
           case HEATING_DT_DEGREE:
           case HEATING_DT_PERCENT:
           case HEATING_DT_PRESSURE:
              if (GetValue($variableId)<>$value) {
                    SetValueFloat($variableId, $value);
                }
              break;
            default:
              if (GetValue($variableId)<>$value) {
                    SetValue($variableId, $value);
                }
        }
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataGetId($path, $rootId, $order, $dataType) {
        $pathList   = explode('.',$path);
        $parentId = $rootId;
        foreach ($pathList as $idx=>$pathItem) {
           if ($idx == count($pathList)-1) {
               $variableId = @IPS_GetVariableIDByName($pathItem, $parentId);
               if ($variableId === false) {
                   $variableId = storeDataCreateVariable($pathItem, $parentId, $order, $dataType);
                }
            } else {
               $categoryId = @IPS_GetCategoryIDByName($pathItem, $parentId);
               if ($categoryId === false) {
                     $categoryId = IPS_CreateCategory();
                   IPS_SetName($categoryId, $pathItem);
                   IPS_SetParent($categoryId, $parentId);
                }
                $parentId = $categoryId;
            }
        }
        return $variableId;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataCreateVariable($name, $parentId, $order, $dataType) {
        switch ($dataType) {
           case HEATING_DT_STRING:
                 $variableId = IPS_CreateVariable(3);
              break;
           case HEATING_DT_DEGREE:
           case HEATING_DT_PRESSURE:
           case HEATING_DT_PERCENT:
                 $variableId = IPS_CreateVariable(2);
                 storeDataCreateProfile($dataType);
              break;
            default:
               IPSLogger_Err(__file__, 'Unknown Datatype '.$dataType);
        }
       IPS_SetName($variableId, $name);
       IPS_SetParent($variableId, $parentId);
       IPS_SetPosition($variableId, $order);
          IPS_SetVariableCustomProfile($variableId, $dataType);

        return $variableId;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataCreateProfile($dataType) {
        switch ($dataType) {
           case HEATING_DT_DEGREE:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' °C');
                IPS_SetVariableProfileIcon($dataType, 'Temperature');
              break;
           case HEATING_DT_PRESSURE:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' bar');
              break;
           case HEATING_DT_PERCENT:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' %');
              break;
            default:
        }
    }
    // ----------------------------------------------------------------------------------------------------------------
    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 hexToStr($hex) {
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2)
        {
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }

?>

Hallo Leute,

hab mal einige Funktionen für die Berechung der Checksumme gebastelt:



	// ----------------------------------------------------------------------------------------------------------------
	function build_crc_byte($byte, $crc) {
		$ChecksumArray = array (
		 0x00, 0x9B, 0xAD, 0x36, 0xC1, 0x5A, 0x6C, 0xF7, 0x19, 0x82, 0xB4, 0x2F, 0xD8, 0x43, 0x75, 0xEE,
		 0x32, 0xA9, 0x9F, 0x04, 0xF3, 0x68, 0x5E, 0xC5, 0x2B, 0xB0, 0x86, 0x1D, 0xEA, 0x71, 0x47, 0xDC,
		 0x64, 0xFF, 0xC9, 0x52, 0xA5, 0x3E, 0x08, 0x93, 0x7D, 0xE6, 0xD0, 0x4B, 0xBC, 0x27, 0x11, 0x8A,
		 0x56, 0xCD, 0xFB, 0x60, 0x97, 0x0C, 0x3A, 0xA1, 0x4F, 0xD4, 0xE2, 0x79, 0x8E, 0x15, 0x23, 0xB8,
		 0xC8, 0x53, 0x65, 0xFE, 0x09, 0x92, 0xA4, 0x3F, 0xD1, 0x4A, 0x7C, 0xE7, 0x10, 0x8B, 0xBD, 0x26,
		 0xFA, 0x61, 0x57, 0xCC, 0x3B, 0xA0, 0x96, 0x0D, 0xE3, 0x78, 0x4E, 0xD5, 0x22, 0xB9, 0x8F, 0x14,
		 0xAC, 0x37, 0x01, 0x9A, 0x6D, 0xF6, 0xC0, 0x5B, 0xB5, 0x2E, 0x18, 0x83, 0x74, 0xEF, 0xD9, 0x42,
		 0x9E, 0x05, 0x33, 0xA8, 0x5F, 0xC4, 0xF2, 0x69, 0x87, 0x1C, 0x2A, 0xB1, 0x46, 0xDD, 0xEB, 0x70,
		 0x0B, 0x90, 0xA6, 0x3D, 0xCA, 0x51, 0x67, 0xFC, 0x12, 0x89, 0xBF, 0x24, 0xD3, 0x48, 0x7E, 0xE5,
		 0x39, 0xA2, 0x94, 0x0F, 0xF8, 0x63, 0x55, 0xCE, 0x20, 0xBB, 0x8D, 0x16, 0xE1, 0x7A, 0x4C, 0xD7,
		 0x6F, 0xF4, 0xC2, 0x59, 0xAE, 0x35, 0x03, 0x98, 0x76, 0xED, 0xDB, 0x40, 0xB7, 0x2C, 0x1A, 0x81,
		 0x5D, 0xC6, 0xF0, 0x6B, 0x9C, 0x07, 0x31, 0xAA, 0x44, 0xDF, 0xE9, 0x72, 0x85, 0x1E, 0x28, 0xB3,
		 0xC3, 0x58, 0x6E, 0xF5, 0x02, 0x99, 0xAF, 0x34, 0xDA, 0x41, 0x77, 0xEC, 0x1B, 0x80, 0xB6, 0x2D,
		 0xF1, 0x6A, 0x5C, 0xC7, 0x30, 0xAB, 0x9D, 0x06, 0xE8, 0x73, 0x45, 0xDE, 0x29, 0xB2, 0x84, 0x1F,
		 0xA7, 0x3C, 0x0A, 0x91, 0x66, 0xFD, 0xCB, 0x50, 0xBE, 0x25, 0x13, 0x88, 0x7F, 0xE4, 0xD2, 0x49,
		 0x95, 0x0E, 0x38, 0xA3, 0x54, 0xCF, 0xF9, 0x62, 0x8C, 0x17, 0x21, 0xBA, 0x4D, 0xD6, 0xE0, 0x7B);

	   $result = ($ChecksumArray[ord($byte)] ^ $crc);
	   $result = ($ChecksumArray[$crc] ^ ord($byte));
	   return $result;
	}

	// ----------------------------------------------------------------------------------------------------------------
	function build_crc($message) {
		$crc = 0;
	   for ($i=0 ; $i<strlen($message) ; $i++) {
	      $crc = build_crc_byte(substr($message,$i,1), $crc);
	   }
	   return chr($crc);
	}

	// ----------------------------------------------------------------------------------------------------------------
	function add_crc($message) {
		return $message.build_crc($message);
	}

	// ----------------------------------------------------------------------------------------------------------------
	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 hexToStr($hex) {
	    $string='';
	    for ($i=0; $i < strlen($hex)-1; $i+=2) {
	        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
	    }
	    return $string;
	}


Aufruf zum Beispiel wie folgt:


COMPort_SendText (12345, add_crc(hexToStr("FFFE0902031601020F")));

Hallo,
ich habe den Adapter gebaut und super in IPS integriert.
Alle Daten die von der Wolf-Heizung versendet werden kann ich einwandfrei lesen. Wenn ich Daten anfordere funktioniert nur der Befehl 07 04 „Identifikation“
Alle anderen bringen keine Werte, nur das ACK („00“) ist erkennbar, aber keine Nutzdaten.
Hat da jemand eine Idee ??

Danke
Gruß Uwe

Hallo,

vielen Dank für den ebus-Adapter und dieses Script.:smiley:
Was das Lesen von Nachrichten angeht funktioniert soweit alles, um einen Überblick über die überhaupt gesendeten Befehle zu bekommen habe ich folgendes in das Script eingefügt:


//Variablen für alle gesendeten Befehlsgruppen anlegen und jeweils den letzten gesendeten Wert speichern
storeData('Data.Befehlsliste.'.$dataCommand, $data,     $rootId, 10, HEATING_DT_STRING);

Wenn ich etwas weiter bin werde ich diesen Punkt per Variable schaltbar machen.:rolleyes:
Ich habe eine Elco-Heizung mit Logon-M-Regler.
Dort werden leider nur die dokumentierten Befehle 0700,0801 und 0803 gesendet.
Die restlichen sind mit Primärbefehl 11. (1100 - 113A)

Eine Frage habe ich noch:

Gibt es die Möglichkeit eine CRC-Prüfung einzubauen oder frisst das zuviel Leistung?
Die geloggten Temperaturverläufe haben zwischendurch immr merkwürdige „Ausreißer“
Hatte auch überlegt, die maximale Änderung der Variablen zu begrenzen…

Gruß Matthias

Hallo Andreas,

ich will weiter am eBus für Vaillant arbeiten aber das ganze auf Perl-Basis.
Kannst Du mir kurz erklären wie sich die Checksumme errechnet? Oder bist Du gar so fit in perl das ganze auch in Perl zu übersetzten? Ich hab da noch nicht den 100%igen Durchblick und verstehe immer nur ein paar Bruchteile. Irgendwie fehlt mir da der Einstieg in die Logik deines PHP-Scriptes.

Gruß Mirko

@Mirko

Sorry, da muß ich passen, hab den Code selber wo im Netz gefunden und glaub ich nur mal auf die Schnelle auf PHP portiert. In Details der Berechnung hab ich mich auch nicht eingearbeitet.
Eventuell kannst Du die Portierung auf Perl genauso machen.

@Matthias

hab die CRC Berechnung erst später gemacht um auch mal Messages über den Bus senden su können. Du kannst die CRC Überprüfung einfach in das bestehende Script einfügen, zum Vergleich mußt Du noch das letzte Byte der Message extrahieren.

Hi Zusammen,

Ich hab mir jetzt mehrere Threads zum Thema eBus durchgelesen und weiß weniger als vorher :slight_smile:

Ich würde gerne wissen ob es jemand geschafft hat eine Wolf CGB K 20 lesend und schreibend in IPS zu integrieren, ich finde immer nur Aussagen zu lesendem Zugriff und ein paar Tests zu schreibendem, aber für mich irgendwie nicht ganz verständlich.

In erster Linie geht es mir um die Funktionen die Heizung Aus, nur Warmwasser oder komplett An schalten zu können, das Warmwasser kurzfristig hochheizen zu lassen und die eingestellten Heizzeiten anpassen zu können.*
Sehe ich das richtig, das ich also eher den Regler als die Heizung beschreiben können muss und ist das möglich?

Da ich aktuell einen ART 2A Raumregler zur Steuerung verbaut habe und somit das testen nicht nur den Kauf des ebus Adapters sondern (so wie ich das verstehe) auch den Kauf des BM Moduls beinhalten würde, wäre es natürlich im Vorfeld schön zu wissen ob das was ich vorhabe überhaupt machbar ist.

Würde mich freuen eine klare Antwort zu bekommen (Ja geht oder nein geht noch nicht)*

Schöne Grüße
BunnyMC

Meines Wissens ist das noch nicht möglich, da das spezifische Protokoll der Firma Wolf noch nicht bekannt ist.

Ich denke auch, dass die Steuerung vom Regler ausgeht und da die Heizzeiten direkt am Regler eingestellt werden, kann man da auch nichts mithorchen.

Vielen Dank für die Antwort. Dann werde ich wohl erstmal warten bis es etwas neues gibt.

Grüße
BunnyMC

Eventuell könnte man ja die Einstellungen der Heizzeiten mitlauschen, wenn man ein zweites Display/Raumregler in Betrieb hat. In diesem Falle müsste der zweite Regler (Slave) die Heizzeiten ja an den Master schicken.
Mir fehlt da aber die Hardware, um da weiter aktiv zu werden…

Und mir momentan Geld und Hardware :confused: eventuell werde ich Anfang 2013 auf’s BM Modul wechseln und meinen sani/Heizungsmann mal fragen ob er mir sein Test BM Modul mal leiht.

Hallo Gemeinde,

habe nun erfolgreich den e-Bus Adapter und das Skript aus dem ersten Beitrag eingebaut .

Das Skript wird auch bei Datenänderungen ausgeführt ABER es passiert weiter nix - nur eine leere meldung erscheint??

Benötige bitte hilfe. Hab ich beim String was falsch eingestellt?? Was bedeutet 0364B5120202FE98 ??

Bekomme leider das Skript nicht zum laufen.
Ist bestimmt eine Anfänger Frage, aber woher bekomme ich diese Datei???

include_once „IPSLogger.ips.php“;

Habe auch die IPSLibrary installiert aber dort konnte ich keine Möglichkeit finden diese Datei zu erstellen.

Woher kommen diese Befehle???
decodeDATA1c, decodeChar, decodeData0507M6, …
Wird hierfür die IPSLogger.ips.php benötigt?

Danke für Eure Hilfe!

Verwende für das Include des Loggers folgende Zeile:


	IPSUtils_Include ("IPSLogger.inc.php",  "IPSLibrary::app::core::IPSLogger");

Vielen Dank für die schnelle Antwort. Und schon bin ich wieder einen Schritt weiter :slight_smile: aber leider beim nächsten Problem :confused: .

Habe leider bis jetzt noch keine eBus Daten meiner Wolf Gastherme „decodieren“ können.
Somit versuche ich das Skript zu verstehen damit ich herausfinde an welcher Stelle welche Daten sind und wie die Daten dann umgerechnet werden (z.B. Hex nach Dec).

Die Befehle wie z.B. „storeData“ und „decode…“ scheint es bei mir nicht zu geben (undefined function).
Muss ich da noch irgendetwas installieren?

Im Anhang noch ein Log von meinen eBus Daten.
Ist es möglich daraus zu schließen ob die Daten „brauchbar“ sind??

Dankeschööön!

ebus_dump.txt (17.4 KB)

Die Funktionen befinden sich aber im Script (siehe erster Post), poste doch noch mal Dein verwendetes Script und die genaue Fehlermeldung (mit Stack).

Am Skript ist fast nicht verändert. Nur der Anfang:

<?
 // http://www.ip-symcon.de/forum/threads/15023-Anbindung-WOLF-Therme-mittels-eBus-Adapter-und-eBus-Modul
 $eBusMessage = $_IPS['VALUE'];
 SetValueString(44909 /*[UDP Socket (eBus Adapter)\RX_DATA]*/ , $eBusMessage);


 //include_once "IPSLogger.ips.php";
 IPSUtils_Include ("IPSLogger.inc.php",  "IPSLibrary::app::core::IPSLogger");

    define ("HEATING_DT_STRING",            '~String');
    define ("HEATING_DT_DEGREE",            'Heating_Temperature');
    define ("HEATING_DT_PRESSURE",        'Heating_Pressure');
    define ("HEATING_DT_PERCENT",        'Heating_Percent');

    if ($IPS_SENDER == 'Variable') {
       $data         = $eBusMessage;
       $rootId       = IPS_GetParent($IPS_SELF);
       $dataSender   = substr($data,0,2);
       $dataReceiver = substr($data,2,2);
       $dataCommand  = substr($data,4,4);
       $dataLen      = substr($data,8,2);
       $dataVal      = substr($data,10,(int)$dataLen*2);

...
...

Da das Skript durch die Register Variable getriggert wird sehe ich keine Ausgabe.
Vielleicht kommt aber auch nichts weil einfach die Daten nicht passen???

Um herauszufinden was die Befehle machen habe ich mir ein einfaches Skript gebastelt:

<?
 $rootId = 43102;
 IPSUtils_Include ("IPSLogger.inc.php",  "IPSLibrary::app::core::IPSLogger");
 $data = "00 11 22 33 44 55 66 77 88 99 00 11 22";
 storeData('Data.Heating-Controller.HeatingCircuit Temperature',           decodeDATA1c($data,10),     $rootId, 20, HEATING_DT_DEGREE);
?>

Und hier kommt dann der Fehler:
Fatal error: Call to undefined function storeData() in [.Skripte est] on line 5
Abort Processing during Fatal-Error: Call to undefined function storeData()
Error in Script C:\Programme\IP-Symcon_v2\scripts\43102.ips.php on Line 5

Was machen eigentlich die Befehle storeData usw. ???

na klar, im zweiten Script hast Du die Funktionen nicht eingebunden.

–> modifizier doch einfach das Register Script und starte es:


 <?php
   include_once "IPSLogger.ips.php";

    define ("HEATING_DT_STRING",            '~String');
    define ("HEATING_DT_DEGREE",            'Heating_Temperature');
    define ("HEATING_DT_PRESSURE",        'Heating_Pressure');
    define ("HEATING_DT_PERCENT",        'Heating_Percent');

    if ($IPS_SENDER == 'Execute') {
        $data = "00 11 22 33 44 55 66 77 88 99 00 11 22";
        storeData('Data.Heating-Controller.HeatingCircuit Temperature',           decodeDATA1c($data,10),     $rootId, 20, HEATING_DT_DEGREE);
    } elseif ($IPS_SENDER == 'Variable') {
       $data         = $IPS_VALUE;
       $rootId       = IPS_GetParent($IPS_SELF);
       $dataSender   = substr($data,0,2);
       $dataReceiver = substr($data,2,2);
       $dataCommand  = substr($data,4,4);
       $dataLen      = substr($data,8,2);
       $dataVal      = substr($data,10,(int)$dataLen*2);

        // Heating to Controller
        if ($dataCommand=='0503' and substr($data,10,2)=='01') {
            storeData('Data.Heating-Controller.HeatingCircuit Temperature',           decodeDATA1c($data,10),     $rootId, 20, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.ReturnCircuit Temperature',            decodeChar($data,11),       $rootId, 30, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.WaterCircuit Temperature',             decodeChar($data,12),       $rootId, 40, HEATING_DT_DEGREE);
            storeData('Data.Heating-Controller.Outdoor Temperature',                  decodeSignedChar($data,13), $rootId, 50, HEATING_DT_DEGREE);
            
        // Controller to Heating
        } else if ($dataCommand=='0507') {
            storeData('Data.Controller-Heating.Heating Command',                      decodeData0507M6($data,6),  $rootId, 10, HEATING_DT_STRING);
            storeData('Data.Controller-Heating.Consumer Command',                     decodeData0507M7($data,7),  $rootId, 20, HEATING_DT_STRING);
            storeData('Data.Controller-Heating.HeatingCircuit Target Temperature',    decodeDATA2c($data, 8),     $rootId, 30, HEATING_DT_DEGREE);
            storeData('Data.Controller-Heating.HeatingCircuit Target Pressuer',       decodeDATA2b($data,10),     $rootId, 40, HEATING_DT_PRESSURE);
            storeData('Data.Controller-Heating.Water Target Temperature',             decodeDATA1c($data,13),     $rootId, 50, HEATING_DT_DEGREE);
            
        // System
        } else if ($dataCommand=='0700') {
            storeData('Data.System.Outdoor Temperature',                              decodeDATA2b($data,6),      $rootId, 10, HEATING_DT_DEGREE);
            
        // Identification
        } else if ($dataCommand=='0704') {

        // Controller to Controller
        } else if ($dataCommand=='0800') {
            storeData('Data.Controller-Controller.HeatingCircuit Target Temperature', decodeDATA2b($data, 6),     $rootId, 10, HEATING_DT_DEGREE);
            storeData('Data.Controller-Controller.Outdoor Temperature',               decodeDATA2b($data, 8),     $rootId, 20, HEATING_DT_DEGREE);
            storeData('Data.Controller-Controller.Water Target Temperature',          decodeDATA2b($data,12),     $rootId, 30, HEATING_DT_DEGREE);
        } else {
            IPSLogger_Inf(__file__, 'Unknown Command: '.$dataCommand.', Data='.$data);
        }

   }




    // ----------------------------------------------------------------------------------------------------------------
    function decodeSignedChar ($hexData, $byte) {
        $data     = substr(hexToStr($hexData), $byte-1,1);
       if (ord($data)== 0x80) {        //Ersatzwert
            $result = false;
       } else if ((ord($data) & 0x80) == 0x80) {        //Negativ
           $result = - ((~ ord($data)) & 0x000000ff);
       } else {
            $result = ord($data);
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeChar ($hexData, $byte) {
        $data     = substr(hexToStr($hexData), $byte-1,1);
       if (ord($data)== 0xFF) {        //Ersatzwert
            $result = false;
       } else {
          $result = ord($data);
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeByte ($hexData, $byte) {
       return decodeChar($hexData, $byte);
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData2b ($hexData, $byte) {     //data[0] = high, data[1]=low
        $data     = hexToStr($hexData);
       $lowByte  = substr($data, $byte-1,1);
       $highByte = substr($data, $byte,1);

       if (ord($highByte) == 0x80) {        //Ersatzwert
            $result = false;
       } else if ((ord($highByte) & 0x80) == 0x80) {        //high byte muss 0x80 sein
           $result = - (((~ ord($highByte)) & 0x000000ff) + ((((~ ord($lowByte)) & 0x000000ff) + 1) / 256));
       } else {
            $result = (ord($highByte))+ (ord($lowByte)/256) ; // High Byte plus (Low Byte / 256)
       }
       return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData1c ($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
       $value = ord(hexToStr($data))/2;
        return $value;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData2c ($hexData, $byte) {
        $data     = hexToStr($hexData);
       $lowByte  = substr($data, $byte-1,1);
       $highByte = substr($data, $byte,1);

       if ((ord($data[0]) & 0x80) == 0x80) {
           $result = - ((((~ ord($highByte)) & 0x000000ff) * 16) + (((~ ord($lowByte)) & 0x000000f0) >> 4) + ((((~ ord($lowByte)) & 0x0000000f) + 1) / 16));
        } else {
           $result = (ord($highByte) * 16) + ((ord($lowByte) & 0xf0) >> 4) + ((ord($lowByte) & 0x0f) / 16);
        }
        return $result;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData0507M6($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
        switch ($data) {
            case '00': $msg = 'Brenner ausschalten';  break;
            case '01': $msg = 'Keine Aktion';  break;
            case '55': $msg = 'Brauchwasserbereitung';  break;
          case 'AA': $msg = 'Heizbetrieb';  break;
         case 'CC': $msg = 'Emissionskontrolle';  break;
         case 'DD': $msg = 'TÜV-Funktion';  break;
         case 'EE': $msg = 'Reglerstop-Funktion';  break;
         case '66': $msg = 'Brauchwasserbereitung bei Reglerstop';  break;
         case 'BB': $msg = 'Brauchwasserbereitung bei Heizbetrieb';  break;
         case '44': $msg = 'Reglerstop-Funktion stufiger Betrieb';  break;
         default : $msg='-';
      }
      return $msg;
   }

    // ----------------------------------------------------------------------------------------------------------------
    function decodeData0507M7($hexData, $byte) {
       $data = substr($hexData, $byte*2-2,2);
        switch ($data) {
          case '00': $msg = 'Keine Aktion';  break;
         case '01': $msg = 'Ausschalten Kesselpumpe';  break;
         case '02': $msg = 'Einschalten Kesselpumpe';  break;
         case '03': $msg = 'Ausschalten variabler Verbraucher';  break;
         case '04': $msg = 'Einschalten variabler Verbraucher';  break;
         default : $msg='-';
      }
      return $msg;
   }


    // ----------------------------------------------------------------------------------------------------------------
    function storeData($path, $value, $rootId, $order, $dataType) {
       if ($value===false) {
          return; // Ersatzwert ...
       }
        $variableId = storeDataGetId($path, $rootId, $order, $dataType);
        switch ($dataType) {
           case HEATING_DT_DEGREE:
           case HEATING_DT_PERCENT:
           case HEATING_DT_PRESSURE:
              if (GetValue($variableId)<>$value) {
                    SetValueFloat($variableId, $value);
                }
              break;
            default:
              if (GetValue($variableId)<>$value) {
                    SetValue($variableId, $value);
                }
        }
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataGetId($path, $rootId, $order, $dataType) {
        $pathList   = explode('.',$path);
        $parentId = $rootId;
        foreach ($pathList as $idx=>$pathItem) {
           if ($idx == count($pathList)-1) {
               $variableId = @IPS_GetVariableIDByName($pathItem, $parentId);
               if ($variableId === false) {
                   $variableId = storeDataCreateVariable($pathItem, $parentId, $order, $dataType);
                }
            } else {
               $categoryId = @IPS_GetCategoryIDByName($pathItem, $parentId);
               if ($categoryId === false) {
                     $categoryId = IPS_CreateCategory();
                   IPS_SetName($categoryId, $pathItem);
                   IPS_SetParent($categoryId, $parentId);
                }
                $parentId = $categoryId;
            }
        }
        return $variableId;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataCreateVariable($name, $parentId, $order, $dataType) {
        switch ($dataType) {
           case HEATING_DT_STRING:
                 $variableId = IPS_CreateVariable(3);
              break;
           case HEATING_DT_DEGREE:
           case HEATING_DT_PRESSURE:
           case HEATING_DT_PERCENT:
                 $variableId = IPS_CreateVariable(2);
                 storeDataCreateProfile($dataType);
              break;
            default:
               IPSLogger_Err(__file__, 'Unknown Datatype '.$dataType);
        }
       IPS_SetName($variableId, $name);
       IPS_SetParent($variableId, $parentId);
       IPS_SetPosition($variableId, $order);
          IPS_SetVariableCustomProfile($variableId, $dataType);

        return $variableId;
    }

    // ----------------------------------------------------------------------------------------------------------------
    function storeDataCreateProfile($dataType) {
        switch ($dataType) {
           case HEATING_DT_DEGREE:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' °C');
                IPS_SetVariableProfileIcon($dataType, 'Temperature');
              break;
           case HEATING_DT_PRESSURE:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' bar');
              break;
           case HEATING_DT_PERCENT:
                @IPS_CreateVariableProfile($dataType, 1);
                IPS_SetVariableProfileText($dataType, null, ' %');
              break;
            default:
        }
    }
    // ----------------------------------------------------------------------------------------------------------------
    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 hexToStr($hex) {
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2)
        {
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }

?> 

Ob Dein Adapter was sendet, kannst Du im Debug der Register Variable ansehen…

Also so wie das aussieht wird die if-Anfrage nicht getriggert. Ich denke es liegt an den Daten.
Auch im Debug Logging sehe ich keine Fehler wenn das Skript von der Register Variable getriggert wird.

Muß ich evtl. die Blanks aus meinen Daten machen? (00 11 22 33 => 00112233)
Oder stimmt was mit den Daten nicht?

Der Befehl „storedata“ würde doch eine Variable (Baum unter dem Skript) anlegen wenn ein Wert gefunden wird … oder?

ebus_dump.txt (17.4 KB)

Ja, die Blanks müssen auf jeden Fall weg