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
- 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
- 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.
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