curl und Ubiquity mPower

Jetzt eine Version 2.0 die über Telnet funktioniert. Siehe 4ter Beitrag.

MFI MPower Steckdosen Verwaltungsscript mit Stromverbrauchsauswertung (vielleicht kann mal ein Mod den Titel ein bisschen anpassen :slight_smile: )


Hallo Leute,

also ich bin ein wenig ratlos. Ich habe mir jetzt die mPower Steckdosenleiste von Ubiquity besorgt. Vom grundsatz her klingt das echt gut, 3 Steckdosen im WLan, schaltbar (logo) und Messen noch die Stromaufnahme für 55€. Soweit so gut. Auf der Ubiquit Seite wird die Schnittstelle so beschrieben:

Login:
curl -X POST -d „username=<username>&password=<password>“ -b „AIROS_SESSIONID=<cookie of 32 random digits>“ <ip>/login.cgi

Login Example:

curl -X POST -d „username=admin&password=correcthorsebatterystaple“ -b „AIROS_SESSIONID=01234567890123456789012345678901“ 10.0.0.1/login.cgi

Get:
curl -b „AIROS_SESSIONID=<cookie>“ <ip>/sensors[/#][/<param>]

Get Examples:

curl -b „AIROS_SESSIONID=01234567890123456789012345678901“ 10.0.0.1/sensors

So mit curl in der Kommandozeilen Version klappt das auch. Ich hab jetzt mal in IPS mit CURL rumgemacht und krieg das Dingen nicht eingeloggt. So siehts zu zeit aus:

$ch = curl_init();
 $sCookieFile = tempnam(sys_get_temp_dir(), 'Cookie_Anzeiger');
curl_setopt($ch, CURLOPT_URL, 'https://192.168.11.199/login.cgi');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
//curl_setopt($ch, CURLOPT_USERAGENT,$useragent);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=admjk&submit=1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $sCookieFile);  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, $sCookieFile);  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}
echo $answer;
//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'https://192.168.11.199/sensors/1');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}
echo "--------";
echo $answer;

Komme da irgendwie nicht weiter. Habe natürlich als COOKIEFILE auch mal „AIROS_SESSIONID=01234567890123456789012345678901“ verwendet. Alles keinen Erfolg er loggt sich nicht ein. Ich krieg als Rückmeldung beide male die Login Seite.

Ideen willkommen :confused:

Jan

Habe eine Lösung gefunden. Schlüssel war hier:
curl_setopt($ch, CURLOPT_COOKIE , „AIROS_SESSIONID=01234567890123456789012345678901“);

So hier mal ein Basic Script für die Nutzung von Ubiquity Steckdosen.
Ihr müsst eigentlich nur das Script anlegen IP’s der Steckdosen eintragen und der Rest passiert von allein. Gehe hier allerding von 3fach Steckdosen aus. Die Variablen werden anhand der Beschreibung identifieziert die aber ergänzt werden kann. D.h. den Namen kann man problemlos umbennen.

Skript noch mit der ein oder anderen Testsache idR im Kommentar also müsste so laufen. Weiterentwicklung gerne hier.

<?
/* hier individuelle einstellungen vornehmen */
$cred  = "username=admin&password=xxxx";
$iplist[] = "192.168.11.199";
IPS_SetScriptTimer($_IPS['SELF'], 60);
/* ab hier ende, Variablen werden selbstständig angelegt zur Identifizierung wird die Bemerkung herangezuogen, der suchbegriff muss enthalten bleiben */

IPS_SetHidden($_IPS['SELF'], true);

$ch = curl_init();
//print_r ($_IPS);

//setSteckdose ("192.168.11.199", "1", false);
//exit;

if ($_IPS['SENDER']=="WebFront") { // schaltvorgang gewünscht
	SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
	//print_r ($_IPS);
	$callerObj = IPS_GetObject($_IPS['VARIABLE']);
	$ParentID = $callerObj['ParentID'];
	$ParentObj = IPS_GetObject($ParentID);
	$ParrentInfo = $ParentObj["ObjectInfo"];
	$callerInfo = $callerObj["ObjectInfo"];
	$ipmatch = "" ;
	foreach ($iplist as $key => $ip) {
		if (strpos($ParrentInfo, $ip) !== false) $ipmatch = $ip; // falls ausser der IP noch kommentare in der Beschriebung stehen müssen wir die IP suchen
	}
	$port = 1;
	if (strpos($callerInfo, "Port 2") !== false) $port=2; // selbe hier mit den ports
	if (strpos($callerInfo, "Port 3") !== false) $port=3;
//echo $port."-".GetValue($_IPS['VARIABLE'])."  ".$ParrentInfo;
	setSteckdose ($ip, $port, GetValue($_IPS['VARIABLE']));
	exit;
}

if($_IPS['SENDER']=="Execute" || $_IPS['SENDER'] == "TimerEvent") {
	foreach ($iplist as $key => $ip) {
		$status = checkSteckdose ($ip);
	//	print_r($status);
		$ci  =  findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
		$po1 = findPortId ($ci, "1"); // dasselbe für den Port
		$pow1= findSubId ($po1,"Power"); // Und für Subarttribute wie Stromverbrauch
		$po2 = findPortId ($ci, "2"); // dasselbe für den Port
		$pow2= findSubId ($po2,"Power"); // Und für Subarttribute wie Stromverbrauch
		$po3 = findPortId ($ci, "3"); // dasselbe für den Port
		$pow3= findSubId ($po3,"Power"); // Und für Subarttribute wie Stromverbrauch

		SetValue ($po1, $status->sensors[0]->state->output);
		SetValue ($po2, $status->sensors[1]->state->output);
		SetValue ($po3, $status->sensors[2]->state->output);

		SetValue ($pow1, $status->sensors[0]->state->power);
		SetValue ($pow2, $status->sensors[1]->state->power);
		SetValue ($pow3, $status->sensors[2]->state->power);
	}
}

curl_close($ch);

function setCURLParameter() {
	global $cred,$ch;
	//$sCookieFile = "cookie" ;
	$sCookieFile = "";tempnam(sys_get_temp_dir(), 'cookie_ubnt');
	curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_COOKIESESSION, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEJAR, $sCookieFile);  //could be empty, but cause problems on some hosts
	curl_setopt($ch, CURLOPT_COOKIEFILE, $sCookieFile);  //could be empty, but cause problems on some hosts
	curl_setopt($ch, CURLOPT_COOKIE , "AIROS_SESSIONID=01234567890123456789012345678901");
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_VERBOSE, true);

}

function login ($ip) {
	global $cred,$ch;
	curl_close($ch); // sonst nimmt der den cookie nicht nach einer voreigen abfrage
	$ch = curl_init();
	setCURLParameter();
//	echo "login";
//	exit;
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/login.cgi');
	curl_setopt($ch, CURLOPT_POSTFIELDS, $cred);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    exit;
	}
	curl_close($ch);
	//echo $answer;
	IPS_Sleep (2500);
	$ch = curl_init();
}

function checkSteckdose ($ip) {
	global $cred,$ch;
	setCURLParameter();
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/sensors');
	curl_setopt($ch, CURLOPT_POSTFIELDS, "output=0");
	curl_setopt($ch, CURLOPT_POST, false);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    exit;
	} else {
	//echo $answer;
		$json = json_decode($answer);
		//print_r($json);
	//	print_r($json->sensors[0]->state->output);
	//   echo $json->sensors[0]->state->output;
		if (strpos ($answer, '<script type="text/javascript">')) {
			login ($ip);
			$json = checkSteckdose ($ip);
		}
	}
	return ($json);
}

function setSteckdose ($ip, $port, $status) {
	global $cred,$ch;
	$s = 0;
	if ($status) $s = 1;
	setCURLParameter();
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/sensors/'.$port);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "output=".$s);
	curl_setopt($ch, CURLOPT_POST, true);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    setSteckdose ($ip, $port, $status);
	    exit;
	} else {
	//echo $answer;
		$json = json_decode($answer);
	//	print_r($json);
	//	print_r($json->sensors[0]->state->output);
	//   echo $json->sensors[0]->state->output;
		if (strpos ($answer, '<script type="text/javascript">')) {
			login ($ip);
			$json = setSteckdose ($ip, $port, $status);
		}
	}
	return ($json);
}

function findSubId ($portId,$subtag) {
	$childs = IPS_GetChildrenIDs($portId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], $subtag) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable(1);// 1 = Integer
	IPS_SetName($varid, $subtag);
	IPS_SetParent($varid, $portId);
	IPS_SetInfo($varid, $subtag);
	return ($varid);
}

function findPortId ($catId, $port) {
	global $IPS_SELF;
	$port = "Port ".$port;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$port) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable(0);// 0 = Boolean
	IPS_SetName($varid, $port);
	IPS_SetParent($varid, $catId);
	IPS_SetInfo($varid, $port);
	IPS_SetVariableCustomProfile($varid, "~Switch"); // Profil setzen
	IPS_SetVariableCustomAction($varid, $IPS_SELF); // Als Script sich selbst zuweisen
	return ($varid);
}

function findCatId ($ip) {
	global $IPS_SELF;
	$ParentID = IPS_GetObject($IPS_SELF);
	$ParentID = $ParentID['ParentID'];
	$childs = IPS_GetChildrenIDs($ParentID);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$ip)!== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	//$catid = IPS_CreateCategory();
	$catid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); // Dummy Modul anstelle von Kategorie geht beides geschmackssache
	IPS_SetName($catid, $ip);
	IPS_SetParent($catid, $ParentID);
	IPS_SetInfo($catid, $ip);
	return ($catid);
}

?>

So hier mal mein ziemlich ausgereiftes Script :slight_smile:

Sieht dann nachher etwa so aus:

Vorgehen:

  1. Kategorie anlegen
  2. Script anlegen
  3. Script von unten reinkopieren
  4. Konfiguration vornehmen.
  5. Script einmal von hand anwerfen
<?
/* hier individuelle einstellungen vornehmen */
$archivhandler = 10649 /*[Archive Handler]*/ ;// aus System
$cred  = "username=admin&password=xxxxx"; // Zugangsdaten
$iplist[] = "192.168.11.220";
$iplist[] = "192.168.11.221";
$iplist[] = "192.168.11.222";
$iplist[] = "192.168.11.223";
$iplist[] = "192.168.11.224";
$iplist[] = "192.168.11.225";
IPS_SetScriptTimer($_IPS['SELF'], 20); // wie oft aktualisieren da das abfragen etwas dauert scheint mir schneller als 20 Sek nicht sinnvoll
/* ab hier ende, Variablen werden selbstständig angelegt zur Identifizierung wird die Bemerkung herangezuogen, der suchbegriff muss enthalten bleiben */

IPS_SetHidden($_IPS['SELF'], true);

$verbrauchId = findSubId (IPS_GetObject($_IPS['SELF'])['ParentID'],"Verbräuche", false, 3); // String anlegen / finden zum Verbrauch anzeigen
IPS_SetVariableCustomProfile($verbrauchId, "~HTMLBox");

if ($_IPS['SENDER']=="RunScript") { // das ist der Fall wenn jmd auf die Steckdosenscripte klickt, das wiederrum soll Berechnen der Verbäuche für diese Dose auslösen
	$callerId = $_IPS['CALLER']; // Die ID des Scriptes welches uns aufruft
	$childs = IPS_GetChildrenIDs($callerId);
	$callerName = IPS_GetObject($callerId)["ObjectName"];
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],"Port 1")!== false) $p["1"] = $child;		
		if (strpos($o["ObjectInfo"],"Port 2")!== false) $p["2"] = $child;
		if (strpos($o["ObjectInfo"],"Port 3")!== false) $p["3"] = $child;
	}
	foreach ($p as $key => $val) {
		$childs = IPS_GetChildrenIDs($val);
		foreach ($childs as $child) {
			$o = IPS_GetObject($child);
			if (strpos($o["ObjectInfo"],"Power")!== false) $pid[$key] = $child;
		}
	}
	

	$stamp = date("d.m.Y H:i:s");
	$text = "<span style='font-size:small;'>$stamp<br>Verbrauchs Kalkulation für: $callerName in W/H<br>Die Spalte Tag ist der hoch/runter gerechnete Tagesverbrauch. Die Hochrechung bezieht sich auf den Wochenverbrauch.<br></span>";
	$text.= "<table style='font-size:small;'>";
	$text.="<tr><td>Zeitraum       </td><td>Port 1         </td><td>Port 1 Tag         </td>";
	$text.="<td>Port 2         </td><td>Port 2 Tag         </td>";
	$text.="<td>Port 3         </td><td>Port 3 Tag         </td><td>Alle Ports</td></tr]>";
	
	$e = getVerbrauch (1, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (12, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>12 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>24 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (48, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>48 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (96, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>96 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24*7, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Woche</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$text.="<tr><td>Hochrechnung Jahr (KW/H)</td><td>".round($e[1]/7*365/1000)."</td><td></td><td>".round($e[2]/7*365/1000)."</td><td></td><td>".round($e[3]/7*365/1000)."</td><td></td><td>".round($e[0]/7*365/1000)."</td></tr]>";
	$text.= "</table>";
	
	
	SetValue ($verbrauchId , $text);
   exit;
}
$ch = curl_init();

//print_r ($_IPS);
//setSteckdose ("192.168.11.199", "1", false);
//exit;

// Werte sollen gesetzt werden
if ($_IPS['SENDER']=="WebFront" || $_IPS['SENDER'] == "Variable" ) { // schaltvorgang gewünscht
	SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
	//print_r ($_IPS);
	$callerObj = IPS_GetObject($_IPS['VARIABLE']);
	$ParentID = $callerObj['ParentID'];
	$ParentObj = IPS_GetObject($ParentID);
	$ParrentInfo = $ParentObj["ObjectInfo"];
	$callerInfo = $callerObj["ObjectInfo"];
	$ipmatch = "" ;
	foreach ($iplist as $key => $ip) {
		if (strpos($ParrentInfo, $ip) !== false) $ipmatch = $ip; // falls ausser der IP noch kommentare in der Beschriebung stehen müssen wir die IP suchen
	}
	$port = 1;
	if (strpos($callerInfo, "Port 2") !== false) $port=2; // selbe hier mit den ports
	if (strpos($callerInfo, "Port 3") !== false) $port=3;
	//echo $ip ." vs " .$port."-".GetValue($_IPS['VARIABLE'])."  ".$ParrentInfo;
	setSteckdose ($ipmatch, $port, GetValue($_IPS['VARIABLE']));
	exit;
}

// Die auslese Einheit
if($_IPS['SENDER']=="Execute" || $_IPS['SENDER'] == "TimerEvent") {
	foreach ($iplist as $key => $ip) {
		$ci  =  findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
		$po1 = findPortId ($ci, "1"); // dasselbe für den Port
		$pow1= findSubId ($po1,"Power"); // Und für Subarttribute wie Stromverbrauch
		$po2 = findPortId ($ci, "2"); // dasselbe für den Port
		$pow2= findSubId ($po2,"Power"); // Und für Subarttribute wie Stromverbrauch
		$po3 = findPortId ($ci, "3"); // dasselbe für den Port
		$pow3= findSubId ($po3,"Power"); // Und für Subarttribute wie Stromverbrauch

		if (Sys_Ping ($ip, 220)) {
			$status = checkSteckdose ($ip);
			//	print_r($status);

			//echo $status->sensors[0]->output;
			// FW Unterschiede mit und ohne State
			//SetValue ($po1, $status->sensors[0]->state->output);
			SetValue ($po1, $status->sensors[0]->output==1);
			SetValue ($po2, $status->sensors[1]->output==1);
			SetValue ($po3, $status->sensors[2]->output==1);

			SetValue ($pow1, $status->sensors[0]->power);
			SetValue ($pow2, $status->sensors[1]->power);
			SetValue ($pow3, $status->sensors[2]->power);

			IPS_SetVariableCustomAction($po1, $IPS_SELF);
			IPS_SetVariableCustomAction($po2, $IPS_SELF);
			IPS_SetVariableCustomAction($po3, $IPS_SELF);
		} else {
		   $pf = IPS_GetVariable($pow1)["VariableUpdated"]; // wann hats letzesmal geklappt ?
		   if ($pf <> 0 && time()-$pf > 70) { // nach mehr als 70 Sekunden (beim vierten Fail versuch bei 20Sek Skript takt) gehen wir davon aus das das Ding down ist
				//SetValue ($po1, false);  // ok das war böse hat gegebenfalls Dosen abgeschaltet wenn die Kommunikation mal kurz unterbrochen war
				//SetValue ($po2, false);
				//SetValue ($po3, false);
				IPS_SetVariableCustomAction($po1, 1);
				IPS_SetVariableCustomAction($po2, 1);
				IPS_SetVariableCustomAction($po3, 1);
			}
		}

	}
}

curl_close($ch);

function setCURLParameter() {
	global $cred,$ch;
	//$sCookieFile = "cookie" ;
	$sCookieFile = "";tempnam(sys_get_temp_dir(), 'cookie_ubnt');
	curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_COOKIESESSION, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEJAR, $sCookieFile);  //could be empty, but cause problems on some hosts
	curl_setopt($ch, CURLOPT_COOKIEFILE, $sCookieFile);  //could be empty, but cause problems on some hosts
	curl_setopt($ch, CURLOPT_COOKIE , "AIROS_SESSIONID=01234567890123456789012345678901");
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_VERBOSE, true);

}

function login ($ip) {
	global $cred,$ch;
	curl_close($ch); // sonst nimmt der den cookie nicht nach einer voreigen abfrage
	$ch = curl_init();
	setCURLParameter();
//	echo "login";
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/login.cgi');
	curl_setopt($ch, CURLOPT_POSTFIELDS, $cred);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    exit;
	}
	curl_close($ch);
	//echo $answer;
	IPS_Sleep (500);
	$ch = curl_init();
}

function checkSteckdose ($ip) {
	global $cred,$ch;
	setCURLParameter();
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/sensors');
	curl_setopt($ch, CURLOPT_POSTFIELDS, "output=0");
	curl_setopt($ch, CURLOPT_POST, false);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    exit;
	} else {
		//echo $answer;
		$json = json_decode($answer);
		//print_r($json);
		if (strpos ($answer, '<script type="text/javascript">')) {
			login ($ip);
			$json = checkSteckdose ($ip);
		}
	}
	return ($json);
}

function setSteckdose ($ip, $port, $status) {
	global $cred,$ch;
	$s = 0;
	if ($status) $s = 1;
	setCURLParameter();
	curl_setopt($ch, CURLOPT_URL, 'https://'.$ip.'/sensors/'.$port);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "output=".$s);
	curl_setopt($ch, CURLOPT_POST, true);
	$answer = curl_exec($ch);
	if (curl_error($ch)) {
	    echo curl_error($ch);
	    setSteckdose ($ip, $port, $status);
	    exit;
	} else {
	//echo $answer;
		$json = json_decode($answer);
		if (strpos ($answer, '<script type="text/javascript">')) {
			login ($ip);
			$json = setSteckdose ($ip, $port, $status);
		}
	}
	return ($json);
}

function findSubId ($portId,$subtag, $logging = true, $typ = 1) {
	global $archivhandler;
	$childs = IPS_GetChildrenIDs($portId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], $subtag) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable($typ);// 1 = Integer
	IPS_SetName($varid, $subtag);
	IPS_SetParent($varid, $portId);
	IPS_SetInfo($varid, $subtag);
	if ($logging) AC_SetLoggingStatus($archivhandler,$varid, true);
	return ($varid);
}

function findPortId ($catId, $port) {
	global $IPS_SELF;
	$port = "Port ".$port;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$port) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable(0);// 0 = Boolean
	IPS_SetName($varid, $port);
	IPS_SetParent($varid, $catId);
	IPS_SetInfo($varid, $port);
	IPS_SetVariableCustomProfile($varid, "~Switch"); // Profil setzen
	IPS_SetVariableCustomAction($varid, $IPS_SELF); // Als Script sich selbst zuweisen

	$eid = IPS_CreateEvent(0);                  //Ausgelöstes Ereignis
	IPS_SetEventTrigger($eid, 1, $varid);        //Bei Änderung von Variable mit ID 15754
	IPS_SetParent($eid, $_IPS['SELF']);         //Ereignis zuordnen
	IPS_SetEventActive($eid, true);             //Ereignis aktivieren
	return ($varid);
}

function findCatId ($ip) {
	global $IPS_SELF;
	$ParentID = IPS_GetObject($IPS_SELF);
	$ParentID = $ParentID['ParentID'];
	$childs = IPS_GetChildrenIDs($ParentID);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$ip)!== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	//$catid = IPS_CreateCategory();
	//$catid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); // Dummy Modul anstelle von Kategorie geht beides geschmackssache
	// jetzt sind wir bei Script angelangt ... das Script berechnet durchschnittle Verbräuche ...
   $catid = IPS_CreateScript(0);
   $ScriptTEXT= '<? IPS_RunScriptEx('.$_IPS['SELF'].',Array("CALLER" => $_IPS["SELF"])); ?>'; // im Script steht nur das dieses Script aufgerufen werden soll
   $fh = fopen(IPS_GetKernelDir()."scripts\\".$catid.".ips.php", 'w') or die("can't open file");
   fwrite($fh, $ScriptTEXT);
   fclose($fh);
   $ScriptPath = $catid.".ips.php";     //Skriptdatei
   IPS_SetScriptFile($catid, $ScriptPath);


	IPS_SetName($catid, $ip);
	IPS_SetParent($catid, $ParentID);
	IPS_SetInfo($catid, $ip);
	return ($catid);
}


function getVerbrauch ($h, $pid1, $pid2, $pid3) {
	$start = time();
	global $IPS_SELF;
	global $_IPS;
	global $archivhandler;

	 //Fügen Sie hier ihren Skriptquellcode ein
	$p1 = AC_GetLoggedValues($archivhandler,$pid1,(time() - $h * 60 * 60), time(), 0);
	$p2 = AC_GetLoggedValues($archivhandler,$pid2,(time() - $h * 60 * 60), time(), 0);
	$p3 = AC_GetLoggedValues($archivhandler,$pid3,(time() - $h * 60 * 60), time(), 0);
	IPS_LogMessage ("get Verbrauch " .$pid1 , $h . " " . (time()-$start));
	//print_r ($t);
	$c = 0; $sum = 0;$starttime =0;
	foreach ($p1 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p1Sum = $sum / $c * $h ;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p2 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p2Sum = $sum / $c * $h;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p3 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p3Sum = $sum / $c * $h ;

	$sum = $p1Sum + $p2Sum + $p3Sum;
	$ret[0]= round($sum,0);
	$ret[1]= round($p1Sum,0);
	$ret[2]= round($p2Sum,0);
	$ret[3]= round($p3Sum,0);

	// durchschnittlicher Verbauch in 24 Std
	$ret[4]= round($sum/$h*24,0);
	$ret[5]= round($p1Sum/$h*24,0);
	$ret[6]= round($p2Sum/$h*24,0);
	$ret[7]= round($p3Sum/$h*24,0);

	return ($ret);
}

?>

habe das Script umgestellt auf SSH bzw Telnet. Es werden Sockets automatsich anleget. Funktioniert eigentlich alles wie vorher, nur wesentlich schneller. Reaktionszeit auf eine Schaltanforderung passiert jetzt instantan und nciht mehr mit Gedenkminute wie bei der Web-Schnittstelle.

<?
/* hier individuelle einstellungen vornehmen */
$archivhandler = 10649 /*[Archive Handler]*/ ;// aus System
$user = "admin";
$pw 	= "**********";
$iplist[] = "192.168.11.220";
$iplist[] = "192.168.11.221";
$iplist[] = "192.168.11.222";
$iplist[] = "192.168.11.223";
$iplist[] = "192.168.11.224";
$iplist[] = "192.168.11.225";
IPS_SetScriptTimer($_IPS['SELF'], 20); // wie oft aktualisieren
/* ab hier ende, Variablen werden selbstständig angelegt zur Identifizierung wird die Bemerkung herangezuogen, der suchbegriff muss enthalten bleiben */

IPS_SetHidden($_IPS['SELF'], true);

$verbrauchId = findSubId (IPS_GetObject($_IPS['SELF'])['ParentID'],"Verbräuche", false, 3); // String anlegen / finden zum Verbrauch anzeigen
IPS_SetVariableCustomProfile($verbrauchId, "~HTMLBox");


if ($_IPS['SENDER'] == "RegisterVariable") // aufruf durch die Socket Regvars hier auswerten ob Login nötig ist oder ein Status gesendet wurde
{
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];

		// Logincheck
     $data = check ("login", $user, $data,$_IPS['INSTANCE']);
     $d = $data;
	  $data = check ("Password", $pw, $data,$_IPS['INSTANCE']);
	  if ($d <> $data) {
		  IPS_Sleep(800);
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled1". "
"); // Messungen aktivieren
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled2". "
");
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled3". "
");
  		  RegVar_SendText($_IPS['INSTANCE'], "echo 0 > /proc/led/status". "
"); // LED aus
		  
	  }

	  // Ganze Zeilen rauswerfen
	  // wenn das Trennzeichen 
 in $data gefunden worden ist
     $dataset = explode("
", $data);
     for ($i = 0; $i < count($dataset) -1; $i++)
     {   
			// $dataset[$i] = ein vollständige erhaltene Zeile
         if (substr($dataset[$i],0,3) == "pow") { // eine Verbauchs Info erhalten
            $port = substr($dataset[$i],3,1);
				$ip =	substr($dataset[$i],5,strpos ($dataset[$i],":")-5);
				$val = round(substr($dataset[$i],strpos ($dataset[$i],":")+1),1);
				IPS_LogMessage ("jk" , $port . " _ " . $ip . " ".$val);
				$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
				$po1 = findPortId ($ci, "1"); // dasselbe für den Port
				$pow1= findSubId ($po1,"Power"); // Und für Subarttribute wie Stromverbrauch
				$po2 = findPortId ($ci, "2"); // dasselbe für den Port
				$pow2= findSubId ($po2,"Power"); // Und für Subarttribute wie Stromverbrauch
				$po3 = findPortId ($ci, "3"); // dasselbe für den Port
				$pow3= findSubId ($po3,"Power"); // Und für Subarttribute wie Stromverbrauch
				if ($port == 1) SetValue ($pow1, $val);
				if ($port == 2) SetValue ($pow2, $val);
				if ($port == 3) SetValue ($pow3, $val);
         }
		}
     // $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
     $data = $dataset[count($dataset)-1 ];

    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}

if ($_IPS['SENDER']=="RunScript") { // das ist der Fall wenn jmd auf die Steckdosenscripte klickt, das wiederrum soll Berechnen der Verbäuche für diese Dose auslösen
	$callerId = $_IPS['CALLER']; // Die ID des Scriptes welches uns aufruft
	$childs = IPS_GetChildrenIDs($callerId);
	$callerName = IPS_GetObject($callerId)["ObjectName"];
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],"Port 1")!== false) {$p["1"] = $child; $pName["1"] =IPS_GetObject($child)["ObjectName"]; }
		if (strpos($o["ObjectInfo"],"Port 2")!== false) {$p["2"] = $child; $pName["2"] =IPS_GetObject($child)["ObjectName"]; }
		if (strpos($o["ObjectInfo"],"Port 3")!== false) {$p["3"] = $child; $pName["3"] =IPS_GetObject($child)["ObjectName"]; }
	}
	foreach ($p as $key => $val) {
		$childs = IPS_GetChildrenIDs($val);
		foreach ($childs as $child) {
			$o = IPS_GetObject($child);
			if (strpos($o["ObjectInfo"],"Power")!== false) $pid[$key] = $child;
		}
	}
	

	$stamp = date("d.m.Y H:i:s");
	$text = "<span style='font-size:small;'>$stamp<br>Verbrauchs Kalkulation für: $callerName in W/H<br>Die Spalte Tag ist der hoch/runter gerechnete Tagesverbrauch. Die Hochrechung bezieht sich auf den Wochenverbrauch.<br></span>";
	$text.= "<table style='font-size:small;'>";
	$text.="<tr><td>Zeitraum       </td><td>$pName[1]         </td><td>$pName[1] Tag         </td>";
	$text.="<td>$pName[2]         </td><td>$pName[2] Tag         </td>";
	$text.="<td>$pName[3]         </td><td>$pName[3] Tag         </td><td>Alle Ports</td></tr]>";
	
	$e = getVerbrauch (1, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (12, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>12 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>24 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (48, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>48 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (96, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>96 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24*7, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Woche</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$text.="<tr><td>Hochrechnung Jahr (KW/H)</td><td>".round($e[1]/7*365/1000)."</td><td></td><td>".round($e[2]/7*365/1000)."</td><td></td><td>".round($e[3]/7*365/1000)."</td><td></td><td>".round($e[0]/7*365/1000)."</td></tr]>";
	$text.= "</table>";
	
	
	SetValue ($verbrauchId , $text);
   exit;
}


// Werte sollen gesetzt werden
if ($_IPS['SENDER']=="WebFront" || $_IPS['SENDER'] == "Variable" ) { // schaltvorgang gewünscht
	SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
	//print_r ($_IPS);
	$callerObj = IPS_GetObject($_IPS['VARIABLE']);
	$ParentID = $callerObj['ParentID'];
	$ParentObj = IPS_GetObject($ParentID);
	$ParrentInfo = $ParentObj["ObjectInfo"];
	$callerInfo = $callerObj["ObjectInfo"];
	$ipmatch = "" ;
	foreach ($iplist as $key => $ip) {
		if (strpos($ParrentInfo, $ip) !== false) $ipmatch = $ip; // falls ausser der IP noch kommentare in der Beschriebung stehen müssen wir die IP suchen
	}
	$port = 1;
	if (strpos($callerInfo, "Port 2") !== false) $port=2; // selbe hier mit den ports
	if (strpos($callerInfo, "Port 3") !== false) $port=3;
	//echo $ip ." vs " .$port."-".GetValue($_IPS['VARIABLE'])."  ".$ParrentInfo;
	setSteckdose ($ipmatch, $port, GetValue($_IPS['VARIABLE']));
	exit;
}

// auslesen antriggern, Steckdosen werte setzen
if ($_IPS['SENDER']=="Execute" || $_IPS['SENDER'] == "TimerEvent") {
	foreach ($iplist as $key => $ip) {
		$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
		$socket = findRegVarSocketId ($ci, $ip);
		$po1 = findPortId ($ci, "1"); // dasselbe für den Port
		$po2 = findPortId ($ci, "2"); // dasselbe für den Port
		$po3 = findPortId ($ci, "3"); // dasselbe für den Port
		setSteckdose ($ip, 1 , GetValue($po1)); // Port Status wird gesetzt wie in IPS also IPS ist das führende System
		setSteckdose ($ip, 2 , GetValue($po2));
		setSteckdose ($ip, 3 , GetValue($po3));

		//IPS_Sleep (200);
		$send = "{ echo -n pow1_".$ip.": ; cat /proc/power/active_pwr1 ; echo -n ; };";
		$send.= "{ echo -n pow2_".$ip.": ; cat /proc/power/active_pwr2 ; echo -n ; };";
		$send.= "{ echo -n pow3_".$ip.": ; cat /proc/power/active_pwr3 ; echo -n ; }";
		RegVar_SendText($socket, $send. "
");
		//IPS_LogMessage ("jk" ,$send);
		//echo $send."
";
		$p = IPS_GetInstanceParentID($socket);
		$online = IPS_GetInstance($p)["InstanceStatus"] == 102;
//		echo $ip . " - " .$online ."
";
		if ($online) { // wenn Port Online dann Script als Action setzen, sonst nix somit nicht mehr klickbar
			IPS_SetVariableCustomAction($po1, $IPS_SELF);
			IPS_SetVariableCustomAction($po2, $IPS_SELF);
			IPS_SetVariableCustomAction($po3, $IPS_SELF);
		} else {
			IPS_SetVariableCustomAction($po1, 1);
			IPS_SetVariableCustomAction($po2, 2);
			IPS_SetVariableCustomAction($po3, 3);
		}
	}
}

function setSteckdose ($ip, $port, $status) {
	$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
	$socket = findRegVarSocketId ($ci, $ip);
	$val = 0; if ($status) $val = 1;
	RegVar_SendText($socket, "echo ".$val." > /proc/power/relay".$port. "
");
}

function findRegVarSocketId ($catId, $ip) {
	global $IPS_SELF;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], "Client Socket ".$ip) !== false) return ($child);
	}
	
	$socketId = IPS_CreateInstance("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); // Client Socket anlegen
	IPS_SetName($socketId, "Socket ".$ip);
	// IPS_SetParent($socketId, $catId); negativ mit Client Socket
	IPS_SetInfo($socketId, "Client Socket ".$ip);
	IPS_SetProperty ($socketId, "Port", "23");
	IPS_SetProperty ($socketId, "Host", $ip);
	IPS_SetProperty ($socketId, "Open", 1);

	$rvarId = IPS_CreateInstance("{F3855B3C-7CD6-47CA-97AB-E66D346C037F}"); // Reg Var anlegen
	IPS_SetName($rvarId, "Regvar ".$ip);
	IPS_SetParent($rvarId, $catId);
	IPS_SetInfo($rvarId, "Reg Var für Client Socket ".$ip." ".$socketId);
	IPS_SetProperty ($rvarId, "RXObjectID", $IPS_SELF); // Als Script sich selbst zuweisen
	IPS_ConnectInstance ( $rvarId, $socketId );
	IPS_SetHidden ( $rvarId, true );

	IPS_ApplyChanges ( $rvarId);
	IPS_ApplyChanges ( $socketId );
	
	return ($rvarId);
}

function findSubId ($portId,$subtag, $logging = true, $typ = 1) {
	global $archivhandler;
	$childs = IPS_GetChildrenIDs($portId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], $subtag) !== false) {
			//if ($logging) AC_SetLoggingStatus($archivhandler,$child, true);
			return ($child);
		}
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable($typ);// 1 = Integer
	IPS_SetName($varid, $subtag);
	IPS_SetParent($varid, $portId);
	IPS_SetInfo($varid, $subtag);
	if ($logging) AC_SetLoggingStatus($archivhandler,$varid, true);
	return ($varid);
}

function findPortId ($catId, $port) {
	global $IPS_SELF;
	$port = "Port ".$port;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$port) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable(0);// 0 = Boolean
	IPS_SetName($varid, $port);
	IPS_SetParent($varid, $catId);
	IPS_SetInfo($varid, $port);
	IPS_SetVariableCustomProfile($varid, "~Switch"); // Profil setzen
	IPS_SetVariableCustomAction($varid, $IPS_SELF); // Als Script sich selbst zuweisen

	$eid = IPS_CreateEvent(0);                  //Ausgelöstes Ereignis
	IPS_SetEventTrigger($eid, 1, $varid);        //Bei Änderung von Variable mit ID 15754
	IPS_SetParent($eid, $_IPS['SELF']);         //Ereignis zuordnen
	IPS_SetEventActive($eid, true);             //Ereignis aktivieren
	return ($varid);
}

function findCatId ($ip) {
	global $IPS_SELF;
	$ParentID = IPS_GetObject($IPS_SELF);
	$ParentID = $ParentID['ParentID'];
	$childs = IPS_GetChildrenIDs($ParentID);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$ip)!== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	//$catid = IPS_CreateCategory();
	//$catid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); // Dummy Modul anstelle von Kategorie geht beides geschmackssache
	// jetzt sind wir bei Script angelangt ... das Script berechnet durchschnittle Verbräuche ...
   $catid = IPS_CreateScript(0);
   $ScriptTEXT= '<? IPS_RunScriptEx('.$_IPS['SELF'].',Array("CALLER" => $_IPS["SELF"])); ?>'; // im Script steht nur das dieses Script aufgerufen werden soll
   $fh = fopen(IPS_GetKernelDir()."scripts\\".$catid.".ips.php", 'w') or die("can't open file");
   fwrite($fh, $ScriptTEXT);
   fclose($fh);
   $ScriptPath = $catid.".ips.php";     //Skriptdatei
   IPS_SetScriptFile($catid, $ScriptPath);


	IPS_SetName($catid, $ip);
	IPS_SetParent($catid, $ParentID);
	IPS_SetInfo($catid, $ip);
	return ($catid);
}


function getVerbrauch ($h, $pid1, $pid2, $pid3) {
	$start = time();
	global $IPS_SELF;
	global $_IPS;
	global $archivhandler;

	 //Fügen Sie hier ihren Skriptquellcode ein
	$p1 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid1,(time() - $h * 60 * 60), time(), 0);
	$p2 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid2,(time() - $h * 60 * 60), time(), 0);
	$p3 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid3,(time() - $h * 60 * 60), time(), 0);
	IPS_LogMessage ("get Verbrauch " .$pid1 , $h . " " . (time()-$start));
	//print_r ($t);
	$c = 0; $sum = 0;$starttime =0;
	foreach ($p1 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p1Sum = $sum / $c * $h ;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p2 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p2Sum = $sum / $c * $h;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p3 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p3Sum = $sum / $c * $h ;

	$sum = $p1Sum + $p2Sum + $p3Sum;
	$ret[0]= round($sum,0);
	$ret[1]= round($p1Sum,0);
	$ret[2]= round($p2Sum,0);
	$ret[3]= round($p3Sum,0);

	// durchschnittlicher Verbauch in 24 Std
	$ret[4]= round($sum/$h*24,0);
	$ret[5]= round($p1Sum/$h*24,0);
	$ret[6]= round($p2Sum/$h*24,0);
	$ret[7]= round($p3Sum/$h*24,0);

	return ($ret);
}

function AC_GetLoggedValuesBisStartTime($instanceID, $variableID, $startTime, $endTime, $limit) {
    $values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
    if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime)) {
        $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
		  $previousRow["0"]["Duration"] =  end($values)['TimeStamp'] - $startTime;
		  $previousRow["0"]["TimeStamp"]=  $startTime;
        $values = array_merge($values, $previousRow);
    }
    return $values;
}

function check ($pruefenauf, $send, $data, $instance) {
	$pos = strpos ($data, $pruefenauf);
	if ( $pos ) {
		RegVar_SendText($instance, $send . "\r");
		$data =substr($data,$pos + strlen($pruefenauf));
	}
	return ($data);
}

?>

Hi,

habe es mal installiert. Also das letzte Skript von dir. Bekomme folgenden Fehler. Im WF kann ich zwar ein und ausschalten
aber im Reiter Verbräuche passiert garnichts.

Und im IOS/App habe ich nur das Skript und Verbräuche, nicht aber die Ports zum schalten.

Hallo Uwe,

Erstmal respekt an so einem Tag noch während die Sonne scheint am Rechner :slight_smile:

Das ist merkwürdig. Ich nehme an die Fehler kommen, wenn du das „Schlafzimmer Script“ ausführst. Müsste mal wissen was das bei dir für Zeilen sind die der anmeckert. Da du ja die Konfiguration angepasst hast wird das mit den Zeilennummern bei mir nicht mehr passen. Liesst er denn erfolgreich die Verbäuche aus ?

Ich hab übrigens jetzt das probelm das sich die Verbindugen scheinbar gelegentlich kappen. Sieht man wenn im Webfront die Schalter für die Steckdosen weg sind.

Zur Iphone App kann ich leider nichts sagen, da ich die nicht habe. (Obwohl ich ein IPhone hab :slight_smile: )

Gruß,
Jan

Hi Jan, nein die Verbräuche liest er nicht aus.

$sum += ($set["Value"]* $set ["Duration"]);             //Zeile 299
$sum += ($set["Value"]* $set ["Duration"]);             //Zeile 308
$sum += ($set["Value"]* $set ["Duration"]);             //Zeile 317

Okay dann tippe ich die Scriptfehler kommen, weil Logging auf der Power Variable nicht aktiviert ist ?! Ich glaube das macht das Script nicht mehr automatisch.

Aber das Power nicht ausgelesen wird ist komisch. Müssten wir uns vielleicht mal per Teamviewer oder so anschauen.

Gruß,
Jan

Ok, wann ?

Wenn ich das Skript starte kommt folgende Fehlermeldung siehe Bild.

Bei Power wird mir der Wert angezeigt.

Ein paar Bugfixes insbesondere was die Verbauchskalkulation betrifft. Ich habs jetzt in der Funktion AC_GetLoggedValuesBisStartTime gelöst Uwe. Kannst ja mal testen ob das bei dir auch so funktioniert wie es soll. Aber sicher dir dein jetziges Script :slight_smile:

<?
/* hier individuelle einstellungen vornehmen */
$archivhandler = 10649 /*[Archive Handler]*/ ;// aus System
$user = "admin";
$pw 	= "******";
$iplist[] = "192.168.11.220";
$iplist[] = "192.168.11.221";
$iplist[] = "192.168.11.222";
$iplist[] = "192.168.11.223";
$iplist[] = "192.168.11.224";
$iplist[] = "192.168.11.225";
IPS_SetScriptTimer($_IPS['SELF'], 20); // wie oft aktualisieren
/* ab hier ende, Variablen werden selbstständig angelegt zur Identifizierung wird die Bemerkung herangezuogen, der suchbegriff muss enthalten bleiben */

IPS_SetHidden($_IPS['SELF'], true);

$verbrauchId = findSubId (IPS_GetObject($_IPS['SELF'])['ParentID'],"Verbräuche", false, 3); // String anlegen / finden zum Verbrauch anzeigen
IPS_SetVariableCustomProfile($verbrauchId, "~HTMLBox");


if ($_IPS['SENDER'] == "RegisterVariable") // aufruf durch die Socket Regvars hier auswerten ob Login nötig ist oder ein Status gesendet wurde
{
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];

		// Logincheck
     $data = check ("login", $user, $data,$_IPS['INSTANCE']);
     $d = $data;
	  $data = check ("Password", $pw, $data,$_IPS['INSTANCE']);
	  if ($d <> $data) {
		  IPS_Sleep(800);
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled1". "
"); // Messungen aktivieren
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled2". "
");
		  RegVar_SendText($_IPS['INSTANCE'], "echo 1 > /proc/power/enabled3". "
");
  		  RegVar_SendText($_IPS['INSTANCE'], "echo 99 > /proc/led/status". "
"); // LED aus
		  
	  }

	  // Ganze Zeilen rauswerfen
	  // wenn das Trennzeichen 
 in $data gefunden worden ist
     $dataset = explode("
", $data);
     for ($i = 0; $i < count($dataset) -1; $i++)
     {   
			// $dataset[$i] = ein vollständige erhaltene Zeile
         if (substr($dataset[$i],0,3) == "pow") { // eine Verbauchs Info erhalten
            $port = substr($dataset[$i],3,1);
				$ip =	substr($dataset[$i],5,strpos ($dataset[$i],":")-5);
				$val = round(substr($dataset[$i],strpos ($dataset[$i],":")+1),1);
				IPS_LogMessage ("jk" , $port . " _ " . $ip . " ".$val);
				$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
				$po1 = findPortId ($ci, "1"); // dasselbe für den Port
				$pow1= findSubId ($po1,"Power"); // Und für Subarttribute wie Stromverbrauch
				$po2 = findPortId ($ci, "2"); // dasselbe für den Port
				$pow2= findSubId ($po2,"Power"); // Und für Subarttribute wie Stromverbrauch
				$po3 = findPortId ($ci, "3"); // dasselbe für den Port
				$pow3= findSubId ($po3,"Power"); // Und für Subarttribute wie Stromverbrauch
				if ($port == 1) SetValue ($pow1, $val);
				if ($port == 2) SetValue ($pow2, $val);
				if ($port == 3) SetValue ($pow3, $val);
         }
		}
     // $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
     $data = $dataset[count($dataset)-1 ];

    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}

if ($_IPS['SENDER']=="RunScript") { // das ist der Fall wenn jmd auf die Steckdosenscripte klickt, das wiederrum soll Berechnen der Verbäuche für diese Dose auslösen
	$callerId = $_IPS['CALLER']; // Die ID des Scriptes welches uns aufruft
	$childs = IPS_GetChildrenIDs($callerId);
	$callerName = IPS_GetObject($callerId)["ObjectName"];
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],"Port 1")!== false) {$p["1"] = $child; $pName["1"] =IPS_GetObject($child)["ObjectName"]; }
		if (strpos($o["ObjectInfo"],"Port 2")!== false) {$p["2"] = $child; $pName["2"] =IPS_GetObject($child)["ObjectName"]; }
		if (strpos($o["ObjectInfo"],"Port 3")!== false) {$p["3"] = $child; $pName["3"] =IPS_GetObject($child)["ObjectName"]; }
	}
	foreach ($p as $key => $val) {
		$childs = IPS_GetChildrenIDs($val);
		foreach ($childs as $child) {
			$o = IPS_GetObject($child);
			if (strpos($o["ObjectInfo"],"Power")!== false) $pid[$key] = $child;
		}
	}
	

	$stamp = date("d.m.Y H:i:s");
	$text = "<span style='font-size:small;'>$stamp<br>Verbrauchs Kalkulation für: $callerName in W/H<br>Die Spalte Tag ist der hoch/runter gerechnete Tagesverbrauch. Die Hochrechung bezieht sich auf den Wochenverbrauch.<br></span>";
	$text.= "<table style='font-size:small;'>";
	$text.="<tr><td>Zeitraum       </td><td>$pName[1]         </td><td>$pName[1] Tag         </td>";
	$text.="<td>$pName[2]         </td><td>$pName[2] Tag         </td>";
	$text.="<td>$pName[3]         </td><td>$pName[3] Tag         </td><td>Alle Ports</td></tr]>";
	
	$e = getVerbrauch (1, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (12, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>12 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>24 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (48, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>48 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (96, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>96 Std</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$e = getVerbrauch (24*7, $pid[1], $pid[2], $pid[3]);
	$text.="<tr><td>1 Woche</td><td>$e[1]</td><td>$e[5]</td><td>$e[2]</td><td>$e[6]</td><td>$e[3]</td><td>$e[7]</td><td>$e[0]</td><td>$e[4]</td></tr]>";
	
	$text.="<tr><td>Hochrechnung Jahr (KW/H)</td><td>".round($e[1]/7*365/1000)."</td><td></td><td>".round($e[2]/7*365/1000)."</td><td></td><td>".round($e[3]/7*365/1000)."</td><td></td><td>".round($e[0]/7*365/1000)."</td></tr]>";
	$text.= "</table>";
	
	
	SetValue ($verbrauchId , $text);
   exit;
}


// Werte sollen gesetzt werden
if ($_IPS['SENDER']=="WebFront" || $_IPS['SENDER'] == "Variable" ) { // schaltvorgang gewünscht
	SetValue($_IPS['VARIABLE'],$_IPS['VALUE']);
	//print_r ($_IPS);
	$callerObj = IPS_GetObject($_IPS['VARIABLE']);
	$ParentID = $callerObj['ParentID'];
	$ParentObj = IPS_GetObject($ParentID);
	$ParrentInfo = $ParentObj["ObjectInfo"];
	$callerInfo = $callerObj["ObjectInfo"];
	$ipmatch = "" ;
	foreach ($iplist as $key => $ip) {
		if (strpos($ParrentInfo, $ip) !== false) $ipmatch = $ip; // falls ausser der IP noch kommentare in der Beschriebung stehen müssen wir die IP suchen
	}
	$port = 1;
	if (strpos($callerInfo, "Port 2") !== false) $port=2; // selbe hier mit den ports
	if (strpos($callerInfo, "Port 3") !== false) $port=3;
	//echo $ip ." vs " .$port."-".GetValue($_IPS['VARIABLE'])."  ".$ParrentInfo;
	setSteckdose ($ipmatch, $port, GetValue($_IPS['VARIABLE']));
	exit;
}

// auslesen antriggern, Steckdosen werte setzen
if ($_IPS['SENDER']=="Execute" || $_IPS['SENDER'] == "TimerEvent") {
	foreach ($iplist as $key => $ip) {
		$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
		$socket = findRegVarSocketId ($ci, $ip);
		//IPS_LogMessage ("jk" ,$send);
		//echo $send."
";
		$p = IPS_GetInstanceParentID($socket);
		$online = IPS_GetInstance($p)["InstanceStatus"] == 102;
//		echo $ip . " - " .$online ."
";
		if ($online) { // wenn Port Online dann Script als Action setzen, sonst nix somit nicht mehr klickbar
			$po1 = findPortId ($ci, "1"); // dasselbe für den Port
			$po2 = findPortId ($ci, "2"); // dasselbe für den Port
			$po3 = findPortId ($ci, "3"); // dasselbe für den Port
			setSteckdose ($ip, 1 , GetValue($po1)); // Port Status wird gesetzt wie in IPS also IPS ist das führende System
			IPS_Sleep (10);
			setSteckdose ($ip, 2 , GetValue($po2));
			IPS_Sleep (10);
			setSteckdose ($ip, 3 , GetValue($po3));
			IPS_Sleep (10);
			$send = "{ echo -n pow1_".$ip.": ; cat /proc/power/active_pwr1 ; echo -n ; }";
			RegVar_SendText($socket, $send. "
");
			IPS_Sleep (10);
			$send.= "{ echo -n pow2_".$ip.": ; cat /proc/power/active_pwr2 ; echo -n ; }";
			RegVar_SendText($socket, $send. "
");
			IPS_Sleep (10);
			$send.= "{ echo -n pow3_".$ip.": ; cat /proc/power/active_pwr3 ; echo -n ; }";
			RegVar_SendText($socket, $send. "
");
			IPS_SetVariableCustomAction($po1, $IPS_SELF);
			IPS_SetVariableCustomAction($po2, $IPS_SELF);
			IPS_SetVariableCustomAction($po3, $IPS_SELF);
		} else {
			IPS_SetVariableCustomAction($po1, 1);
			IPS_SetVariableCustomAction($po2, 2);
			IPS_SetVariableCustomAction($po3, 3);
		}
	}
}

function setSteckdose ($ip, $port, $status) {
	$ci  = findCatId ($ip); // Id der Steckdosenleiste Finden sonst anlegen
	$socket = findRegVarSocketId ($ci, $ip);
	$val = 0; if ($status) $val = 1;
	RegVar_SendText($socket, "echo ".$val." > /proc/power/relay".$port. "
");
}

function findRegVarSocketId ($catId, $ip) {
	global $IPS_SELF;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], "Client Socket ".$ip) !== false) return ($child);
	}
	
	$socketId = IPS_CreateInstance("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); // Client Socket anlegen
	IPS_SetName($socketId, "Socket ".$ip);
	// IPS_SetParent($socketId, $catId); negativ mit Client Socket
	IPS_SetInfo($socketId, "Client Socket ".$ip);
	IPS_SetProperty ($socketId, "Port", "23");
	IPS_SetProperty ($socketId, "Host", $ip);
	IPS_SetProperty ($socketId, "Open", 1);

	$rvarId = IPS_CreateInstance("{F3855B3C-7CD6-47CA-97AB-E66D346C037F}"); // Reg Var anlegen
	IPS_SetName($rvarId, "Regvar ".$ip);
	IPS_SetParent($rvarId, $catId);
	IPS_SetInfo($rvarId, "Reg Var für Client Socket ".$ip." ".$socketId);
	IPS_SetProperty ($rvarId, "RXObjectID", $IPS_SELF); // Als Script sich selbst zuweisen
	IPS_ConnectInstance ( $rvarId, $socketId );
	IPS_SetHidden ( $rvarId, true );

	IPS_ApplyChanges ( $rvarId);
	IPS_ApplyChanges ( $socketId );
	
	return ($rvarId);
}

function findSubId ($portId,$subtag, $logging = true, $typ = 1) {
	global $archivhandler;
	$childs = IPS_GetChildrenIDs($portId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"], $subtag) !== false) {
			//if ($logging) AC_SetLoggingStatus($archivhandler,$child, true);
			return ($child);
		}
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable($typ);// 1 = Integer
	IPS_SetName($varid, $subtag);
	IPS_SetParent($varid, $portId);
	IPS_SetInfo($varid, $subtag);
	if ($logging) AC_SetLoggingStatus($archivhandler,$varid, true);
	return ($varid);
}

function findPortId ($catId, $port) {
	global $IPS_SELF;
	$port = "Port ".$port;
	$childs = IPS_GetChildrenIDs($catId);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$port) !== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	$varid = IPS_CreateVariable(0);// 0 = Boolean
	IPS_SetName($varid, $port);
	IPS_SetParent($varid, $catId);
	IPS_SetInfo($varid, $port);
	IPS_SetVariableCustomProfile($varid, "~Switch"); // Profil setzen
	IPS_SetVariableCustomAction($varid, $IPS_SELF); // Als Script sich selbst zuweisen

	$eid = IPS_CreateEvent(0);                  //Ausgelöstes Ereignis
	IPS_SetEventTrigger($eid, 1, $varid);        //Bei Änderung von Variable mit ID 15754
	IPS_SetParent($eid, $_IPS['SELF']);         //Ereignis zuordnen
	IPS_SetEventActive($eid, true);             //Ereignis aktivieren
	return ($varid);
}

function findCatId ($ip) {
	global $IPS_SELF;
	$ParentID = IPS_GetObject($IPS_SELF);
	$ParentID = $ParentID['ParentID'];
	$childs = IPS_GetChildrenIDs($ParentID);
	foreach ($childs as $child) {
		$o = IPS_GetObject($child);
		if (strpos($o["ObjectInfo"],$ip)!== false) return ($child);
	}
	// gibt es noch nicht, also legen wir es an
	//$catid = IPS_CreateCategory();
	//$catid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); // Dummy Modul anstelle von Kategorie geht beides geschmackssache
	// jetzt sind wir bei Script angelangt ... das Script berechnet durchschnittle Verbräuche ...
   $catid = IPS_CreateScript(0);
   $ScriptTEXT= '<? IPS_RunScriptEx('.$_IPS['SELF'].',Array("CALLER" => $_IPS["SELF"])); ?>'; // im Script steht nur das dieses Script aufgerufen werden soll
   $fh = fopen(IPS_GetKernelDir()."scripts\\".$catid.".ips.php", 'w') or die("can't open file");
   fwrite($fh, $ScriptTEXT);
   fclose($fh);
   $ScriptPath = $catid.".ips.php";     //Skriptdatei
   IPS_SetScriptFile($catid, $ScriptPath);


	IPS_SetName($catid, $ip);
	IPS_SetParent($catid, $ParentID);
	IPS_SetInfo($catid, $ip);
	return ($catid);
}


function getVerbrauch ($h, $pid1, $pid2, $pid3) {
	$start = time();
	global $IPS_SELF;
	global $_IPS;
	global $archivhandler;

	 //Fügen Sie hier ihren Skriptquellcode ein
	$p1 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid1,(time() - $h * 60 * 60), time(), 0);
	$p2 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid2,(time() - $h * 60 * 60), time(), 0);
	$p3 = AC_GetLoggedValuesBisStartTime($archivhandler,$pid3,(time() - $h * 60 * 60), time(), 0);
	IPS_LogMessage ("get Verbrauch " .$pid1 , $h . " " . (time()-$start));
	//print_r ($t);
	$c = 0; $sum = 0;$starttime =0;
	foreach ($p1 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p1Sum = $sum / $c * $h ;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p2 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p2Sum = $sum / $c * $h;

	$c = 0; $sum = 0;$starttime =0;
	foreach ($p3 as $set) {
		$starttime = $set["TimeStamp"];
		// echo $set["Value"]. "
";
		$sum += ($set["Value"]* $set ["Duration"]);
		$c += $set ["Duration"];
	}
	$p3Sum = $sum / $c * $h ;

	$sum = $p1Sum + $p2Sum + $p3Sum;
	$ret[0]= round($sum,0);
	$ret[1]= round($p1Sum,0);
	$ret[2]= round($p2Sum,0);
	$ret[3]= round($p3Sum,0);

	// durchschnittlicher Verbauch in 24 Std
	$ret[4]= round($sum/$h*24,0);
	$ret[5]= round($p1Sum/$h*24,0);
	$ret[6]= round($p2Sum/$h*24,0);
	$ret[7]= round($p3Sum/$h*24,0);

	return ($ret);
}

function AC_GetLoggedValuesBisStartTime($instanceID, $variableID, $startTime, $endTime, $limit) {
    $values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
    if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime)) {
        $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
		  $previousRow["0"]["Duration"] =  end($values)['TimeStamp'] - $startTime;
		  if ($previousRow["0"]["Duration"] < 0) $previousRow["0"]["Duration"] = $endTime - $startTime; // wenn kein Datensatz gefunden
		  $previousRow["0"]["TimeStamp"]=  $startTime;
		  if (!isset ($previousRow["0"]["Value"])) $previousRow["0"]["Value"] = 0;
  		  $previousRow["0"]["LastTime"] = $previousRow["0"]["TimeStamp"] + $previousRow["0"]["Duration"] - 1;
		  $previousRow["0"]["Value"]= 0;
        $values = array_merge($values, $previousRow);
    }
    return $values;
}

function check ($pruefenauf, $send, $data, $instance) {
	$pos = strpos ($data, $pruefenauf);
	if ( $pos ) {
		RegVar_SendText($instance, $send . "\r");
		$data =substr($data,$pos + strlen($pruefenauf));
	}
	return ($data);
}

?>

Hi,

Danke für das Script, soweit funkioniert Ein und Ausschalten.
Doch leider die Werte liest er mir nur von Port 1.
Habe jetzt schon 3 Steckdosenleisten, bei allen wir immer nur Wert 1 ausgelesen.

Wo ist der Fehler?

Vielen Dank

Hallo,

guter Punkt, hmm hab hier mehr oder weniger nur in Steckdose 1 jeweils was relevantes. Werde das mal prüfen.

Gruß,
Jan

Hab jetzt versucht das Script 1 zu 1 in die Version 4.1 auf einem Linux zum laufen zu bringen.
Er legt die Variablen an aber im Log steht:

Client Socket*| Fehler beim Lesen: End of file

Ein Schalten ist nun nicht mehr möglich :frowning:

Ich habe zusätzlich folgende Zeile 152 geändert:
$p = IPS_GetInstanceParentID($socket);
durch:
$p = IPS_GetInstance($socket)[‚ConnectionID‘];

habt ihr das bei Version 4.1 laufen?

Ich habe nun noch die Zeile 211 angepasst:
IPS_SetProperty ($rvarId, „RXObjectID“, $_IPS[‚SELF‘]);

$IPS_SELF hab ich geändert auf $_IPS[‚SELF‘]

Das Script macht nun keine Fehler mehr, aber der Client Socket bricht immer noch jede Minute ab und die Leiste lässt sich nicht schalten.

Auf meinem Symcon Test Server in Version 3 funktioniert der Client Socket noch stabil.
Auf einem Syncon Version 4 auf Windows ist das gleche problem, also scheint es mir ein Problem von der 4.1 zu sein.

Hast jemand eine Idee? Kann jemand sein Skript das in V4 läuft hier kurz posten?

Hi,

also ich hab IPS 4.0 derzeit, läuft soweit. Ich kann ja mal updaten und gucken ob was passiert. Ich mach aber vorher Backup :smiley:

Gruß,
Jan

Das wäre super, da ich mittlerweile schon am verzweifeln bin.

Was ich komisch finde, warum machen wir die Socket Verbindung auf Port 23 auf. Wenn Telnet auf Port 22 läuft?
Aber in meinem 3.4er System läuft ja noch alles Problemlos.

Es gibt ja nun auch einen mFi Controller. Mal geschaut ob man ggf. einen Server Socket anlegt um dann die Daten sich von der Steckerleiste schicken lässt?

Leider keine Subscription mehr. Kann ich also nicht mal eben testen.

Ich weiss auch nicht mehr ob ich damals noch was an dem Script geschraubt habe. Achja ich hatte ja auch so ein „Abbruch“ Problem. Das legte sich nach einem Bios Update von meinem AP.

Telnet ist schon Port 23, 22 ist glaube ich mit SSH.

Gruß,
Jan

Ich habe nun testeshalber von 3.4 auf 4.1 upgedatet. Nach dem Update hat es weiterhin funktioniert.
Nur wenn ich das Script auf einer neuen 4.1 installation, dann bekomme ich Probleme, dass der Client Socket abbricht.
Ich kann es mir nicht erklären…

So ich habe mir nun die Arbeit gemacht, mit meinem Update aus 3.4 weiter zu arbeiten.
Also keine wirkliche Lösung für dieses Problem. Aber ich kann mit diesem Lösungsweg leben.

Noch eine Frage. Was muss ich bei dem Script anpassen, wenn ich auch Stecker habe mit nur einer Dose?
Kannst du mir da weiterhelfen?

Haste schon mal getestet mit einer einer? Schätz mal das tut auch so … naja kriegst ein paar Variablen die Du eigentlich nicht brauchst. Das müsste man dann unterbinden. Z.B. indem man zusätzlich zur IP nen Typ hinterlegt und dann halt entsprechend berücksichtigt.

Jan