Monitoring Stiebel Eltron LWZ 303 - 403

Ja, Luftqualität.
Meine Lüftung läuft immer mit 50m²/h, außer die Luftqualität ist schlecht. (Ich arbeite nicht mit Lüfterstufen wie sie in der LWZ definiert sind. Ich ändere die Definition der Lüfterstufe.)
Die Qualität ändert sich ständig, je nachdem ob man sich im Raum aufhält, am kochen ist, etc. Einmal in der Nähe pupsen und in 30 Sekunden wird er tiefrot. :slight_smile:

Da ich derzeit nur die Wohnküche auswerte, läuft es Nachts auch generell höher. Ein VOC in den Schlafräumen und Bädern ist noch geplant.

Weiterhin Werte ich noch Luftfeuchte, Fensterkontakte und Temperaturen aus um den Durchsatz zu regeln.
Anbei ein Screenshot zur Verdeutlichung. Besonders ist das Delta-T für Zu- und Abluft zu beachten. Dort sieht man, dass bei höherer Lüfterstufe die Effizienz des Wärmetauschers bedeutend schlechter wird.

Der Einsatz für so einen USB-VOC ist relativ gering, hat allerdings Nachteile. Das Teil mag zu lange USB Verlängerungen nicht. Eventuell geht es, wenn ein aktiver Hub am Ende ist. Bei mir war das kein Problem, da Wohnzimmer und IPS Rechner nur eine Hohlwand trennt.
Ansonsten funktioniert das Ding auch unter Linux. Eventuell an einem Raspi. Die Daten bekommt man dann leicht in IPS.

Gruß Andreas, nicht Andi (nicht bös gemeint ;))

PS: Der Graph ist ein bisschen kaputt. Die Lüfterstufe 0 gibt es nicht. Minimum ist immer 50. Ebenso spinnt das Delta-T ein wenig. Angeblich hatte ich heute starke Schwankungen bei der Zuluft. Normalerweise ist das glatter.

Hallo Andreas,
Ok verstehe, das heißt du seztz immer einen neuen Sollwert für die Lüfterstufe 1? Sehe ich das richtig… Wenn ein Parameter aus dem Ruder läuft erhöhst du die Zu und Ablüfter. Wenn alles wieder in Ordnung ist fahren die Lüfter wieder den min Wert mit 50 an. 50% oder 50m3 pro Stunde?? Ich weiß immer nie ganz in was mir das die Anlage ausgibt.

Zu sachen Usb, meistens ist ja die Verbindung bei 7-10m baubedingt vorbei. Ich nutze dazu immer ein Usb Lan Port von Sharkoon, günstig und zu verlässig. Was mich an dem Velux Sensor stört ist das er baulich nicht die optimale Form besitzt. Um immer gleichbleibende und zuverlässige Werte zu erhalten müsste so ein gerät auch mit einem Lüfter oder Luftpumpe ausgestatet sein und an einem Optimalen Platz angebracht werden. Hast du schon mal drüber nachgedacht den Sensor direkt ins Abluftrohr vor die THZ zu setzen. Ein runder länglicher Sensor wäre da wohl hilfreich den man mit einer Bohrung ins Lüftungsrohr stecken könnte.

Grüße Daniel

Hallo Daniel,

Ja, 50m³/h. Mein Script gibt diese Werte so aus. 50-300.

Ich denke durch Konvektion der Raumluft und der ständigen Durchströmung im Raum durch die KWL kommt schon immer neue Luft am Sensor an. Habe mit der Trägheit jedenfalls keine Probleme.

Den VOC in die Lüftung zu setzen hat ein paar Nachteile.
Ein VOC hat ein Heizelement, dass sich auf 300°C erwärmt. Kühlt der Luftstrom in der KWL den Sensor zu stark runter, so dass er nicht mehr funktioniert?

Ich könnte den Sensor direkt im Abluftrohr vor dem Wärmetauscher unterbringen, aber darin sind alle Ablüfte aller Räume vertreten, was zu einer Abschwächung der Konzentration führt. Ebenfalls muss der Mief auch erstmal durch die Rohre da hin, so dass es zu einer weiteren Verzögerung kommt.

Es gibt Sensoren die besser für den Festeinbau geeinet sind. Passen auf eine UP Dose, kosten aber ein Vielfaches, haben dafür kein USB, sondern 1-wire oder KNX.

Gruß

Andreas

Halloi und einen schönen guten Tag

Ich habe deinen Post (von Frad) hinsichtlich der WPL-Steuerung mit Interesse gelesen.

Ich setzte IPS (neuste Version) ein und habe über das ISG auch so ziemlich alle Werte meiner WPL25 auslesen können.

Ich habe hier nicht dein Script verwendet (habe ich zu spät gesehen) sondern habe die IPS-Funktionen WWW-Reader und Textparser verwendet.

Nun aber zu meinem Problem: Gerne würde ich den einen oder anderen Wert auch gerne per IPS ändern. Mit dem ISG und der Webseite geht das manuell sehr gut, aber eben nicht automatisch …

Hast du dazu eine Idee wie man das mit CURL und PHP über IPS schafft?

Ich danke dir sehr für deine Unterstützung.

Viele Grüsse
Hermann Roters

Servus, ich poste dir mein Script heute Abend wenn ich zu Hause bin

Hallo Hermann,

ich habe eine LWZ 303. Im folgendem Skript sind meine Funktionen, die ich zum auslesen und setzen der Wert über das ISG nutze. Vielleicht hilft es dir.


<?


$isg_map = [
   28668 => 'val39',
   45255   => 'val82'
];

/*
Die Funktion aktualisiert den Wert der Variable mit dem Wert auf der Ist/Soll Seite der ISG.
$nameInHtml muss gleich dem Namen des Wertes auf der Webseite sein.
Ist die Variable nicht vorhanden, wird diese unter $instID angelegt.
*/
function getValueISGIstSollPage ($nameInHtml, $einheitInHtml,$dom,$instID,$type){
//$umlaute = array("ä","ö","ü","Ä","Ö","Ü","ß");
//$replace = array("ä","ö","ü","Ä","Ö","Ü","ß");
//$string= str_replace($umlaute, $replace, $string);

	$tds = $dom->getElementsByTagName("td");
	$value="";
	$gefunden=false;
	foreach ($tds as $el) {
		$nv = utf8_decode($el->nodeValue);
		$nv = $el->nodeValue;
		if ($gefunden==true) {
	      $value=$nv;
	      break;
		}
		//if (strtoupper($nv) == mb_strtoupper($nameInHtml)) {
		//IPS_LogMessage($_IPS['SELF'], $nameInHtml." - ".$nv);
		if (strcasecmp ($nv,utf8_decode($nameInHtml))==0) {
			$gefunden=true;
			if ($type == 0) break;
		}
	}
 	if ($type == 0) $value = $gefunden;
	if (!$gefunden) IPS_LogMessage($_IPS['SELF'], $nameInHtml. " nicht gefunden");
	IPS_LogMessage($_IPS['SELF'], $nameInHtml.": ".$value);

	$exVarID = @IPS_GetVariableIDByName ( $nameInHtml , $instID);

	if ($exVarID  === false) {
		$varID = IPS_CreateVariable ( $type );
	}
	else {
	   $varID = $exVarID;
	}

	IPS_SetParent ($varID,$instID);
	IPS_SetName ($varID, $nameInHtml);
	if ($type == 0) {
	   SetValue($varID, $value);
	} else {

	   //$endPos=@strpos($value,$einheitInHtml);
	   $endPos=strlen($value) - strlen ($einheitInHtml)-1;
	   //IPS_LogMessage($_IPS['SELF'], "altPos: " . $altPos);
	   $numberValue = substr($value,0,$endPos);
	   IPS_LogMessage($_IPS['SELF'], " Gesuchte Einheit: " .$einheitInHtml." EndPos: ".$endPos." Value as number: ".$numberValue);
		if ($endPos >= 1) SetValue($varID, $numberValue);
	}

}

function setValueIPS ($dom, $isg_map, $instID){
   SetValue($instID, getValueISGFromElement ($dom, $isg_map[$instID]));
}

function getValueISGFromElement ($dom,$domElementID) {
	$value = '';
	$el = $dom->getElementById ( $domElementID );
	if ($el != NULL) {
		$value = $el->getAttribute('value');
		if ($value != '') {
			IPS_LogMessage($_IPS['SELF'], $domElementID.": ".$value);
		} else IPS_LogMessage($_IPS['SELF'], $domElementID." : value ist leer");
	} else IPS_LogMessage($_IPS['SELF'], $domElementID." nicht gefunden");
	return $value;
}


function setValueISG ($curl, $data) {
	$url = "http://192.168.178.51/save.php";

	$content = "data=".json_encode($data);
	//IPS_LogMessage($_IPS['SELF'], $content);

	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_HTTPHEADER,
	       array("Content-Type: application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With: XMLHttpRequest"));
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

	$json_response = curl_exec($curl);

	$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	if ($status != 200) IPS_LogMessage($_IPS['SELF'], "status: ".$status);
}

function setStatusWP ($neuerStatus) {

	if (GetValue (28668 /*[Übersicht\Klima\Energie\Betriebsart]*/ ) != $neuerStatus) {
		IPS_LogMessage($_IPS['SELF'], 'Setzte Status Wärmepumpe auf: '. $neuerStatus);

		$data = array(
			array (
				'name' => 'val39',
				'value' => $neuerStatus
			)
		);

		$curl = curl_init();
		setValueISG ($curl, $data);
  		curl_close($curl);

      SetValue (28668 /*[Übersicht\Klima\Energie\Betriebsart]*/ , $neuerStatus);
	}

}

function setLuftmenge ($luftmenge) {
	$unterdruck = 25;
   $luftmengeZu = $luftmenge - $unterdruck;
   $luftmengeAb = $luftmenge;
   
	if ($luftmengeZu < 50) $luftmengeZu = 50;
	if ($luftmengeAb < 50) $luftmengeAb = 50;
	
	if ($luftmengeZu > 300) $luftmengeZu = 300;
	if ($luftmengeAb > 300) $luftmengeAb = 300;
	
	if ($luftmenge == 300) {
      $luftmengeZu = 300;
      $luftmengeAb = 300;
	}
	
	if ($luftmenge > 300) {
      $luftmengeZu = 301;
      $luftmengeAb = 301;
	}
	if ($luftmenge < 50) {
	   IPS_LogMessage($_IPS['SELF'], "Ausschalten Lüftung ist nicht implementiert. Setze Lufmenge auf 50.");
      $luftmengeZu = 50;
      $luftmengeAb = 50;
      $luftmenge = 50;
	}

   if (setLuftmengeAbZu ($luftmengeAb, $luftmengeZu) == true) SetValue (45255 /*[Übersicht\Klima\Luftmenge Soll]*/ , $luftmenge);

}


function setLuftmengeAbZu ($luftmengeAb, $luftmengeZu) {



   IPS_LogMessage($_IPS['SELF'], "Start setzen der Lufmenge über ISG auf ZU:".$luftmengeZu . " AB:" . $luftmengeAb);
 if (IPS_SemaphoreEnter("ISG_Sync", 2000)) {
		if ($luftmengeZu <= 300 && $luftmengeAb <= 300) {
		   //Prüfen ob die Luftmenge schon stimmt
		   if ((GetValue(25755 /*[Übersicht\Klima\Energie\Lüftung\Abluft Soll Volumenstrom]*/ ) == $luftmengeAb ) &&
					(GetValue (11189 /*[Übersicht\Klima\Energie\Lüftung\Zuluft Soll Volumenstrom]*/ ) == $luftmengeZu )) {
					IPS_LogMessage($_IPS['SELF'], "Lufmengen auf der ISG muss nicht gesetzt werden: ");
					IPS_SemaphoreLeave("ISG_Sync");
					return true;
			}

		   IPS_LogMessage($_IPS['SELF'], "Setze lufmengen Zuluft und Abluft auf ");
			$data = array(
				array (
					'name' => 'val91',
					'value' => $luftmengeZu
				),
				array (
					'name' => 'val92',
					'value' => $luftmengeZu
				),
				array (
					'name' => 'val93',
					'value' => $luftmengeZu
				),
				array (
					'name' => 'val94',
					'value' => $luftmengeAb
				),
				array (
					'name' => 'val95',
					'value' => $luftmengeAb
				),
				array (
					'name' => 'val96',
					'value' => $luftmengeAb
				)
			);
		}
		if ($luftmengeAb == 301 ) {
			IPS_LogMessage($_IPS['SELF'], "Lufmengen für Passiv Kühlung");
			//Prüfen ob die Luftmenge schon stimmt
		   if ((GetValue(25755 /*[Übersicht\Klima\Energie\Lüftung\Abluft Soll Volumenstrom]*/ ) == 300 ) &&
					(GetValue (11189 /*[Übersicht\Klima\Energie\Lüftung\Zuluft Soll Volumenstrom]*/ ) == 50 )) {
					IPS_LogMessage($_IPS['SELF'], "Lufmengen auf der ISG muss nicht gesetzt werden: Passiv");
					IPS_SemaphoreLeave("ISG_Sync");
					return 1;
			}
			$data = array(
				array (
					'name' => 'val91',
					'value' => 50
				),
				array (
					'name' => 'val92',
					'value' => 50
				),
				array (
					'name' => 'val93',
					'value' => 50
				),
				array (
					'name' => 'val94',
					'value' => 300
				),
				array (
					'name' => 'val95',
					'value' => 300
				),
				array (
					'name' => 'val96',
					'value' => 300
				)
			);
		}

		$curl = curl_init();
		setValueISG ($curl, $data);
		curl_close($curl);

      IPS_LogMessage($_IPS['SELF'], "Ende setzen der Lufmenge über ISG: ");
  		IPS_SemaphoreLeave("ISG_Sync");
		return true;
	}
	else {
     IPS_LogMessage($_IPS['SELF'], "ISG Wert setzen gescheitert wegen Laufzeitkonflikt");
     return false;
	}
}

function durchlueften ($dauer) {

	if ($dauer  > 0) {
	   IPS_SetScriptTimer (31472 /*[Controller\Lüftung\DurchlüftenAus_EC]*/  ,$dauer);
	   if (/*duchlüften schon aktiv?*/ GetValue(12078 /*[Übersicht\Durchlüften]*/) <=0 ) {
			$alteLuftmenge = GetValue (25755 /*[Übersicht\Klima\Energie\Lüftung\Abluft Soll Volumenstrom]*/ );
			SetValue (10136 /*[Controller\Lüftung\LuftmengeVorDurchlüften]*/  ,$alteLuftmenge);
		}
		setLuftmenge (300);

	} else {
	   IPS_SetScriptTimer (31472 /*[Controller\Lüftung\DurchlüftenAus_EC]*/  ,0);
		setLuftmenge (GetValue (10136 /*[Controller\Lüftung\LuftmengeVorDurchlüften]*/ ));

	}
	SetValue(12078 /*[Übersicht\Durchlüften]*/ , $dauer);
}


?>


Ich mache das so:

// Betriebsmodus
$modus = getvalueinteger(54928 /*[Heizungsanlage\Kompaktübersicht\Betriebsart ändern]*/);

// Umwandeln der Daten
$code=rawurlencode ("[{\"name\":\"val39\",\"value\":".$modus."}]");
if ($debug) echo $code;

$cu = curl_init();
curl_setopt($cu, CURLOPT_URL, $isg_website."/save.php"); // url
curl_setopt ($cu, CURLOPT_POST, 1); // post formular
curl_setopt ($cu, CURLOPT_POSTFIELDS, "make=send&pass=".$isg_pw."&user=".$isg_user."");
//curl_setopt ($cu, CURLOPT_POSTFIELDS, "name=val22&value=51.5");
curl_setopt($cu, CURLOPT_FOLLOWLOCATION, true); // Location: folgen
curl_setopt ($cu, CURLOPT_COOKIEJAR, 'cookie.txt'); // cookies unterstützen...
curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1); // ausgabe als string
$req = curl_exec ($cu); // request mit Anmeldedaten abschicken
curl_setopt ($cu, CURLOPT_POSTFIELDS, "data=".$code);
$req1 = curl_exec ($cu); // request mit den Änderungsdaten abschicken
$response = curl_getinfo( $cu );
curl_close ($cu);

Noch eine kleine Infos zu Andreas Script zum Abruf ohne ISG…

In der Datei LWZ_funktions hatte ich neuerdings Probleme beim Abruf von Daten aus der LWZ 403 - Die Anfrage dauert zu lange und die Wärmepumpe bricht die Kommunikation ab

Alt

	IPS_Sleep(10); // Wait fixed time for ack from LWZ, but without really waiting for it
	COMPort_SendText($port ,  $dts);
	IPS_Sleep(1000); // Wait 1 second for the command to get executed

Neu

	IPS_Sleep(10); // Wait fixed time for ack from LWZ, but without really waiting for it
	COMPort_SendText($port ,  $dts);
	IPS_Sleep(100); // Wait 1 second for the command to get executed

IPS_Sleep auf 100 milisekunden

Grüße Daniel

Hallo und einen schöne Guten Morgen,

bin gerade auf Suche nach einer Möglichkeit über das ISG Steuerbefehle (Betriebsmodus und Lüfterstufe) an die LWZ 303 zu senden. IPS setze ich bisher noch nicht ein, zur Zeit läuft vieles über HM/cuxd und eines Raspi. Mir gehts es erstmal nur um die grundlegende Funktion. Später soll über das ganze aber auch mal ein Dach in Form von beispielsweise IPS kommen.

Kann man das Skript so abwandeln das ich es beispielsweise über die Shell und „php skriptname.php“ ausführen kann? In der Variablen $modus, sind da einfach nur die Betriebsmodi (Warmwasser, Automatik, etc.?) enthalten?

Danke schon mal im voraus,

Grüße Thorsten

Frage in die Runde, seit einem Update seitens Stiebel ist das ISG wohl ziemlich beschnitten worden und ich komme nicht mehr an die meisten Daten.
Ist das bei Euch auch der Fall?
Gruß Willi

Gesendet von meinem XT1092 mit Tapatalk

Ist es nicht so, dass Stiebel die ISGs jetzt mit Modbus Funktion ausstattet / freischaltet?
Irgendwo habe ich das mal gelesen… Kann aber sein dass dies derzeit noch ein Feldtest ist…
Mit Modbus -kann die CLoudlösung- dann vollends abgeschalten werden, da man darüber lesen + schreiben kann…

Das mit Modbus habe ich auch gelesen, siehe hier:

Modbus

Im Oktober kommt die Stiebel Wartung vorbei, den Techniker werte ich mal befragen. Der Preis ist allerdings Stolz …

Zu der PHP Lösung, würde das so funktionieren? Gibt es eine Liste mit den einzelnen Werten (val39, val22, etc.).


<?php
$isg_website = "http://isg";
$modus = "AUTOMATIK";
$isg_user = "user";
$isg_pw = "pw";

// Umwandeln der Daten 
$code=rawurlencode ("[{\"name\":\"val39\",\"value\":".$modus."}]"); 
if ($debug) echo $code; 

$cu = curl_init(); 
curl_setopt($cu, CURLOPT_URL, $isg_website."/save.php"); // url 
curl_setopt ($cu, CURLOPT_POST, 1); // post formular 
curl_setopt ($cu, CURLOPT_POSTFIELDS, "make=send&pass=".$isg_pw."&user=".$isg_user.""); 
//curl_setopt ($cu, CURLOPT_POSTFIELDS, "name=val22&value=51.5"); 
curl_setopt($cu, CURLOPT_FOLLOWLOCATION, true); // Location: folgen 
curl_setopt ($cu, CURLOPT_COOKIEJAR, 'cookie.txt'); // cookies unterstützen... 
curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1); // ausgabe als string 
$req = curl_exec ($cu); // request mit Anmeldedaten abschicken 
curl_setopt ($cu, CURLOPT_POSTFIELDS, "data=".$code); 
$req1 = curl_exec ($cu); // request mit den Änderungsdaten abschicken 
$response = curl_getinfo( $cu ); 
curl_close ($cu);
?>

Glaubst du wirklich der stiebel Techniker kann mit modbus was anfangen?
Wieso Wartung?

Gesendet von meinem Redmi Note 2 mit Tapatalk

Was genau hast du denn vor? Den Codeschnippsel kenne ich irgendwoher :smiley:

Guten Abend :slight_smile:

@mastermind1
Der kommt aktuell noch jährlich zur Wartung … sind aber am überlegen das sein zu lassen.

@Frad
Ja genau, der ist von dir :slight_smile:

Habe eben nochmal etwas geforscht und auch Werte senden können. Betriebsmodus war bei mir im ISG ‚val39s‘.


<?php
/*

TODO:
Validierung der übergebenen Werte - max/min

-----------------------------------------------------------------

val39s = Betriebsmodus
11 = AUTOMATIK
1 = BEREITSCHAFT
3 = TAGBETRIEB
4 = ABSENKBETRIEB
5 = WARMWASSER
14 = HANDBETRIEB
0 = NOTBETRIEB

val82 = Lüfterstufe
0,1,2,3

val14 = Innenraum-Temp
val11 = Warmwasser-Temp
*/

$isg_website = "http://isg";
$modus_betriebsart = "5";
$modus_luefterstufe = "1"; // 0-3
$isg_user = "user";
$isg_pw = "pw";

// Umwandeln der Daten 
//$code=rawurlencode ("[{\"name\":\"val39s\",\"value\":".$modus_betriebsart."}]"); 
$code=rawurlencode ("[{\"name\":\"val82\",\"value\":".$modus_luefterstufe."}]"); 
//echo $code;

$cu = curl_init();

curl_setopt($cu, CURLOPT_URL, $isg_website."/save.php"); // url 
curl_setopt ($cu, CURLOPT_POST, 1); // post formular 
curl_setopt ($cu, CURLOPT_POSTFIELDS, "make=send&pass=".$isg_pw."&user=".$isg_user."");

//curl_setopt ($cu, CURLOPT_POSTFIELDS, "name=val22&value=51.5");
curl_setopt($cu, CURLOPT_FOLLOWLOCATION, true); // Location: folgen 
curl_setopt ($cu, CURLOPT_COOKIEJAR, 'cookie.txt'); // cookies unterstützen... 
curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1); // ausgabe als string 
$req = curl_exec ($cu); // request mit Anmeldedaten abschicken 
curl_setopt ($cu, CURLOPT_POSTFIELDS, "data=".$code); 
$req1 = curl_exec ($cu); // request mit den Änderungsdaten abschicken 
$response = curl_getinfo( $cu ); 
curl_close ($cu);

?>

Wartung von stiebel?
Wartungsfreie WP?
Die Filter kann man doch selbst tauschen … den Wärmetauscher mit nem Staubsauger absaugen?
Und sollte man einen defekt haben, darf man mit hoher Wahrscheinlichkeit auf wenig Kulanz hoffen…
Selbst erlebt bei unserem Onkel.

Er hat zwei Wasser WP von stiebel.
Eine für WW und eine fürs heizen.
Warum auch immer 2? Wurde so von stiebel „empfohlen“. Nach knapp 10 Jahren, Kompressor Schaden WP 1 Heizung - Kosten knapp 3.000€ - obwohl jährlicher Wartungsvertrag (werkskundendienst).
Kulanz 0. Danach Vertrag gekündigt.

Zweite WP ist jetzt komplett ausgefallen (knapp 12-13Jahre alt).
Aussage stiebel - neue WP anschaffen.
Von 15-20 Jahren Haltbarkeit ist da keine Rede mehr…

Da die Stiebel preislich eher im Bereich „Mercedes“ angesiedelt ist- ist klar - welcher Hersteller von unserem Onkel nicht mehr gekauft wird.

Wir haben selbst den stiebel Luft-wp…mit einem damaligen Preis von knapp 10000€ bekommt man heute eine vergleichbare Panasonic Geisha für 3000€ mit JAZ 4,5.
D.h. ich Kauf mir noch ne zweite als Reserve dazu und hab noch 4000€ übrig für die Stromrechnung :slight_smile:

Sorry für das offtopic…

Gesendet von meinem Redmi Note 2 mit Tapatalk

Guten Morgen,
habe mich gestern Abend mal hingesetzt und das Skript von Frad etwas erweitert. Es kann über die CLI aufgerufen werden, oder über den Browser (siehe Kommentar am Anfang des Skripts).
Bin kein PHP Profi, falls jemand Verbesserungsvorschläge hat - gerne :slight_smile:

@Frad: Ist es OK für dich, wenn das Skript auch im HomeMatic Forum veröffentliche? Der wesentliche Teil (curl) stammt ja schließlich von dir! Danke!

Wie hast du eigentlich den Aufruf über das ISG Web analysiert bekommen?


<?php
/**
 * set Parameters for Stiebel Eltron over ISG Web (Version: 8.5.6)
 * 
 * call http://isg-url/isg_set.php?parameter=wert
 *      http://isg-url/isg_set.php?luefterstufe=3
 * call with cli 'php isg_set.php parameter=wert'
 *
 */

// debug true/false
$debug = false;

// auth
$isg_website = "http://isg";
$isg_user = "user";
$isg_pw = "pw";

// argv to $_GET (for use with cli)
if (isset($argv)) {
    if ($debug) { var_dump($argv); };
    foreach ($argv as $arg) {
        $e=explode("=",$arg);
        if(count($e)==2)
            $_GET[$e[0]]=$e[1];
        else   
            $_GET[$e[0]]=0;
    }
    if ($debug) { var_dump($_GET); };
}

if (!$_GET) {
    echo "Kein Parameter angegeben!";
    exit;
}

function set_isg_para($para, $value) {

    global $isg_website;
    global $isg_user;
    global $isg_pw;

    $cu = curl_init(); 
    curl_setopt($cu, CURLOPT_URL, $isg_website."/save.php");
    curl_setopt ($cu, CURLOPT_POST, 1); 
    curl_setopt ($cu, CURLOPT_POSTFIELDS, "make=send&pass=".$isg_pw."&user=".$isg_user.""); 
    curl_setopt($cu, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt ($cu, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1);
    $req = curl_exec ($cu); // request mit Anmeldedaten abschicken

    curl_setopt ($cu, CURLOPT_POSTFIELDS, "data=".$para);
    $req1 = curl_exec ($cu); // request mit den Änderungsdaten abschicken 
    
    $response = curl_getinfo( $cu ); 
    curl_close ($cu);

}

// Lüfterstufe Tag
// Gültige Werte:
// 0 - 3
if(isset($_GET["luefterstufetag"])) {
    $value = $_GET["luefterstufetag"];
    $min = 0;
    $max = 3;
    if ( ($min <= $value) && ($value <= $max) ) {
        $para=rawurlencode("[{\"name\":\"val82\",\"value\":".$value."}]");
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); };
        if ($debug == false) { set_isg_para($para, $value); };
    } else {
        echo "falscher Wert für die Lüfterstufe Tag, Vorgabe: Zwischen 0 und 3!
";
        exit;
    }
    
}

// Betriebsart
// Gültige Werte:
// 11 = AUTOMATIK, 1 = BEREITSCHAFT, 3 = TAGBETRIEB, 4 = ABSENKBETRIEB, 5 = WARMWASSER, 14 = HANDBETRIEB, 0 = NOTBETRIEB
if(isset($_GET["betriebsart"])) {
    $value_get = $_GET["betriebsart"];
    if ($value_get == "automatik") {
        $value = "11";
    } elseif ($value_get == "warmwasser") {
        $value = "5";
    } else {
        $value = null;
        echo "falscher Wert für die Betriebsart angegeben!
";
        echo "korrekte Werte: automatik, warmwasser
";
    };
    $para=rawurlencode("[{\"name\":\"val39s\",\"value\":".$value."}]");
    if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); };
    if ($debug == false) { set_isg_para($para, $value); };
}

// Raumtemperatur Tag
// Gültige Werte:
// 10.0 - 30.0
if(isset($_GET["raumtemptag"])) {
    $value = $_GET["raumtemptag"];
    $min = 10;
    $max = 30;
    if ( ($min <= $value) && ($value <= $max) ) {
        $para=rawurlencode("[{\"name\":\"val5\",\"value\":".$value."}]");
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); };
        if ($debug == false) { set_isg_para($para, $value); };
    } else {
        echo "falscher Wert für die Raum-Temperatur Tag, Vorgabe: Zwischen 10°C und 30°C!
";
        exit;
    }
}

// Warmwasser-Temperatur Tag
// Gültige Werte:
// 10.0 - 55.0
if(isset($_GET["warmwassertemptag"])) {
    $value = $_GET["warmwassertemptag"];
    $min = 10;
    $max = 55;
    if ( ($min <= $value) && ($value <= $max) ) {
        $para=rawurlencode("[{\"name\":\"val17\",\"value\":".$value."}]");
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); };
        if ($debug == false) { set_isg_para($para, $value); };
    } else {
        echo "falscher Wert für die Warmwasser-Temperatur Tag, Vorgabe: Zwischen 10°C und 55°C!
";
        exit;
    }
}

?>

Hallo darkiop,

vielen Dank für das Script.

Ich habe versucht dieses auszuführen, aber ich bekomme folgende Fehlermeldung:

Parse error:  syntax error, unexpected 'name' (T_STRING) in C:\work\IP-Symcon\scripts\39906.ips.php on line 68
Abort Processing during Fatal-Error: syntax error, unexpected 'name' (T_STRING)
   Error in Script C:\work\IP-Symcon\scripts\39906.ips.php on Line 68

Am Anfang Deines Scriptes kann man ja auch noch die Authentifizierung angeben, hier habe ich den Variableninhalt gelöscht, da ich aktuell kein PW auf der Webseite habe.

Hier noch das Script:

<?php 
/** 
 * set Parameters for Stiebel Eltron over ISG Web (Version: 8.5.6) 
 *  
 * call http://isg-url/isg_set.php?parameter=wert 
 *      http://isg-url/isg_set.php?luefterstufe=3 
 * call with cli 'php isg_set.php parameter=wert' 
 * 
 */ 

// debug true/false 
$debug = true; 

// auth 
$isg_website = "http://192.168.1.151/"; 
$isg_user = ""; 
$isg_pw = ""; 

// argv to $_GET (for use with cli) 
if (isset($argv)) { 
    if ($debug) { var_dump($argv); }; 
    foreach ($argv as $arg) { 
        $e=explode("=",$arg); 
        if(count($e)==2) 
            $_GET[$e[0]]=$e[1]; 
        else    
            $_GET[$e[0]]=0; 
    } 
    if ($debug) { var_dump($_GET); }; 
} 

if (!$_GET) { 
    echo "Kein Parameter angegeben!"; 
    exit; 
} 

function set_isg_para($para, $value) { 

    global $isg_website; 
    global $isg_user; 
    global $isg_pw; 

    $cu = curl_init();  
    curl_setopt($cu, CURLOPT_URL, $isg_website."/save.php"); 
    curl_setopt ($cu, CURLOPT_POST, 1);  
    curl_setopt ($cu, CURLOPT_POSTFIELDS, "make=send&pass=".$isg_pw."&user=".$isg_user."");  
    curl_setopt($cu, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt ($cu, CURLOPT_COOKIEJAR, 'cookie.txt'); 
    curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1); 
    $req = curl_exec ($cu); // request mit Anmeldedaten abschicken 

    curl_setopt ($cu, CURLOPT_POSTFIELDS, "data=".$para); 
    $req1 = curl_exec ($cu); // request mit den Änderungsdaten abschicken  
     
    $response = curl_getinfo( $cu );  
    curl_close ($cu); 

} 

// Lüfterstufe Tag 
// Gültige Werte: 
// 0 - 3 
if(isset($_GET["luefterstufetag"])) { 
    $value = $_GET["luefterstufetag"]; 
    $min = 0; 
    $max = 3; 
    if ( ($min <= $value) && ($value <= $max) ) { 
        $para=rawurlencode("[{"name":"val82","value":".$value."}]"); 
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); }; 
        if ($debug == false) { set_isg_para($para, $value); }; 
    } else { 
        echo "falscher Wert für die Lüfterstufe Tag, Vorgabe: Zwischen 0 und 3!
"; 
        exit; 
    } 
     
} 

// Betriebsart 
// Gültige Werte: 
// 11 = AUTOMATIK, 1 = BEREITSCHAFT, 3 = TAGBETRIEB, 4 = ABSENKBETRIEB, 5 = WARMWASSER, 14 = HANDBETRIEB, 0 = NOTBETRIEB 
if(isset($_GET["betriebsart"])) { 
    $value_get = $_GET["betriebsart"]; 
    if ($value_get == "automatik") { 
        $value = "11"; 
    } elseif ($value_get == "warmwasser") { 
        $value = "5"; 
    } else { 
        $value = null; 
        echo "falscher Wert für die Betriebsart angegeben!
"; 
        echo "korrekte Werte: automatik, warmwasser
"; 
    }; 
    $para=rawurlencode("[{"name":"val39s","value":".$value."}]"); 
    if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); }; 
    if ($debug == false) { set_isg_para($para, $value); }; 
} 

// Raumtemperatur Tag 
// Gültige Werte: 
// 10.0 - 30.0 
if(isset($_GET["raumtemptag"])) { 
    $value = $_GET["raumtemptag"]; 
    $min = 10; 
    $max = 30; 
    if ( ($min <= $value) && ($value <= $max) ) { 
        $para=rawurlencode("[{"name":"val5","value":".$value."}]"); 
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); }; 
        if ($debug == false) { set_isg_para($para, $value); }; 
    } else { 
        echo "falscher Wert für die Raum-Temperatur Tag, Vorgabe: Zwischen 10°C und 30°C!
"; 
        exit; 
    } 
} 

// Warmwasser-Temperatur Tag 
// Gültige Werte: 
// 10.0 - 55.0 
if(isset($_GET["warmwassertemptag"])) { 
    $value = $_GET["warmwassertemptag"]; 
    $min = 10; 
    $max = 55; 
    if ( ($min <= $value) && ($value <= $max) ) { 
        $para=rawurlencode("[{"name":"val17","value":".$value."}]"); 
        if ($debug == true) { var_dump($para); $para = rawurldecode($para); var_dump($para); }; 
        if ($debug == false) { set_isg_para($para, $value); }; 
    } else { 
        echo "falscher Wert für die Warmwasser-Temperatur Tag, Vorgabe: Zwischen 10°C und 55°C!
"; 
        exit; 
    } 
} 

?>

Kannst Du mir hier vielleicht weiterhelfen?

Vielen Dank!
fussi24

Guten Abend,

du hast die \ entfernt:


$para=rawurlencode("[{\"name\":\"val17\",\"value\":".$value."}]");

Hallo,

frag mich bitte nicht was beim Kopieren schief gelaufen ist, aber bei allen Zeilen von " $para" war das „“ weg.

Wenn ich das Script jetzt ausführe bekomme ich die folgende Meldung:

Kein Parameter angegeben!

Scheinbar verstehe ich das Script noch nicht ganz. Welche Werte muss ich übergeben und wie mache ich das im Webfrontend?