Temperaturwerte aus einem Pelletkessel der FA. ETA auslesen

Nette Anlage , glückwunsch.

  • Zirkulationspumpe mache ich nicht mit der Steuerung , sondern direkt aus IPS über 1-Wire. Da kann ich Dir nicht helfen.

  • Extra Laden: gibt es 2 Möglichkeiten.

  1. mit dem „IH“ Befehl Hier kann man das „extra Laden“ des Boilers nur starten:
$HighWert = 0 ; //Highbyte
$LowWert = 64;    //Lowbyte
$PS = ($HighWert + $LowWert) & 255;         //Prüfsumme: Rest aus Division der Nutzdaten mit 256
  $Daten ="{IH";                //Startzeichen und Servicekennung
  $Daten .= chr(2);             //Anzahl der Nutzdatenbytes
  $Daten .= chr($PS);           //Prüfsumme
  $Daten .= chr($LowWert);        //Kennung Lowbyte
  $Daten .= chr($HighWert);        //Kennung Highbyte
  $Daten .= "}";                //Stoppzeichen
  ComPort_SendText($ID, $Daten);
  1. Wie man auch die Set Werte verändern kann.
$Node = 16; // Knotennummer beim PE15 = 16
$Index = 108;  // beim PE15 "extra Laden" = 108
$HighWert = 0;
$LowWert = 1;  // 0 = AUS 1 = AN

//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes 
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

ComPort_SendText($ID, $Daten);

Ansonsten schau Dir mal das Protokoll an. Wenn Du es brauchst oder noch Fragen hast melde Dich einfach nochmal.

Gruß

Danke , das erste funktioniert schon mal…
Gruß Konny

Jetzt möcht ich es wieder ausschalten:

Prinzipprotokoll: zB: PC zu Eta {MJ 5 b 130 33 0 96 x x}

…aus Monitorliste:
Extra Laden

  • <MonitorRow>
    <ID>240</ID>
    <Knoten>24</Knoten>]
    <HByte>0</HByte>
    <LByte>87</LByte>
    <Ueberschrift>7</Ueberschrift>
    <Datentype>30</Datentype>
    <Unknown11>0</Unknown11>
    <Unknown12>0</Unknown12>
    <Teiler>1</Teiler>
    <IndexEbene>1</IndexEbene>
    <Name>Extra_laden</Name>
    </MonitorRow>

Nach deinem Script für PEK50 dann so abgeändert?


&lt;?

//Achtung mit Heizungserweiterung!
$Node = 24; // Knotennummer beim PEk50=24
$Index = 240;  // beim PEK50 "extra Laden" = 240
$index =87 ;//Index_LByte

$HighWert = 0;
$LowWert = 87;  // 0 = AUS     87 ??  = AN
$LowWert =0 ; //0=Aus 1=An

//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

ComPort_SendText(33341 /*[ETA_COM_Port]*/, $Daten);

?

Hab ich das richtig verstanden? Tauscht man low und high-Wert oder nimmt es automatisch den anderen Zustand im Wechsel an?

Gruß Konny

Index_LByte und LowByte verwechselt!

Hallo Konny,

das ist ein „bool“ Wert. Auch in der Steuerung kannst Du das nur auf „EIN/AUS“ setzen. Genauso ist das hier. Sendest Du „LowWert = 0“ -> AUS oder „LowWert = 1“ -> AN.

Gruß

wie kann ich den falschen Typ tauschen?

a-Objekt öffnen: nicht möglich (grau)
b-neu Anlegen, was passiert mit der $ID, wo greift welches script darauf zu?
c-Wert löschen, Typ in der Parameterliste ändern , neu anlegen lassen?

Gruß Konny

Hallo Konny,

ich gehe mal davon aus daß Du „ETA2IPS“ von Joachim nutzt. oder?
Ich habe mir das noch nicht angeschaut und weiß nicht was da passiert.

Gruß

„AAAH“ jetzt kapier ich’s langsam…

$LowWert = 0; // 0 = AUS
$LowWert = 1; // 1 = EIN

Danke

Ja, ist von Joachim…

Hallo Attain , hallo MistlJo

also die Zirkulationspumpe hätte ich auch…
allerdings drei Fragen zum Verständnis:

(ergänzt:Achtung Script stellt Gebläse und nicht Zirkulation!!!)

<?
//Zirkulation AN
//Achtung mit Heizungserweiterung!
$Node = 24; // Knotennummer beim PEK50=24
$Index = 54;  // beim PEK50 "Zirkulationspu" = 54
$HighWert = 0;
$LowWert = 1;  // 0 = AUS  Lbyte=104 ???

//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

ComPort_SendText(11111 /*[ETA_COM_Port]*/, $Daten);
echo "Eingeschaltet für 2 Minuten";
SetValueBoolean(22222 /*[ETA\Steuerung\Zirkulation\Zirkulation an]*/, true);


// Timer für 2 Minuten starten, dann ausschalten)
IPS_SetScriptTimer($IPS_SELF, 120);             //oder Variable mit Zeitangabe

switch ($IPS_SENDER)
{
    case "TimerEvent":
    $LowWert = 0;                                       // 0 = AUS  Analog oben
		$PS = $Node + $Index + $HighWert + $LowWert;
		$PS = $PS & 255;
		$Daten ="{MJ";
		$Daten .= chr(5);            
		$Daten .= chr($PS); 
		$Daten .= chr($Node);
		$Daten .= chr(00);  
		$Daten .= chr($Index);     
		$Daten .= chr($HighWert);
		$Daten .= chr($LowWert);
		$Daten .= "}";
    
                                   // An den ComPort oder extra Script aufrufen
ComPort_SendText(11111 /*[ETA_COM_Port]*/, $Daten);
		echo "ausgeschaltet";  //funktioniert irgendwie nicht
    IPS_SetScriptTimer($IPS_SELF, 0);
    break;
}

?>

Ergänzung, gleicher Fehler wie zuvor Index_LByte mit LowByte verwechselt!

Der Timer geht , aber nicht die Inhalte?

  1. Ist der LowWert gleich den LByte der Monitorliste?

  2. Wird die Bezeichnung Variablen da immer richtig ausgelesen?..
    Bei mir hatte nach dem Zirkulationstest die Heizung die Fehlermeldung „Gebläse blockiert“ ausgeschaltet, bis ich wieder die Funktion Zirkulation an (low=104) abgesetzt habe und die Heizung entascht und neugestartet habe. (Also Ursache könnte auch was anderes gewesen sein.)

3.Wäre es nicht eine Vereinfachung ein Sript zu entwickeln, dass die ganzen einfachen (An/Aus) Steuerbefehle einmal anlegt und dann nur die Befehlvariable abfrägt.
$ZirkulationEin="{MJ 5 1 2 3 4 5…}"
$ZirkulationAn="{MJ 5 6 7 8 9 0 …}"
$Befehlauswahl (gesetzt durch anklicken)=$ZirkluationEin
ComPort_SendText(11111 /[ETA_COM_Port]/, $Befehlauswahl);?

Gruß Konny

Ich hab’s jetzt so gelöst:

  1. Variable für ComPort_offen (für Testläufe)
  2. Timer für Zirkulationszeit
<?
//Zirkulation Starten
//Achtung mit Heizungserweiterung!
$Node = 24; // Knotennummer beim PEk50=24
$Index = 54;  // beim PEK50 "Zirkulation" = 54
$HighWert = 0;
$LowWert = 1;  // 0 = AUS  Lbyte=104 ???

//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

	if(GetValue(15745 /*[ETA\Steuerung\ComPort_Offen]*/)==1) //geändert
	{
  	ComPort_SendText(33341 /*[ETA_COM_Port]*/, $Daten);
	}
	echo "Zirkulation Ein geschaltet";
	SetValueBoolean(28906 /*[ETA\Steuerung\Zirkulation\Zirkulation an]*/, true);

IPS_RunScript(41193 /*[ETA\Steuerung\Zirkulation\TimerZirkulation]*/);

?>

Timer

<?

IPS_SetScriptTimer($IPS_SELF, GetValue(48630 /*[ETA\Steuerung\Zirkulation\TimerZirkulation\ZirkulationsZeit]*/));

switch ($IPS_SENDER)
{
    case "TimerEvent":
    SetValueBoolean(28906 /*[ETA\Steuerung\Zirkulation\Zirkulation an]*/, false);
    IPS_RunScript(35348 /*[ETA\Steuerung\Zirkulation\ZirkulationStop]*/);
    echo "Zirkulation gestoppt";
	 IPS_SetScriptTimer($IPS_SELF, 0);
    break;
}

?>

So wie geht es mit der Auswahl von bestimmten Werten z. B für Timer?

Gruß Konny
PS wenn ich zuviel schreibe, sagts mir ruhig…

Hallo Konny,

also das klappt so nicht:

if(15745==1)

Wenn dann höchstens so:

if(GetValue(15745) == 1)

keina Ahnung was „15745“ ist.

Mal ein Beispiel:

<?
If (IPS_SENDER == "TimerEvent"){ // wenn über Scripttimer aufgerufen wurde
  $LowWert = 0;
  IPS_SetScriptTimer($IPS_SELF, 0);
  echo "Zirkulation Aus geschaltet";
}
else{
  $LowWert = 1;
  IPS_SetScriptTimer($IPS_SELF, 20);
  echo "Zirkulation Ein geschaltet";
}



//Zirkulation Starten
//Achtung mit Heizungserweiterung!
$Node = 24; // Knotennummer beim PEk50=24
$Index = 54;  // beim PEK50 "Zirkulation" = 54
$HighWert = 0;
//$LowWert = 1;  // 0 = AUS  Lbyte=104 ???

//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

ComPort_SendText(33341 /*[ETA_COM_Port]*/, $Daten);
//    SetValueBoolean(28906 /*[ETA\Steuerung\Zirkulation\Zirkulation an]*/, true);

// IPS_RunScript(41193 /*[ETA\Steuerung\Zirkulation\TimerZirkulation]*/);

?> 

Nur weiß ich nicht ob das mit der Pumpe so klappt. Muß die nicht auf „100 %“ geschaltet werden?

Gruß

Hallo Attain,
ja war noch ein Fehler drin…hab ich beseitigt…Langsam kapier ich den Syntax:

das kann man sicherlich auch verbessen:

<?
//Solarpumpe umschalten: Pumpe1
//Achtung mit Heizungserweiterung!

$Node = 32; // Knotennummer beim PEk50=24 nach Monitorliste 32
$Index = 294;  // beim PEK50 "Koll.Pumpe1" = 294
$HighWert = 0;

//Status nachsehen, Gegenwert setzen
if (GetValueBoolean(41852 /*[ETA\Steuerung\SolarPumpen Umschalten\SolarPumpe1 Status]*/)==true)
	{
	$LowWert = 1;  // 0 = AUS
	}
else
	{
	$LowWert = 0;  // 1 = An
	}

echo "status = $LowWert 
 ";
//Prüfsummenberrechnung
$PS = $Node + $Index + $HighWert + $LowWert;

$PS = $PS & 255;    // Rest aus Division durch 256

//Prüfsummenberechnung Ende

$Daten ="{MJ";                  //Startzeichen und Servicekennung
$Daten .= chr(5);              //Anzahl der Nutzdatenbytes
$Daten .= chr($PS);             //Prüfsumme
$Daten .= chr($Node);
$Daten .= chr(00);            // Index Highwert
$Daten .= chr($Index);      // Index Lowwert
$Daten .= chr($HighWert);
$Daten .= chr($LowWert);
$Daten .= "}";

if(15745 /*[ETA\Steuerung\ComPort_Offen]*/==1)
{
  ComPort_SendText(33341 /*[ETA_COM_Port]*/, $Daten);
}

if ($LowWert==1)
	{
	echo "Solar-Pumpe1 auschalten 
";
	SetValueBoolean(41852 /*[ETA\Steuerung\SolarPumpen Umschalten\SolarPumpe1 Status]*/, false);
	}
else
	{
	echo "Solar-Pumpe1 einschalten 
";
	SetValueBoolean(41852 /*[ETA\Steuerung\SolarPumpen Umschalten\SolarPumpe1 Status]*/, true);
	}

?>

Ich möchte es nutzen um bei einer bestimmten Diffenztemperatur von Boiler auf Puffer umzuschalte… (nicht erst wenn dieser 60° hat)

<?
 $BoilerOben=getValueFloat(35877 /*[ETA\Aktuelle Werte\Warmwasser\ETA_Wert_070_Boiler\ETA_Wert_070_Boiler]*/);
 $BoilerSolar=GetValueFloat(50594 /*ETA_Wert_106_Boiler_untSolar*/);
 $BoilerUnten=GetValueFloat(53646 /*[ETA\Aktuelle Werte\Warmwasser\ETA_Wert_071_Boiler_unten\ETA_Wert_071_Boiler_unten]*/ );

 $PufferOben=GetValueFloat(34251 /*[ETA\Aktuelle Werte\Puffer\ETA_Wert_068_Puffer_oben\ETA_Wert_068_Puffer_oben]*/);
 $PufferSolar=GetValueFloat(26691 /*ETA_Wert_108_Puffer_untSolar*/);
 $PufferUnten=GetValueFloat(13505 /*ETA_Wert_069_Puffer_unten*/);

 $SolarPumpe1=GetValueFloat(36804 /*ETA_Wert_114_Koll.pumpe_1*/);
 $SolarPumpe2=GetValueFloat(29485 /*ETA_Wert_115_Koll.pumpe_2*/);
 $UmschaltDiffWunsch=GetValueFloat(15533 /*DifferenzTemperatur*/);
 
 $MischTempBoiler=($BoilerSolar+$BoilerUnten)/2;
 $MischTempPuffer=($PufferSolar+$PufferUnten)/2;

 $DiffMisch=$MischTempBoiler-$MischTempPuffer;

  echo " Boiler Oben   $BoilerOben ° 
";
  echo " Boiler Mitte  $BoilerSolar ° 
";
  echo " 	Boiler Misch  $MischTempBoiler ° 
";
  echo " Boiler Unten  $BoilerSolar ° 
";
  echo "
";
  echo " Puffer Oben   $PufferOben ° 
";
  echo " Puffer Mitte  $PufferSolar ° 
";
  echo " 	Puffer Misch  $MischTempPuffer ° 
";
  echo " Puffer Unten  $PufferSolar ° 
";
  
  echo "Differenz größer als $UmschaltDiffWunsch ° 
";
  echo "          nämlich bei $DiffMisch ° 
";
  echo " Die Pumpe wird auf Puffer umgeschalten !";
  IPS_RunScript(12345 /*[Pumpen Umschalten]*/);
  ?>

in etwa so…
Boiler Oben 53.8 °
Boiler Mitte 53 °
Boiler Misch 53.6 °
Boiler Unten 53 °

Puffer Oben 54.2 °
Puffer Mitte 29.2 °
Puffer Misch 28.6 °
Puffer Unten 29.2 °
Differenz größer als 10 °
nämlich bei 25 °
Die Pumpe wird auf Puffer umgeschalten !

Da fällt mir ein… muss noch die Kollektortemperatur mit verbinden…
zur Pumpe 100% war ja die Frage nach dem LByte… ist dann LowWert=100?

Gruß Konny

Ich steh da vor einer Wand

Ist der abhängig von der Variablen in der Werteliste:

bei Boolean 1=an
bei Float z.B $LowWert = 100; // 100= 100% ?

Gruß Konny

Hallo Konny,

gut das Du weiterkommst.

Ja, 100% wird als $LowWert = 100 übertragen.
Mach mal folgendes:
Du hat doch ein Script das gestartet wird wenn Daten über den Com Port kommen ( ist in der Register Variablen eingetragen) Erweitere mal dieses um folgende Zeilen:

switch (substr($IPS_VALUE,0,2)) {
  Case "MK":  //Einstellwerte
    $Index = 256 * ord($IPS_VALUE{5}) + ord($IPS_VALUE{6});
    $Value = 256 * ord($IPS_VALUE{7}) + ord($IPS_VALUE{8});
    $Index = sprintf("%03s", $Index); // Auf 3 Stellen auffüllen mit Nullen
    IPS_LogMessage("Heizung Setwert Nr.: $Index"," Wert = : $Value ");
  break;
}

Dann gehst Du in den Keller - schaltest die Pumpe Ein - schaltest diese wieder Aus und schaust im Logfile oder wenn Du die IPS Console offen hast unter „Meldungen“ bei welchem Index welcher Wert übertragen wird.

Diese mußt Du dann im Script eintragen.

Gruß

Krieg ich nicht hin:

  1. welches script
  2. Bei SCR_ComStringZerlegen, funktionierts es nicht (zumindest ab Ende angefüht…)

Auch stimmt irgendwas mit dem Pufferpumpenwert nicht…Vielleicht ist es der Bypassmischer??
Oder (1=an)+x% Laufleistung??

Gruß Konny
PS hab inzwischen auch meine PV dran…:slight_smile:

Zeig mal „SCR_ComStringZerlegen“, kannst Du mir auch per PN senden.

Gruß
Attain

Original von MistlJo:

<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : SCR_ComStringZerlegen.ips.php
Trigger  : On Change "ETA_COM_Port" , kein Timer!!
Interval : -
dieses Script dient dazu den Datenstring der von der "ETA" Heizung gesendet wird in einzelne Variablen zu zerlegen
Version: 1.2
Mistljo | 23.05.2008 | Umbau auf XML für MonitorListe
Mistljo | 28.10.2010 | cleanup
-
*/


//Todo:
//Manchmal wird eine Variable "Anlagenkonfiguration" angelegt, warum?
//Teilweise werden Sonderzeichen zurückgeliefert (Umlaute oder <>) diese müssen noch gefiltert werden
// Prüfsummenprüfung ändern, Abfragen müssen mit fixer Länge abgefragt werden...


require 'SCR_EtaFunctions.ips.php';

$ETA_ComID = GetObjectID("ETA_COM_Port",""); //Instances ID des COM-Ports
//$buf .= $IPS_VALUE;
$COM_String = RegVar_GetBuffer(GetObjectID("ETA/Variablen/Allgemein/ETA_COM_RegisterVariable"));
$COM_String .= $IPS_VALUE;

//Variable Deklatation
$SummeDerNutzdaten = 0;

// ETA Fehlermeldungen
if(substr($COM_String,0,2) == "IM") {
      write_error(substr($COM_String,4),1); // 2= General 1= ETA Alarm
}


// MonitorListe neue Zeile
if(substr($COM_String,0,2) == "Mb") {

      //Ende der MonitorListe wurde erreicht
      if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
         ParameterHolenSTOPP($ETA_ComID);
         SetValueInteger('MonitorListeID', 0);
      	write_error("Monitorliste wurde erstellt.",3);
			SetValueBoolean('Datenabfrage',false);
      }  else {
//Todo:
//Prüfsumme stimmt nicht bei den Expert einstellungen
        /*  //DatenPrüfsumme testen
         $NutzdatenAnzahl =  ord($COM_String{2});

         $EmpfangenePruefsumme = ord($COM_String{3});
         // Summe der Nutzdaten
         for($i=4; $i <= $NutzdatenAnzahl+5; $i++) {
            $SummeDerNutzdaten = $SummeDerNutzdaten + ord($COM_String{$i});
         }
         $ErrechnetePruefsumme = $SummeDerNutzdaten%256;
         //Zeile in XML Datei einfügen
*/
//Prüfsumme stimmt nicht bei den Expert einstellungen
			//if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
             //IfVarNotExistCreateNewOne('MonitorListeID',1,0);
             SetValueInteger('MonitorListeID', GetValueInteger("MonitorListeID")+1);
            $xml = simplexml_load_file('Monitorliste.xml');
            $Row = $xml->addChild('MonitorRow');
				//ID erstellen, und nullen vorne anhängen
				if (strlen(GetValueInteger("MonitorListeID")) == 1) {
            	$Row->addChild('ID', "00" . GetValueInteger("MonitorListeID"));
            } else if (strlen(GetValueInteger("MonitorListeID")) == 2) {
            	$Row->addChild('ID', "0" . GetValueInteger("MonitorListeID"));
				} else if (strlen(GetValueInteger("MonitorListeID")) == 3) {
					$Row->addChild('ID', GetValueInteger("MonitorListeID"));
				}
            $Row->addChild('Knoten', ord($COM_String{4}));
            $Row->addChild('HByte', ord($COM_String{5}));
            $Row->addChild('LByte', ord($COM_String{6}));
            $Row->addChild('Ueberschrift', ord($COM_String{7}));
            $Row->addChild('Datentype', ord($COM_String{8}));
            $Row->addChild('Unknown11', ord($COM_String{9}));
            $Row->addChild('Unknown12', ord($COM_String{10}));
            $Row->addChild('Teiler', ord($COM_String{11}));
            $Row->addChild('IndexEbene', ord($COM_String{12}));

            $RowName = rtrim(substr($COM_String,13,32));
            $RowName = str_replace(" ", "_", $RowName);
            $Row->addChild('Name', utf8_encode($RowName));
            $xml->asXML('Monitorliste.xml');
				write_error("Neuer Wert: ID: ".GetValueInteger("MonitorListeID")." Name: ".$RowName ,3);
            MonitorListe_weiterenParameterHolen($ETA_ComID);
         //}
      }
}


// ParameterListe neue Zeile
if(substr($COM_String,0,2) == "Mg") {

      //Ende der ParameterListe wurde erreicht
      if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
         ParameterHolenSTOPP($ETA_ComID);
         SetValueInteger('ParameterListeID', 0);
      	write_error("Parameter Liste wurde erstellt.",3);
			SetValueBoolean('Datenabfrage',false);
			// **********Weiterführung der Abfrage
			// ********** Parameter Index Liste wird geladen
			write_error("Parameter Index Liste wird geladen...:",3);
//leeres XML File
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<ParameterIndexListe>
</ParameterIndexListe>
XML;


//Wenn kein XML File vorhanden dann neues erstellen
   if (file_exists('ParameterIndexListe.xml')) {
      echo "Parameter Index Liste bereits vorhanden";
   } else {
   write_error("Parameter Index Liste wird erstellt...",3);
      $xml = new SimpleXMLElement($xmlstr);
      $xml->asXML('ParameterIndexListe.xml');
      //Befehl schicken
            Datenanfodern_STOP($ETA_ComID);
           $ParameterIndexListeStart ="{MH";
  			  $ParameterIndexListeStartBytes = chr(01) . chr(00) . chr(00);
           $ParameterIndexListeEndZeichen = "}";
            //Zusammensetzen
            $Daten = $ParameterIndexListeStart . $ParameterIndexListeStartBytes . $ParameterIndexListeEndZeichen;
            $MonitorListeStatus = false;
            ComPort_SendText($ETA_ComID, $Daten);
   }
			
      }  else {
 /*               //DatenPrüfsumme testen
         $NutzdatenAnzahl =  ord($COM_String{2});

         $EmpfangenePruefsumme = ord($COM_String{3});
         // Summe der Nutzdaten
         for($i=4; $i <= $NutzdatenAnzahl+5; $i++) {
            $SummeDerNutzdaten = $SummeDerNutzdaten + ord($COM_String{$i});
         }
         $ErrechnetePruefsumme = $SummeDerNutzdaten%256;*/
         //Zeile in XML Datei einfügen
//ToDO:
//Prüfsumme stimmt nicht bei den Expert einstellungen
			//if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
             //IfVarNotExistCreateNewOne('EinstellwertListeID',1,0);
             SetValueInteger('ParameterListeID', GetValueInteger("ParameterListeID")+1);

            $xml = simplexml_load_file('ParameterListe.xml');
            $Row = $xml->addChild('ParameterListRow');
            $Row->addChild('ID', GetValueInteger("ParameterListeID"));
            $Row->addChild('Knoten', ord($COM_String{4}));
            $Row->addChild('Index_HByte', ord($COM_String{5}));
            $Row->addChild('Index_LByte', ord($COM_String{6}));
            $Row->addChild('Datentyp', ord($COM_String{7}));
            $Row->addChild('Einheit', ord($COM_String{8}));
            $Row->addChild('UN9', ord($COM_String{9}));
            $Row->addChild('UN10', ord($COM_String{10}));
            $Row->addChild('Teiler', ord($COM_String{11}));
            $Row->addChild('min_Wert_HByte', ord($COM_String{12}));
            $Row->addChild('min_Wert_LByte', ord($COM_String{13}));
            $Row->addChild('max_Wert_HByte', ord($COM_String{14}));
            $Row->addChild('max_Wert_LByte', ord($COM_String{15}));
            $Row->addChild('std_Wert_HByte', ord($COM_String{16}));
            $Row->addChild('std_Wert_LByte', ord($COM_String{17}));
            $Row->addChild('akt_Wert_HByte', ord($COM_String{18}));
            $Row->addChild('akt_Wert_LByte', ord($COM_String{19}));
            $Row->addChild('Ebene', ord($COM_String{20}));
            
            $RowName = rtrim(substr($COM_String,21,40));
            $RowName = str_replace(" ", "_", $RowName);
            $Row->addChild('Name', utf8_encode($RowName));
            $xml->asXML('ParameterListe.xml');
            write_error("Parameter Liste LOG: ".$RowName,3);
         //}
         //SetValueString ("MonitorListe" , substr($COM_String,13,32));
         Parameter_Liste_weiterenParameterHolen($ETA_ComID);
      }
}

// Paramenter Index Liste weiteren Wert holen
// Noch fehler in der Prüfsumme ( End Zeichen } wird übermittelt.
if(substr($COM_String,0,2) == "Mi") {

      //Ende der ParamenterListe wurde erreicht
      if(ord($COM_String{2}) == 0 AND ord($COM_String{3}) == 0) {
         ParameterHolenSTOPP($ETA_ComID);
         SetValueInteger('ParameterIndexListeID',0);
         write_error("Parameter Index Liste fertig geladen.",3);
      }  else {
                //DatenPrüfsumme testen
/*         $NutzdatenAnzahl =  ord($COM_String{2});

         $EmpfangenePruefsumme = ord($COM_String{3});
         // Summe der Nutzdaten
         for($i=4; $i <= $NutzdatenAnzahl+5; $i++) {
            $SummeDerNutzdaten = $SummeDerNutzdaten + ord($COM_String{$i});
         }
         $ErrechnetePruefsumme = $SummeDerNutzdaten%256;
         //Zeile in XML Datei einfügen
*/
			//if($EmpfangenePruefsumme == $ErrechnetePruefsumme) {
             //IfVarNotExistCreateNewOne('EinstellwertListeID',1,0);
             SetValueInteger('ParameterIndexListeID', GetValueInteger("ParameterIndexListeID")+1);

            $xml = simplexml_load_file('ParameterIndexListe.xml');
            $Row = $xml->addChild('ParameterListIndexRow');
            $Row->addChild('ID', GetValueInteger("ParameterIndexListeID"));
            $Row->addChild('Knoten', ord($COM_String{4}));
            $Row->addChild('HByte', ord($COM_String{5}));
            $Row->addChild('LByte', ord($COM_String{6}));
            $RowName = rtrim(substr($COM_String,7,40));
            $RowName = ltrim(substr($COM_String,7,40),"_");
            $RowName = str_replace(" ", "_", $RowName);
            $Row->addChild('Name', utf8_encode($RowName));
            $xml->asXML('ParameterIndexListe.xml');
            write_error("Parameter Index Liste LOG: ".$RowName,3);
         //}
         Parameter_Index_Liste_weiterenParameterHolen($ETA_ComID);
      }
}




 //Aktuelle Werte vom Ofen
if (GetValueBoolean('Datenabfrage') == true) {

if (substr($COM_String,0,2) == "MD"){
ETA_ParameterAuswahlAnalyse(); //neu
   $tempBlockName = "ETA_MLP_". GetValueInteger('MonitorList_ParameterBlockZaehler');

$Anzahl = count($$tempBlockName);
    for ($i=01; $i<=$Anzahl; $i++){
      $Knoten = ord($COM_String{$i*5-1});
      $Index = ord($COM_String{$i*5+1}); //LByte
      $Wert = 256 * ord($COM_String{$i*5+2}) + ord($COM_String{$i*5+3});
      $VarID = intval(MonitorXMLAuslesen(4, 0,$Knoten,$Index));
      $IPSVar = "ETA_Wert_".MonitorXMLAuslesen(4, 0,$Knoten,$Index)."_".MonitorXMLAuslesen(5, 0,$Knoten,$Index);   //Bezeichnung der IPS Variable

      if($Wert >= 30000 /*[Objekt #30000 existiert nicht]*/) {                 //Temperatur unter 0 C ?
        $Wert = $Wert - 65536;
      }
      //->Teiler aus XML File
      $tempTeiler = MonitorXMLAuslesen(3, 0,$Knoten,$Index);
      if ((!$tempTeiler == 0) and (!$Wert == 0)) // sonst DIV durch 0 fehler
      {
      $Wert = $Wert / $tempTeiler;
      }
//Erstellt für einen empfangen Wert eine neue Variable

		if ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Raum") != false)){ //Temperatur Variable, für Räume
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"~Temperature",false,true);
		} elseif ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Abgas") != false)){ //Temperatur Variable, Abgas
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Temperature.Abgas",false,true);

		} elseif ((MonitorXMLAuslesen(8,$VarID,0,0) == 176) and (stristr(MonitorXMLAuslesen(6,$VarID,0,0),"Kessel") != false)){ //Temperatur Variable, 10 ° bis 100°, z.B Kessel
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Temperature.10bis100",false,true);

		} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 176){ //Temperatur Variable, Normal
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"~Temperature",false,true);
		} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 37){ // % Variable, unterscheidung zw. normal Prozent und Restsauerstoff
			if (MonitorXMLAuslesen(5, 0,$Knoten,$Index) == "Restsauerstoff")
		   {
		      IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Restsauerstoff.Prozent",false,true);
		   } else {
				IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Prozent",false,true);
		   }

		} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 116){ // Tonnen Variable
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Tonnen",false,true);
		} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 32){ // kg Variable
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.kg",false,true);
		} elseif (MonitorXMLAuslesen(8,$VarID,0,0) == 85){ // Drehzahl Variable
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"ETA.Drehzahl",false,true);
		} else {
			//print "Keine Variablen Datentype gefunden";
			IfVarNotExistCreateNewOneWithProfile($IPSVar,2,GetObjectID("ETA/Variablen/Aktuelle Werte"),"",false,false);
		}

		//Übergabe der Werte an die ensprechende IPS Variable

		//Überschreiben des Restsauerstoff wertes. Minus Werte sind immer Null
		if (MonitorXMLAuslesen(5, 0,$Knoten,$Index) == "Restsauerstoff")
		{
			If ($Wert < 0) {
				SetValueFloat($IPSVar, 0);
			} else {
				SetValueFloat($IPSVar, $Wert);
			}
		//Alle anderen Werte
		} else {
			SetValueFloat($IPSVar, $Wert);
		}
		//Live view
		if (GetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int")) >20)
		{
			SetValueString(GetObjectID("ETA/Live Daten"),"");
			SetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"),0);
		}
		SetValueString(GetObjectID("ETA/Live Daten"),GetValueString(GetObjectID("ETA/Live Daten")).date("j M Y G:i:s").": ".$IPSVar.": ". $Wert."<BR/>");
		SetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"),GetValueInteger(GetObjectID("ETA/Variablen/Allgemein/liveview_int"))+1);
		//Wert Objekt einblenden
		IPS_SetHidden(GetObjectID("ETA/Variablen/Aktuelle Werte/".$IPSVar), false);
		
    }
      Datenanfodern_STOP($ETA_ComID); //StopZeichen Senden -> Block x durchgelaufen

      if (GetValueInteger('MonitorList_ParameterBlockZaehler') < $ParameterBlockAnzahl) {
         SetValueInteger('MonitorList_ParameterBlockZaehler',GetValueInteger('MonitorList_ParameterBlockZaehler') + 1); //Zähler um eins erhöhen
         //Start Bytes zusammenbauen und an COM übergeben
         IPS_SetScriptTimer("SCR_Datenanforderung", $BlockIntervallTimer);  //fürt das Datenanforderungs SCript nach x sekunden aus
       } else {
         SetValueInteger('MonitorList_ParameterBlockZaehler',0); //Zähler auf 0 setzen, damit wird wieder beim Block 1 begonnen
         IPS_SetScriptTimer("SCR_Datenanforderung", $BlockIntervallTimer);  //fürt das Datenanforderungs SCript nach x sekunden aus
       }

} else {
	     write_error("Warning: Empfange Daten vom Ofen, obwohl die Abfrage ausgeschalten ist",1); // 2= General 1= ETA Alarm
	     		  SetValueBoolean(GetObjectID("ETA/ETA Status?"),true);
}
}

?>

unverändert…
…ich hatte es mal am Ende eingefügt(Z326). Aber dem Script fehlt mir bei Menge an Parametern der Durchblick…

Gruß Konny

Hallo Konny,

probier das mal. Einfac hinten ans Script hinten anhängen. Wenn Du dann am Ofen einen Parameter änderst, bekommst Du einen Eintrag ins Logfile(jedefalls ist es be mir so ^^)

Gruß
Attain

if(substr($COM_String,0,2) =="MK"){  //Einstellwerte
    $Index = 256 * ord($COM_String{5}) + ord($COM_String{6});
    $Value = 256 * ord($COM_String{7}) + ord($COM_String{8});
    $Index = sprintf("%03s", $Index); // Auf 3 Stellen auffüllen mit Nullen
    IPS_LogMessage("Heizung Setwert Nr.: $Index"," Wert = : $Value ");
} 

also bei der Pufferpumpe hab ich noch einen anderen Knoten/ID gefunden (086)statt (247)
Das hat sich erledigt.

bekommst Du einen Eintrag ins Logfile
Ist das Log-File = Meldungen?
-> da ist nix los, muss ich eventuell länger warten…

Kannst du mich mal an einem Bespiel justieren:

SolarPumpe1:

Monitorliste (Liste der aktuellen Werte zur Darstellung)


 <MonitorRow>
  <ID>294</ID> 
  <Knoten>32</Knoten> 
  <HByte>0</HByte> 
  <LByte>78</LByte> ....
....
  <Name>Koll.pumpe_1</Name> 
  </MonitorRow>


Heißt auf jeden Fall Mal die erste SolarPumpe ist an Knoten 32 ID 294
Allerdings nach Parameterliste ist es die Einstellung für minimale Drehzahl(%) die mich gar nicht interessiert…
Parameterliste = (Liste der aktuellen Einstellungen mit Möglichkeit der Änderung und Grenzwerte)

-  <ParameterListRow>
  <ID>294</ID> 
  <Knoten>32</Knoten> 
  <Index_HByte>0</Index_HByte> 
  <Index_LByte>83</Index_LByte> 
  ...
  <Name>Koll.PumpeMin</Name> 
  </ParameterListRow>


KolektorPumpe1:

 <ParameterListRow>
  <ID>293</ID> 
  <Knoten>0</Knoten> 
  <Index_HByte>0</Index_HByte> 
  <Index_LByte>0</Index_LByte> 
  ....
  <Name>Koll.pumpe_1</Name> 
  </ParameterListRow>

Hier ist Knoten 0, ID 293 aufgeführt und alle Werte 0 ???

Bei Eta-Mon kann man die Parameter über die Parameterliste ändern (send {MJ…}
In der Monitorliste bekomme ich die aktuellen Werte angezeigt (in {MD…})
Für die Schaltbefehle gibt es extra Knoten und Werte ??

{MK „Anzahl der Bytes“ „Prüfsumme“ „NodeNR“ „Index Highbyte“ „Index Lowbyte“ „Wert Highbyte“ „Wert Lowbyte“ }
{MK 0x05 0x6A 0x10 0x00 0x5A 0x00 0x00 } (Winter)
Seite 6 im Threat
Diese Werte kann ich über das Anhängen im ComStringZerlegung-Script

switch (substr($IPS_VALUE,0,2)) {
Case „MK“: //Einstellwerte
$Index = 256 * ord($IPS_VALUE{5}) + ord($IPS_VALUE{6});
$Value = 256 * ord($IPS_VALUE{7}) + ord($IPS_VALUE{8});
$Index = sprintf("%03s", $Index); // Auf 3 Stellen auffüllen mit Nullen
IPS_LogMessage(„Heizung Setwert Nr.: $Index“," Wert = : $Value ");
break;
}

ermitteln.
Diese Knoten muss ich mir merken…?

Gruß Konny

so jetzt hab ich auch mal die ETA im Dashboard…

HI

Falls es jemand haben will, ich habe eine neue Script Version onlinegestellt. Wie immer auf meiner Webseite.
Viel spass damit. Ich habe einiges im Code geändert, ist also nicht Kompatible zu alten Version.

@Konny, Das mit den zurückschreiben zum Ofen habe ich derzeit noch nicht eingebaut und auch nicht angeschaut. Steht aber bei mir ganz oben in der Todo Liste :wink: Wenn du willst können wir gemeinsam daran arbeiten.

Grüße aus Österreich
Joachim

Update: Hatte noch einen schweren Fehler im Script „SCR_ComStringZerlegen.ips.php“. Bitte dieses Script einfach mit der aktuellen Version am Server tauschen.