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 
<?
/* 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);
}
?>