So hab mal mein Script fertig. Hab dazu die Scripte vom „Attain“ umgebaut, bzw. erweitert.
Was ist neu? Es kann jetzt von der ETA Steuerung die MonitorListe abgefragt werden und diese wird als XML File abgelegt. Script funktioniert jetzt auch für Twin Öfen und kommt mit unterschiedlichen Steuerungs Knoten (Nodes) klar.
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : COM_string_zerlegen.ips.php
Trigger : On Change "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.0
Mistljo | 23.05.2008 | Umbau auf XML für MonitorListe
-
*/
include'ETA_functions.ips.php';
//'''Wenn Puffer leer, dann exit
$COM_String = GetValueString("COM.Port"); //"Com.Port" ist meine Register Variable , ggf. anpassen!!!
if($COM_String=="") {
exit;
}
//Variable Deklatation
$SummeDerNutzdaten = 0;
//Einstellwerte
if(substr($COM_String,0,2) == "MK") {
IPS_Sleep(100);
$Index = 256 * ord($COM_String{5}) + ord($COM_String{6});
$Value = 256 * ord($COM_String{7}) + ord($COM_String{8});
$MKVar = "ETA.Set.".$Index;
if(!IPS_VariableExists($MKVar)) { // wenn Variable fehlt: anlegen
IPS_CreateVariable($MKVar, "Integer");
}
SetValueInteger($MKVar, $Value);
}
// Fehlermeldungen
if(substr($COM_String,0,2) == "IM") {
SetValueString("Com",substr($COM_String,2));
SetValueString("NEW_MESSAGE", substr($COM_String,4)); // übergabe an das Alarmscript
}
// 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) {
MonitorListe_ParameterHolenSTOP($ID);
} 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) {
if(!IPS_VariableExists('MonitorListeID')) { // wenn Variable fehlt: anlegen
IPS_CreateVariable('MonitorListeID', "Integer");
}
SetValueInteger('MonitorListeID', GetValueInteger("MonitorListeID")+1);
$xml = simplexml_load_file('Monitorliste.xml');
$Row = $xml->addChild('MonitorRow');
$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('Unknown9', ord($COM_String{7}));
$Row->addChild('Unknown10', 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);
$RowName = str_replace("ä", "ae", $RowName);
$RowName = str_replace("ö", "oe", $RowName);
$RowName = str_replace("ü", "ue", $RowName);
$RowName = str_replace("ß", "ss", $RowName);
$RowName = str_replace("Ä", "Ae", $RowName);
$RowName = str_replace("Ö", "Oe", $RowName);
$RowName = str_replace("Ü", "Ue", $RowName);
$Row->addChild('Name', $RowName);
$xml->asXML('Monitorliste.xml');
MonitorListe_weiterenParameterHolen($ID);
}
SetValueString ("MonitorListe" , substr($COM_String,13,32));
}
}
//Werte aus MonitorListe
if (strlen($COM_String) == $Anzahl *5 + 4 AND substr($COM_String,0,2) == "MD"){
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});
$IPSVar = "ETA_".MonitorXMLAuslesen(5, 0,$Knoten,$Index). "_". MonitorXMLAuslesen(4, 0,$Knoten,$Index) ; //Bezeichnung der IPS Variable
if($Wert >= 30000) { //Temperatur unter 0 C ?
$Wert = $Wert - 65536;
}
$Wert = $Wert / MonitorXMLAuslesen(3, 0,$Knoten,$Index); //->Teiler aus XML File
if(!IPS_VariableExists($IPSVar)) { // wenn Variable fehlt: anlegen
IPS_CreateVariable($IPSVar, "Float");
}
SetValueFloat($IPSVar, $Wert); //Ausgabe der Temperatur/Pelletsvorrat
}
}
?>
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Datenanforderung_ETA.ips.php
Trigger : -
Interval : -
Dieses Script schickt der ETA Steuerung den Startbefehlt um Monitor Daten zu schicken. z.B.: Kessel Temp.
Version: 1.0
Mistljo | 23.05.2008 | include ETA_functions.ips.php und umbau auf XML File (MonitorListe)
*/
include'ETA_functions.ips.php';
//Variable Deklatation
$TempDaten = '';
$TempPS = 0;
//Daten Bauen
$Daten ="{MC"; //Startzeichen und Servicekennung
$Daten .= chr(1+($Anzahl*3)); //Anzahl der Nutzdatenbytes ( RefreshTime + Anzahl * 3 byte)
$PS = $Intervall;
for ($i=1; $i<=$Anzahl; $i++) //Die n Anzahl Parameter
{
$a = "Para" . $i;
$TempDaten .= chr(MonitorXMLAuslesen(1, $$a,0,0)) . chr($HighByte) . chr(MonitorXMLAuslesen(2, $$a,0,0)); //...jeweils 3 byte
//Pruefsumme
$TempPS = $TempPS + MonitorXMLAuslesen(1, $$a,0,0) + MonitorXMLAuslesen(2, $$a,0,0);
}
$PS = $PS + $TempPS;
$PS = $PS%256; //Modulo 256
$Daten .= chr($PS);
$Daten .= chr($Intervall);
$Daten .= $TempDaten;
$Daten .= "}";
ComPort_SendText($ID, $Daten);
?>
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Datenanforderung_STOP_ETA.ips.php
Trigger : -
Interval : -
Dieses Script schickt der ETA Steuerung den STOP Befehl um keine Daten mehr zu schicken.
Version: 1.0
Mistljo | 23.05.2008 | umbau auf include ETA_functions.ips.php
*/
include'ETA_functions.ips.php';
Datenanfodern_STOP($ID);
?>