Anbindung WOLF Therme mittels eBus-Adapter und eBus-Modul

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

Die Blanks sind jetzt raus, aber es kommen immer noch keine Daten.

 $eBusMessage = str_replace (" ", "", $eBusMessage);   // Remove Blanks

Es muß an den Daten liegen. Das „AA“ am Anfang ist bei mir raus.
Sieht das Log in Ordnung aus (Blanks sind jetzt aber raus).

Habe es jetzt doch noch hinbekommen … endlich bekomme ich Daten von meiner Wolf CGS-20/160+ Gastherme. :smiley: :smiley:

  1. Da ich den USB eBus-Adapter per UDP-Socket (eBus Connector von terenyi) über eine Register Variable auslese, musste ich natürlich den IPS_Sender auf „RegisterVariable“ stellen.
  2. Und die Blanks aus dem Datenstream vom eBus Connector herausgenommen werden.
  3. Und wie bereits weiter oben beschrieben musste die IPSLogger Library angepasst werden.

Anpassungen am Skript vom ersten Post (vielleicht auch für andere User interessant):

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

...
...

if ($IPS_SENDER == 'RegisterVariable') {
    $data  = str_replace (" ", "", $IPS_VALUE);
...
...

@Brownson: Vielen Dank für die Hilfe und das Skript!!!

Frage in die Runde: Gibt es bereits weitere Variablen welche vom Wolf System ausgelesen werden können? Brenner ein/aus bzw. Anzahl Brennerstarts wäre interessant. Danke!

Danke, hab Deine Änderungen mal in das Script eingepflegt

Hallo Andreas,

ich habe leider etwas voreilig die Version 3.0 von IPSymcon installiert. Vorsichtig gefragt: Wird das passende eBus Adapter Modul bald zur Verfügung stehen?

Ergänzung: Ich habe todesmutig die „alte“ Version von 2.7 installiert. Diese scheint zu funktionieren. Erst mal alles gut!

Beste Grüße

Michael

Hallo Michael,

Bei der IP-Symcon Version 3.0 gab es keine Änderungen in der API, darum gibt es auch keine spezielle EBusAdapter Version für die 3.0.

Hallo Andreas,

danke für die schnelle Info.

Ich habe mal neugierigerweise versucht, den Source zu kompilieren, erhalte aber
dabei die Fehlermeldung:

[DCC Fehler] UeBusAdapter.pas(95): E2003 Undefinierter Bezeichner: 'ConstructorPostProcess'
[DCC Fehler] UeBusAdapter.pas(107): E2003 Undefinierter Bezeichner: 'DestructorPreProcess'

Was mache ich falsch? Habe ich etwas übersehen?

Beste Grüße

Michael

Hi Zusammen,

ich habe es nun auch endlich mal geschafft meine alte Regelung gegen das BM Modul zu tauschen und das ganze mit dem eBus Koppler von eservice an IPS anzubinden.

Das ganze ist mit dem eBus Connector (UDP) in IPS eingebunden.

Ich habe nun allerdings 2-3 Fragen und hoffe einer von euch kann mit helfen.

Hardware: Wolf CGB-K-20
eBus Koppler USB
Wolf BM BedienModul 1 (Als Fernbedienung im Raum verbaut)

  1. Ich habe das Gefühl, das nicht alle Daten Empfangen werden
    Wenn ich am BM Modul mit die aktuellen Werte Anzeigen lasse bekommt der eBus Koppler nur in 50% der Fälle diese Nachrichten auch mit.
    Die Werte welche die Anlage sendet werden (soweit ich es feststellen kann) immer mitbekommen.
    Könnte es helfen am Trimpoti ein wenig zu justieren oder kann man sagen, dass sobald alle 4-5 Sekunden Nachrichten ankommen dort nichts zu verbessern ist?

  2. Die Nachrichten die von der Steuerung (BM Modul) zur Heizung abgefangen wurden können nicht stimmen (siehe Bild im Anhang)
    Wo könnte hier der Fehler liegen? In der Umrechnung des Scripts?
    Die „Water Target Temperature“ ist definitiv auf 54°C gesetzt im BM (wie man oben auch sehen kann), genauso glaube ich nicht das der „HeatingCircuit“ eine Target Temp von 3840°C haben soll :smiley:

  1. Hat einer von euch schon eine Möglichkeit gefunden die Schaltzeiten mit zu bekommen und diese zu hinterlegen? (Müsste ja bei Controller->Controller) mitgesendet werden. Desweiteren bin ich sehr daran interessiert die Heizung bzw. das Warmwasser von IPS aus anwerfen zu können. Hat einer von euch schon Erfolg dabei gehabt das über eBus zu realisieren?

Grüße
BunnyMC

Hi,

welche Daten können von den Wolfgeräten ausgelesen werden. Werden Daten von SM2 oder KM angezeigt?

LG Izack

Evtl. auch interessant