Temperaturwerte aus einem Pelletkessel der FA. ETA auslesen

Version 2.0

Hallo Freunde,

Ich habe mich mal mit dem Datenprotokoll der Fa. ETA beschäftigt. Und will meine Erfahrungen mit euch teilen.
Ich habe mir das Protokoll von ETA per Mail senden lassen.

Link: Protokoll gibt es auf Anfrage bei der Fa. ETA

  1. Hardware:
    An meinem Heizkessel (PE15) hängt hinten ein serielles Schnittstellenkabel raus.
    Da mein IPSymcon PC aber mindestens 10m weg ist, habe ich eine Velängerung gebaut.
    Es werden nur 3 Adern im 9-pol Sub D Stecker benötigt.

RX 2
TX 3
GND 5

  1. Software
    Als erstes muß in IPS eine „Serial Port“ Instance hinzugefügt werden. Die Parameter wie im Bild eingeben:

Danach eine „Cutter“ Instance anlegen mit dem eben angelegtem Serial Port verbinden und wie im Bild konfigurieren.
Da alle Daten die vom Kessel kommen, mit „{“ und „}“ begrenzt sind, läßt sich damit der Datenstring gut einsammeln und weiterverarbeiten.

Als letztes eine „Register Variable“ Instance anlegen und mit dem „Cutter“ verbinden.
Die Register Variable wie folgt konfigurieren.

Der Kessel sendet in einstellbaren Intervallen die gewünschten Parameter/Temperaturen.
Um dies zu veranlassen dieses Script einmalig ausführen:

<?
/*
File     : Datenanforderung_ETA.ips.php
*/
// Konfigurationsteil
$ID = 24136;  //Instances ID des COM-Ports
$Anzahl =11;  // Anzahl der Auszulesenden Parameter
$Para1 = 19;  //Abgastemperatur
$Para2 = 20;  //Kesseltemp
$Para3 = 21;  //Boilertemp
$Para4 = 22;  //Aussentemp
$Para5 = 23;  //Kesselvorlauf
$Para6 = 24;  //Vorlauftemperatur
$Para7 = 86;  //Pelletsvorrat
$Para8 = 18;  //Luftschieber in %
$Para9 = 28;  //Gebläsedrehzahl  in U/min
$Para10 = 63; //Behälterinhalt
$Para11 = 73; //Tag/Nacht Modus MK0
$Para12 = 53;
$Para13 = 54;
$Para14 = 55;
$Para15 = 56;
$Para16 = 57;
$Para17 = 58;
$Para18 = 59;
$Para19 = 70; //Tag/Nacht Modus Direktkreis

$HighByte = 0; //normalerweise immer 0
$Intervall = 90;  // RefreshTime , aller wieviele Sekunden sollen die Daten von der Heizung gesendet werden
$Node = 16;  //hier: Pelletkessel  bis 30kW(16 + 0 )
//NodeNr: Setzt sich aus der Grundnummer + der Knotenschalterstellung zusammen.

//Knotenschalter:
//Der Schalter (dip-Switch oder Drehschalter) befindet sich auf der Platine und steht standardmssig auf  0.

//Grundnummer:
//Scheitholzkessel: 0x08   (8 decimal)
//Pelletskessel bis 30 kW: 0x10  (16 decimal)
//Pelletskessel ab 35 kW: 0x18   (24 decimal)
//Hackgutfeuerung: Hauptplatine 0x18, Drehstromplatine 0x28
//Heizungserweiterung: 0x20   (32 decimal)

// Konfigurationsteil Ende

//Prüfsummenberrechnung
$PS = ($Anzahl * $Node) + ( $Anzahl * $HighByte) + $Intervall;
for ($i=1; $i<=$Anzahl; $i++)
  {
  $a = "Para" . $i;
  $PS = $PS + $$a;
  }
$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

//Datenstring "bauen"
//1. Byte     Startzeichen: immer { entspr. hex  0x7B
//2. und 3. Byte    Servicekennung    (hier: "MC")
//4. Byte      Anzahl der Nutzdatenbytes
//5. Byte      Prfsumme: alle Nutzdatenbytes addiert, modulo 256
//ab 6. Byte   Byte RefreshTime [sec.] (binr) und jeweils 3 byte Nutzdaten pro Parameter (1.Byte NodeNr (binr)  2. + 3. Byte: uword Monitorlistenindex (binr, zuerst HB,dann LB)
//letztes Byte    Stoppzeichen immer } entspr. hex  0x7D

$Daten ="{MC";                  //Startzeichen und Servicekennung
$Daten .= chr(1+($Anzahl*3));   //Anzahl der Nutzdatenbytes ( RefreshTime + Anzahl * 3 byte)
$Daten .= chr($PS);             //Prfsumme
$Daten .= chr($Intervall);
for ($i=1; $i<=$Anzahl; $i++)   //Die n Anzahl Parameter
  {
  $a = "Para" . $i;
  $Daten .= chr($Node) . chr($HighByte) . chr($$a);   //...jeweils 3 byte
  }
$Daten .= "}";                   //Stoppzeichen
//Datenstring "bauen" Ende

//Datenstring ausgeben
ComPort_SendText($ID, $Daten);

?>

Dieses Script muß nur einmal ausgeführt werden ( einfach 1x Execute drücken) ,
dann sendet der Kessel die Daten im eingestellten Intervall selbstständig.

Zum Ausschalten der Datenübertragung 1x folgendes Script ausführen:

<?
/*
File     : Datenanforderung_ETA_aus.ips.php
*/
$ID = 24136;
$Daten ="{ME";                //Startzeichen und Servicekennung
$Daten .= chr(0);             //Anzahl der Nutzdatenbytes
$Daten .= chr(0);             //Prüfsumme
$Daten .= "}";                //Stoppzeichen

ComPort_SendText($ID, $Daten);
?>

Das nächste Script empfängt den Datenstring, zerlegt ihn in die einzelnen Temperaturwerte und übergibt diese an IPS-Variablen.
Die Variablen werden nach fogendem Schema vom Script selbst angelegt:
Präfix + Monitorlistenindex (z.b. ETA.20)
Das Script wird aufgerufen wenn neue Daten am Serial Port ankommen.

 <?
/*
File     : COM_string_zerlegen.ips.php
Trigger  : durch Registermodul bei Dateneingang
dieses Script dient dazu den Datenstring der von der "ETA" Heizung gesendet wird,
in einzelne Variablen zu zerlegen*/

$Anzahl = 20;   // Anzahl der übertragenen Parameter
$COM_String = $_IPS['VALUE']; //übernahme des Datenstrings aus dem Registermodul!
$ID_Variablen_Kategorie = 12345;
/* ######## Einstellwerte ##############
Werte die z.b. am Bedienpult der Heizung eingestellt werden,
werden durch die Heizung mit der Kennung "MK" auf der Schnittstelle ausgegeben.
Hier werden diese in IPS Variablen abgespeichert.*/
if(substr($COM_String,0,2) == "MK") {
  $Index = 256 * ord($COM_String{5}) + ord($COM_String{6});
  $Value = 256 * ord($COM_String{7}) + ord($COM_String{8});
  ATN_SetValueByParentID("ETA.Set.".$Index, $Value, $ID_Variablen_Kategorie);
}
/*######### Fehlermeldungen ###########
Fehlermeldungen werden durch die Kennung "IM" auf der Schnittstelle ausgegeben
*/
if(substr($COM_String,0,2) == "IM") {     // Fehlermeldungen
  IPS_LogMessage( "ETA PE 15", substr($COM_String,4) );
  // Mail/SMS senden u.s.w
}
/*######### Messwerte############
Temperaturen und alle anderen Werte werden mit der Kennung "MD" ausgegeben
Abspeichern der Werte in IPS Variablen*/
if (strlen($COM_String) == $Anzahl *5 + 4   //kompletter Datensatz empfangen?
    AND substr($COM_String,0,2) == "MD")    //Kennung "MD"?
     {
    for ($i=01; $i<=$Anzahl; $i++){
      $Index = ord($COM_String{$i*5+1});
      $Value = 256 * ord($COM_String{$i*5+2}) + ord($COM_String{$i*5+3});
      if($Value >= 30000) {                 //Temperatur unter 0 C ?
        $Value = $Value - 65536;
      }
      switch ($Index) {
        Case 86:    //Pellettsvorrat
        Case 67:    //Restsauerstoffgehalt im Abgas in %
        Case 68:    //Gesamtverbrauch
            $Value = $Value / 100;
            break;
        Case 63:    //Behältervorrat
        Case 19:    //Abgastemperatur
        Case 20:    //Kesseltemperatur
        Case 23:    //Kesselvorlauf
        Case 18:    //Luftschieber
        Case 21:    //Warmwasser im Boiler
        Case 22:    //Aussentemperatur
        Case 24:    // Vorlauf MK0
            $Value = $Value / 10;
            break;
      }
    ATN_SetValueByParentID("ETA.".$Index, $Value, $ID_Variablen_Kategorie);
  }
}

function ATN_SetValueByParentID($Variable,$Wert,$ParentID){
	$id = @IPS_GetVariableIDByName($Variable,$ParentID);
   if($id == 0) {                         // wenn Variable fehlt: anlegen
   	if     (is_bool($Wert))   $typ = 0;
   	elseif (is_int($Wert))    $typ = 1;
   	elseif (is_float($Wert))  $typ = 2;
   	elseif (is_string($Wert)) $typ = 3;
      $id = IPS_CreateVariable($typ);
      IPS_SetParent($id,$ParentID);
      IPS_SetName($id,$Variable);
      IPS_SetInfo($id, "Diese Variable wurde Automatisch erstellt");
      }
   SetValue($id,$Wert);                   // Ausgabe der Werte
}
?>

Diese Variablen kann man im Dashboard oder WebInterface visualisieren.
temp_cr.jpg

Edit 14.02.2008
Script „verschönert“

Edit 16.02.2008:
Script angepasst da Temperaturwerte unter 0°C falsch angezeigt wurden

Edit 20.02.2008
kleiner Bug beseitigt

Edit 03.03.2008
Einbau Cutchars und Scriptanpassung

Edit 14.05.2008
Überarbeitete Scripte

Edit 15.03.2009
Änderung der Anleitung für Version 2.0

Edit 8.1.2018
Befehlsupdate
MfG
Attain

Hallo und willkommen im Forum…

Es freut mich, dass du deine Arbeit mit der community teilen magst. Nur vorsichtshalber frage ich mal:

Hast du geklärt ob du das Protokoll einfach weitergeben darfst?

Gruß,

Toni

… wir haben Kontakt zur Fa. ETA.
Die Protokolle sind „öffentlich“, jedoch sollten sie bei der Fa. ETA angefragt werden.

MST

Hallo Steiner,

Melde mich hier zum ersten Mal.
Was ich habe: Jalosiesteuerung 8x, Lichtsteuerung. Ausgabe erfolgt an eigenes µC System, 32 Kanäle; MEMPIO als Eingang, FHZ1300 für Sensoren
Was ich möchte: Mit mienem ETA PE15 Kessel kommunizieren (Temp. lesen), Kessel steht nahe bei IPS PC :slight_smile:

An wen soll ich mich bei der Firma ETA wenden um das Protokoll zu bekommen?
Grüße
adni

… Zentrale und durchfragen …

Hallo adni,

Ich hatte einfach eine Mail an kundendienst@eta.co.at mit meiner Anfrage gesendet. Am nächsten Tag war die Beschreibung im Postfach. Ich glaube zwar nicht , daß das alle Befehle sind. Aber für den Anfang hat es gereicht.

MfG
Attain

Guten Abend,

ich habe mal einige Sachen ausprobiert. Mit der Servicekennung „MJ“ kann man Heizungsparameter setzten. Die Heizung antwortet dann mit der Servicekennung „MK“ und dem übertragenen Parameter.
Was mir noch fehlt ist die Möglichkeit, die in der Heizung eingestellten Werte abzufragen, dann wäre es leicht ein Script zu schreiben um ein „Backup“ der Heizungseinstellungen zu machen. Hat jemand eine „ausführlichere“ Protokollbeschreibung?

HF
Attain

Hallo Attain,

Irgendwie bekomme ich die Kommunikation mit dem Kessel nicht hin, ich habe dein Script 1:1 übernommen (ausser InstanceID natürlich), da ich auch einen Pelletskessel unter 30kW habe. Nach dem Senden von MC… antwortet der Kessel auch alle 2min. mit MD…, die Daten sind aber irgendwie korrupt, siehe Mitschnitt des Hyperterminals. Beispiel: Warum bekomme ich nur 26 statt 35 Nutzbytes?

Beste Grüße
Adni

PS: Noch was, warum steht in COM_String _Zerlegen „{MD“, die { ist doch durch cutchar. schon weg??

Hi Adni,

Dein Datenstring ist so wie ich es erkennen kann 31 bytes lang.Obwohl das 4.Byte (Anzahl der Nutzdatenbytes) steht ein „#“ Zeichen und dies bedeutet 35. Ich gehe davon aus das Hyperterminal die HexWerte 0x00 nicht darstellt und damit der String kürzer aussieht. Hast Du die IPS Variablen angelegt? Dann müßten die Temperaturwerte dort eingetragen werden.

Richtig, hatte ich hier im Script vergessen zu ändern , da ich die Cutchars erst später eingebaut habe. Richtig muß es heißen:

if(substr($COM_String,0,2) == "MD")

Hallo Attain,

Logisch, die Variablen habe ich angelegt. Im Anhang ein Screenshot (mit den falschen Variablen-Werten). Ich bekomme einen Fehler, ich denke weil der String zu kurz ist.
Wie kann ich überprüfen ob Ausgangs- bzw. Eingangs-string korrekt sind (zB welches Terminalprogramm)?

Beste Grüße
Adni

Hallo Attain,

Ich nochmal, habs hinbekommen, der Stringoffset musste durch den Wegfall der „{“ noch angepasst werden. Also Vielen Dank fürs Schreiben des Scripts!!! Ich habe die angepasste Version angehängt:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : COM_String_Zerlegen.ips.php
Trigger  : 
Interval : 
*/
// dieses Script dient dazu den Datenstring der von der "ETA" Heizung gesendet wird in einzelne Variablen zu zerlegen
// diese Werden an IPS bergeben
//deswegen mssen in IPS die Variablen: Wert1.index.... bis Wert7.index als Integer angelegt werden
//und die Variablen: Wert1.value... bis Wert7.value als Float


//Konfigurationsteil
$Anzahl = 7;                              //Anzahl der verschiedenen Parameter(Temperaturen)
//Konfigurationsteil Ende
IPS_Sleep(200);
$COM_String = GetValueString("Com.Port"); //"Com.Port" ist meine Register Variable  , ggf. anpassen!!!
IPS_Sleep(100);

if(substr($COM_String,0,2) == "MD") {
  for ($i=01; $i<=$Anzahl; $i++) {
    SetValueInteger("Wert" . $i . ".index",ord($COM_String{$i*5+1}));      // Ausgabe der Indexnummer
    $Teiler = 10;                                                      // die Temperaturen werden in C * 10 bertragen -> Werte werden wieder durch 10 geteilt
    $Wert = 256 * ord($COM_String{$i*5+2}) + ord($COM_String{$i*5+3});
    if(ord($COM_String{$i*5+1}) == 86) { //Abfrage nach IndexNr.86 (Pelletsvorrat) , da dieser in tonnen * 100 bertragen wird
      $Teiler = 100;
      }
    if($Wert >= 30000) {                 //Temperatur unter 0 C ?
      $Wert = $Wert - 65536;
      }
    SetValueFloat("Wert" . $i . ".value",$Wert/$Teiler);  //Ausgabe der Temperatur/Pelletsvorrat
    }
  }
IPS_Sleep(100);
SetValueString("Com.Port","");     //Eingangspuffer leeren
?>

Hallo Adni

/me schlägt sich mit flacher Hand gegen den Kopf.
Richtig die Offsets müssen angepasst werden.Ich habe es im Orginalpost verändert.

Weiterhin solltest du noch folgendes einfügen:

if(substr($COM_String,0,2) == "IM") {     // Fehlermeldungen
  SetValueString("Com",substr($COM_String,2));
 }
if (strlen($COM_String) == $Anzahl *5 + 4)
{
.
.
.
  }

Damit werden zum einen Fehlermeldungen die vom Kessel kommen in die IPS Variable „Com“ geschrieben und es ist auch möglich, das daß „}“ mitten im Datenstring kommt und dadurch der Datenstring nicht komplett übertragen wird. Deswegen frage ich die Stringlänge ab.

Wie kann ich überprüfen ob Ausgangs- bzw. Eingangs-string korrekt sind (zB welches Terminalprogramm)?

Starte mal den Debugger. Und schaue mal unter der Instance ID des Cutchars. Da siehst Du auch die Stringlänge.

Hallo [b][b]adni,

bitte beim einstellen von Scripten die PHP Codeanweisung benutzen, damit alles lesbar ist. Ich habe Deine Message mal entsprechend abgeaendert.[/b]

[/b]

Danke für den Tipp die Fehlermeldungen mitzuloggen.
Eine Kleinigkeit noch, das hier fehlt in dem Codeupdate:


}
IPS_Sleep(100);
SetValueString("Com.Port","");     //Eingangspuffer leeren

PS: Torro, wie erwähnt, bin neu hier

Hallo,

kein Problem, klappt doch nun auch prima.

Guten Morgen,

ja das kann weggelassen werden, da durch den Cutchars die Variable überschrieben und die Daten nicht angehängt werden. Wenn der Puffer geleert wird, startet das Script noch einmal (wird durch „on change“ der Variable getriggert) und läuft ohne Wirkung durch. Man muß ja nicht Grundlos Rechnerlast erzeugen .

Gruß
Attain

Hi,

nun gibt es auch die Möglichkeit Schaltbefehle an den Kessel zu senden. Deswegen habe ich im Designer eine Combobox angelegt und kann damit eine Integervariable setzen.

Über den Set Button wird folgendes Script aktiviert:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Heizung_schalten.ips.php
Trigger  : Set Button im Designer
Interval : 
*/
$ID = 24136;             //COM.PORT ID

$Switch = GetValueInteger("Heizung.switch");
$Data1 = 0;
$Data0 = pow(2,$Switch);    //Potenz von 2
$PS = $Data0 % 256;         //Prüfsumme: Rest aus Division der Nutzdaten mit 256

If ($Switch >=1){
  $Daten ="{IH";                //Startzeichen und Servicekennung
  $Daten .= chr(2);             //Anzahl der Nutzdatenbytes
  $Daten .= chr($PS);           //Prüfsumme
  $Daten .= chr($Data0);        //Kennung
  $Daten .= chr($Data1);        //Kennung Highbyte
  $Daten .= "}";                //Stoppzeichen

  ComPort_SendText($ID, $Daten);
}
?>

Hinweis: Für die Modusumschaltung muß in der Heizungssteuerung der SMS Betrieb eingeschaltet werden.

Schalten.JPG

Hallo zusammen

Vorweg, ich bin neu hier :cool:

Ich hätt da mal ein paar Fragen zu IPS, da ich auch einen ETA Ofen habe, und mir schon mit .net ein paar sachen gepastelt habe, aber mir das etwas zu aufwändig war, hab ich jetzt einmal IPS zugelegt. Hab da aber leider schon ein paar Probleme damit.

Folgendes:
Es gibt die möglichkeit vom Ofen die möglichen Parameter auszulesen (Monitor Liste) da kommen dann allerhand daten daher, bei mir sinds um die 133 Zeilen indenen dann Name, index, Knoten, Teiler, IndexEbene usw… dreinnen stehen.

Jetzt würde ich gerne diese Monitor Liste in der Visualisierung darstellen, und dem Benutzer die Auszulesenden Wert auswählen lassen.(siehe Screenshot1, ist ein VB.NET Programm) Hab aber bist jetzt keine Möglichkeit gefunden, die Daten in einer art Array oder DataGrid zu speichern. Jetzt sagt ihr bestimmt, dass es arrays in php gibt. Ja, aber wie kann ich im IPS dynamisch Variablen erstellen, bzw. gibt so was wie ein array? oder wie würdet ihr das machen??
Screenshot2 = Eine bsp. Liste von meinem Ofen, bzw. der Monitor Liste :smiley:

Hallo,

herlulich willkommen erstmal in diesem Forum. Du hast Dich mit Sicherheit fuer die richtige Software entschieden und wirst auch bald wie viele der anderen hier im Forum vor Ideen sprudeln.

alles klar. Diese Daten werden wie ausgelesen? Ich nehme mal an, per COM Schnittstelle? Dann schreibst Du Dir dafuer ein kleines PHP Programm, welches per Timer jede Minute z.B. diese Daten ausliest und in IPS anzulegende Variablen ablegt. Somit hast Du immer aktuelle Werte in IPS zur Verfuegung. Wenn Du dann auch noch WIIPS installierst, kannst Du das ganze sogar noch grafisch in entsprechenden Graphen darstellen.

Es ist nicht notwendig, dem Benutzer zu sagen, frage mal das oder jedes ab. Das kann IPS schon selbst durchfuehren. Ich hoffe, Du verstehst, wie ich es meine.

HI Torro

Ja das ist richtig, ich bekommen die Daten per com1, die ich aber nur einmal auslesen brauche, da das die MonitorDaten der Anlage sind, quasie, das Inhaltsverzeichnis. So und da ist das PRoblem, du schreibst:
und in IPS anzulegende Variablen ablegt

Ok, und das sind bei mir in etwa 2000 Variablen, die muss ich nicht wircklich selbst anlegen?!?!