Siemens OZW 672/772

Gibt es zu den Access violations News? So ist es nicht wirklich nutzbar, wenn einige wichtige Datenpunkte nicht erstellt werden können (z.B. die Fehleranzeige ist unverzichtbar).

Danke, kjb

Es gab glaub ich einen Workarround den ich gefunden hatte um auch die DP mit Fehler auswerten zu koennen. Schaus mir an, bin unterwegs aktuell und weiss nicht ob der mit der neuen FW tut Aber denke ja. Kannst du PHP gut? Wenn du den Inhalt meiner Scriptes verstehst kannst es nutzen bis es native geht. Die profis hier haben aktuel viel zu tun mit einer neuen Version.

Die AccessViolation hatte ich gar nicht mehr auf dem Schirm. Schaue ich mir an.

paresy

@ swissboy: Danke für die Hilfe. PHP kann ich ordentlich aber nicht auf höchstem Niveau.
@ paresy: Das wäre cool. Ist ja schon eine sehr schöne Sache, wenn es flutscht :slight_smile:

ok mit dem Code unten kannst du jeden DP auslesen. über das Webinterface. Einfach gesagt macht das die function ElcoHeating_getDp dort und im Code musst du einfach den DP-Punkt ändern auf den, denn du möchtest. Dann ist noch wichtig, du brauchst für die abfrage eine gültige SSID, die wird geprüft im code, wenn sie nicht mehr gültig ist kommt der Access denied und eine neue ssid wird abgefragt, gespeichert und hinterlegt. Ist alles in dem Code drinn. Frage so insbesonders die Error-DP’s ab. Hab ich mal so entwickelt und es hat einige beispiel dp punkte in dem Code. ACHTUNG, es sind andere DP-Punkte Nummern als die im IPS Konfigurator… du musst diese DPS aus dem Webinterface abschreiben.

Hier noch die URL für den WWW-Reader der die aktuelle SSID rausholt im Code:

http://192.168.3.59/main.app?user=Deinuser&pwd=DeinpasswortimWebinterface

Gruss


	//ElcoHeating_getDp Function laden

function ElcoHeating_getDp($plantItemId)
{
	$ch = curl_init();

	curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla 4.0');
	curl_setopt ($ch, CURLOPT_HEADER, 0);
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt ($ch, CURLOPT_TIMEOUT, 120);

	$service="getDp";

	curl_setopt ($ch, CURLOPT_URL, 'http://'.trim(GetValueString(39485 /*[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG\#DVALHEIZUNG\sSDVALHEIZUNGIP]*/)).'/ajax.app?SessionId='.trim(GetValueString(35551 /*[WWWPARSER\Heizung\sKSDVTEHEIZUNGSSID]*/)).'&service='.trim($service).'&plantItemId='.trim($plantItemId));

	$object = json_decode(curl_exec ($ch), true);
	$value = trim($object["value"]);

	curl_close($ch);

	return $value;
}



	set_time_limit(50); //Timeout auf 30s setzen

	$timestamp=time();
	$MTdatum = date("m",$timestamp);
	$YEdatum = date("y",$timestamp);

	//-------------------------------------------------------------------------------------------------------
			//Auszulesende Elemente müssen definiert werden

			//Heissgastemperatur 1 - 1731				                  Sample Value: 31,8 Grad
			$value = ElcoHeating_getDp(1731);
			//echo $value;

	//-------------------------------------------------------------------------------------------------------

			if($value=="Access denied")
			{
				$bool = Sys_Ping(GetValueString(39485 /*[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG\#DVALHEIZUNG\sSDVALHEIZUNGIP]*/),30);
				if($bool)
				{
					SetValueBoolean(51732 /*[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG\#DVALHEIZUNG\bSDVALHEIZUNGDEVIP]*/, True);

					//Neue Session-ID nötig.. vielleicht Device oder IPS länger down..?

					//RUN WWW Browser
				   //WWWReader_SetPage(56501 /*[Objekt #56501 existiert nicht]*/,"http://IPOZW/cgi-bin/rc?116");
				   //IPS_ApplyChanges(56501 /*[Objekt #56501 existiert nicht]*/);
				   WWWReader_UpdatePage(53677 /*[#DVALWRHEIZUNGSESSID]*/);
				}
				else
				{
					SetValueBoolean(51732 /*[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG\#DVALHEIZUNG\bSDVALHEIZUNGDEVIP]*/, False);
				}
			}
			elseif($value!="")
			{//SSID Stimmt somit weiter mit auslesen
			   //Zuerst den bestehenden Waermepumpenstatus in Variable übernehmen

				//Status Wärmepumpe - 1418     						 				Sample Value: Verdichter 1 ein
			   SetValue(26034 /*[Objekt #26034 existiert nicht]*/, ElcoHeating_getDp(1418));

			   IPS_Sleep(3000);

				//LETZTE AKTIVITAET DER WAERMEPUMPE Zeitstempel - 1421      Sample Value:  21. November 2011 13:50
			   SetValue(42256 /*[Objekt #42256 existiert nicht]*/, ElcoHeating_getDp(1421));

			   IPS_Sleep(3000);

				//Statuscode Historie Eintrag 1 - 1422				  						Sample Value:	Zwangsabtauen aktiv
			   SetValue(55864 /*[Objekt #55864 existiert nicht]*/, ElcoHeating_getDp(1422));

			   IPS_Sleep(3000);

				//LETZTER FEHLER DER WAERMEPUMPE Zeitstempel	- 1058					Sample Value:  16. Dezember 2010 00:32
			   SetValue(16528 /*[Objekt #16528 existiert nicht]*/, ElcoHeating_getDp(1058));

			   IPS_Sleep(3000);

				//Fehlercode Historie Eintrag 1 - 1059										Sample Value:  247:Abtaustörung
			   SetValue(11295 /*[Objekt #11295 existiert nicht]*/, ElcoHeating_getDp(1059));

			   IPS_Sleep(3000);

				//Verdampfertemperatur - 1758													Sample Value: -12,4 Grad
			   SetValue(46099 /*[Objekt #46099 existiert nicht]*/, ElcoHeating_getDp(1758));

			   IPS_Sleep(3000);

				//Temperaturdifferenz Abtauen Istwert - 1759				  				Sample Value: 19 Grad
			   SetValue(29051 /*[Objekt #29051 existiert nicht]*/, ElcoHeating_getDp(1759));

			   IPS_Sleep(3000);

				//Temperaturdifferenz Abtauen Sollwert - 1760				  			Sample Value: 21,4 Grad
			   SetValue(34458 /*[Objekt #34458 existiert nicht]*/, ElcoHeating_getDp(1760));

			   IPS_Sleep(3000);

			}
			else
			{
				//fehler
			}
		}

Bisher nichts mit WWW Reader gemacht. Vermutlich Anfängerfrage aber wie kommt die Session ID in die Variable ‚35551‘?

Durch den www reader wird diese variable mit der ssid gefuellt. Gib mal im webbrowser die URL des wwwreaders ein dann siehst du es sicher.

Braucht aber noch einen Text Parser und die entsprechenden Reglen oder wär das einfacher gegangen? Naja, eben keine Ahnung vom WWW Reader :slight_smile:
Session ID funktioniert nun, Antwort ist aber immer ein leerer String:

{„service“:„getDp“,„plantItemId“:„700“,„value“:"",„unit“:"",„hasEni“:„false“}

Was mach ich falsch?

Danke übrigens für die freundliche Hilfe. Einfacher wär’s natürlich, wenn wir diesen Umweg nicht gehen müssten :wink:

Poste bitte mal den ganzen Code wie du ihn angepasst hast und einen echo/ausgabe von

curl_setopt ($ch, CURLOPT_URL, 'http://'.trim(GetValueString(39485 /*[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG\#DVALHEIZUNG\sSDVALHEIZUNGIP]*/)).'/ajax.app?SessionId='.trim(GetValueString(35551 /*[WWWPARSER\Heizung\sKSDVTEHEIZUNGSSID]*/)).'&service='.trim($service).'&plantItemId='.trim($plantItemId));

also echo ‚http://‘.trim(GetValueString(39485 /[DIVERSE DEVICES\WOHNRAUM\Alle\HEIZUNG#DVALHEIZUNG\sSDVALHEIZUNGIP]/)).’/ajax.app?SessionId=’.trim(GetValueString(35551 /[WWWPARSER\Heizung\sKSDVTEHEIZUNGSSID]/)).’&service=’.trim($service).’&plantItemId=’.trim($plantItemId);

Wie sieht der finalstring/url bei dir aus?

Gruss

Final String:

http://10.10.11.33/ajax.app?SessionId=72348260-593b-46bd-b464-f490d452c107&service=getDp&plantItemId=500

mit dieser Antwort:
Array
(
[service] => getDp
[plantItemId] => 500
[value] =>
[unit] =>
[hasEni] => false
)

<?

function OZW_getDp($plantItemId)
{
	$ch = curl_init();

	curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla 4.0');
	curl_setopt ($ch, CURLOPT_HEADER, 0);
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt ($ch, CURLOPT_TIMEOUT, 120);

	$service="getDp";

	curl_setopt ($ch, CURLOPT_URL, 'http://10.10.11.33/ajax.app?SessionId='.trim(GetValueString(22517 /*[OZW\SessionID]*/)).'&service='.trim($service).'&plantItemId='.trim($plantItemId));

   //echo 'http://10.10.11.33/ajax.app?SessionId='.trim(GetValueString(22517 /*[OZW\SessionID]*/)).'&service='.trim($service).'&plantItemId='.trim($plantItemId);

	$object = json_decode(curl_exec ($ch), true);

	//print_r ($object);

	$value = trim($object["value"]);

	curl_close($ch);

	return $value;
}

	set_time_limit(50); //Timeout auf 30s setzen

	$timestamp = time();
	$MTdatum = date("m",$timestamp);
	$YEdatum = date("y",$timestamp);

	//-------------------------------------------------------------------------------------------------------

	//Abfrage um zu überprüfen ob Session ID noch aktuell ('Access denied' wenn nicht mehr aktuell)
	$value = OZW_getDp(500);
	echo $value;

	//-------------------------------------------------------------------------------------------------------

			if($value=="Access denied")
			{
				$bool = Sys_Ping("10.10.11.33",30);
				if($bool)
				{
					SetValueBoolean(42506 /*[OZW\OZW erreichbar]*/, True);
				   WWWReader_UpdatePage(18790 /*[WWW Reader OZW Manuell]*/);
				}
				else
				{
					SetValueBoolean(42506 /*[OZW\OZW erreichbar]*/, False);
				}
			}
			elseif($value!="")
			{//SSID gültig, somit weiter mit auslesen
			   SetValue(15062 /*[OZW\Test String]*/, OZW_getDp(700));
			   IPS_Sleep(3000);
			}
			else
			{
				//fehler
			}

?>

Danke, Samstag geniessen nicht vergessen :wink:

Das passt aber gibts es bei dir den DP 500? Vermutlich nicht. Die DPs hier werden automatisch im webinterface OZW generiert. Schau mal im webinterface auf eine statusseite des Devices. Dann Quelltext und von da DP Wert uebernehmen ins Script und dann kommt vermutlich ne Antwort. Nimm Vorallem einen lesewert also zuerst nicht einen den du du verändern-setzen kannst.

Ich dachte der Datenpunkt sei identisch mit dem ‚Bedienzeilen‘ Wert. Jetzt geht’s.

Wirklich herzlichen Dank für die Zeit und schönen 1. Advent.

Grüsse aus dem verschneiten Uster, kjb

Das ist etwas speziell meinte ich in dem Initial-Beitrag. Uster…ZH? Dann wärest du ja nur ein paar Meter weg…

Ja dann haben wir drei Nummern für den gleichen Wert, DP-Wert Webseite, Bedienzeilenwert und Wert in IPS…

Ganz genau wäre Greifensee, ZH

Genau drei sind’s. Greifensee, da bin ich aufgewachsen.was steuerst du denn mit dem OZW?

CTA Wärmepumpe Sole-Wasser. Gut zu wissen jemanden in der Nähe zu haben :wink:

Ah cool, ja eh da können wir mal auf einen Kaffe was machen oder einden Stammtisch in ZH wenn es noch mehr gibt

Ajo zudem ich denk mein Script macht genau das gleiche wie die Instanz in IPS. Einfach kann man mit dem Konfigurator etc. das Ganze viel einfacher zusammenklicken und muss nicht php kennen. Du hast ja in der Instanz auch einen Reader indem du ein Passwort und einen Usernamen konfigurierst. Du definierst einen Leseintervall und danach werden die Variablen gefüllt. Ist auch leider auch ein ständiges abfragen. Ganz schön wäre es natürlich, wenn man in IPS die Änderungen als Push erhalten würde und nicht immer danach pollen müsste. Das ist aber eher ein Problem/Beschränkung seitens der SW Siemens als von IPS. Zu wenig kenne ich mich mit AJAX aus, ob man da vielleicht irgendwie eine Callbackroutine oder so machen könnte die nur Änderungen an einen Host zurück liefert… falls du da ganz fit bist findest du ja vielleicht noch etwas besseres. Hatte schon ein zeitchen für dieses Abfrage zu tun und die DP’s heraussuchen.

In 3.1 immer noch vorhanden…

Geht da noch was oder bleibt das so?

kjb