Tageshöchsttemperatur ermitteln?

Hallo,

kann ich irgendwie auf einfache Weise die Tageshöchsttemperatur ermitteln.
ich logge die Variable mit der Temperatur mit. Mir würde derzeit nur einfallen, das ich bei jeder Variablenänderung eine 2 Variable auf die Höchsttemperatur setze (vergleichen und dann setzen).
Oder gibt es da einen Befehl, dass ich um Mitternacht einfach die letzten 24std anschaue und so die höchstemperatur ermittle?

garfi35

Du könntest die Werte für einen Tag auslesen und in ein array schreiben und nach dem höchsten Wert sortieren.

Oder bei jeder Temp Änderung ein Skript triggern welches eine vorher angelegte Variable (Max_Temp) ausliest, dann mit dem Wert des Sensors vergleicht und falls Wert_Sensor > Max_temp den Sensor Wert in der Variable Max_Wert mit Wert_Sensor überschreibt. Um 00:00h jeden Tag setzt Du dann Max_Wert auf „0“.

Damit hättest Du in Max_temp immer den jeweils höchsten am Tag gemessenen Wert.

Oder war das die Idee wie oben von Dir beschrieben?

Wenn Du eh schon loggst:

<?php
$id = 12345;
$dayValues = AC_GetAggregatedValues(IPS_GetInstanceIDByName('Archive Handler', 0), $id, 1, time() - 24 * 3600, time(), 1000);
if (isset($dayValues[0]))
{
    echo 'heutige Maximaltemperatur ('.date('H:i:s', $dayValues[0]['MaxTime']).' Uhr): '.$dayValues[0]['Max'].' °C';
}
else
{
    echo 'Für den heutigen Tag sind noch keine geloggten Daten vorhanden.';
}
?>

Korrigierte Version von vorhin. :slight_smile:

28761 ID Archive Handler
35017 ID der Variable

// Maximalwert letzte 24 Stunden
$temp = AC_GetLoggedValues(28761 /*[Archive Handler]*/, 35017, time()-(1440*60), time(), 0);

foreach ($temp as $key => $value)
{
    $maxTemp[] = $value['Value'];
    rsort($maxTemp);
}
print_r($maxTemp);

Hier noch mal mit max-min-mittelwert.

// Maximal-Minimal-Mittelwert letzte 24 Stunden
$temp = AC_GetLoggedValues(28761 /*[Archive Handler]*/, 35017, time()-(1440*60), time(), 0);

foreach ($temp as $key => $v)
{
    $value[] = $v['Value'];
    $anzahl = count($value);
    rsort($value);
}
$maxWert = array_shift($value);
$minWert = array_pop($value);
$mittelWert = array_sum($value)/$anzahl;
echo "Höchstwert: ".$maxWert." °C"."
"."Minimalwert: ".$minWert." °C "."
"."Mittelwert: ".number_format($mittelWert, 1)." °C";

Hallo Rainer,

tolles Skript! Vielen Dank!

Joachim

Danke an Rainer und Horst für die guten Scripte, das ist genau das was ich gesucht habe.
Mit dem Archiv Handler hab ich noch nichts gemacht, das bringt mich aber auf einige neue Ideen.

garfi35

Hallo zusammen,

ich wollte das Script bei mir auch einbauen. Leider kommt folgender Fehler:

Notice:  Undefined index:  Value in E:\IP-Symcon\IP-Symcon\scripts\17904.ips.php on line 8

Zeile 8 ist:

$value[] = $v['Value'];

Dabei ist es egal, welches der beiden Scripte von RWN ich nehme. Beim ersten Script kommt der Fehler auch in der Zeile innerhalb des „foreach“. Getestet per Klick auf „ausführen“. Variable wird geloggt…

Wo kann da der Fehler liegen? Ich habe allerdings noch Version 2.1 … Kann das damit zusammenhängen?

Danke und Gruß,
Christoph

lauffähig ab Version 2.2

Alles klar, Danke!

Man gut, dass ich gestern die neue Subskription bestellt habe! :wink:

Danke RWN
Gibt es noch die Möglichkeit die Uhrzeit für Max und Minwert mit auszugeben?

Ich habe mal mir RWNs Script ein wenig gespielt. Und das ist dann da herausgekommen:

<?
$TempVar = GetValue(48943 /*[Test\Höchstwerte\H/T\TempVariable]*/) ;
$Temp = IPS_GetVariable($TempVar);

// Maximal-Minimal-Mittelwert letzte 24 Stunden
$temp = AC_GetLoggedValues(58196 /*[Archive Handler]*/, $TempVar, time()-(1440*60), time(), 0);

//print_r(array_values($temp));
foreach ($temp as $key => $v)
{
    $value[] = $v['Value'];
    $Zeit[]  = $v['TimeStamp'];
    $anzahl = count($value);
    rsort($value);
}
$maxWert = array_shift($value);
$maxZeit = array_shift($Zeit);
$minWert = array_pop($value);
$minZeit = array_pop($Zeit);
$mittelWert = array_sum($value)/$anzahl;

echo "Name Var.:    " .IPS_GetName($TempVar)."  "
.strftime("%d-%m-%Y  %H:%M:%S",intval($Temp['VariableUpdated']))."
";
echo ("Wert Jetzt:   " . number_format($Temp['VariableValue']['ValueFloat'],1)
." °C  um ".date("d-m-Y  H:i:s")."
");
echo "Höchstwert:   ".number_format($maxWert,1)." °C  um "
. strftime("%d-%m-%Y  %H:%M:%S",$maxZeit) ."
";
echo "Minimalwert:  " . number_format($minWert, 1) . " °C  um "
. strftime("%d-%m-%Y  %H:%M:%S",$minZeit)."
";
echo "Mittelwert:   " . number_format($mittelWert, 1)." °C"."  von " . "Anzahl Werte: ".$anzahl  ;
?>

Name Var.: Temperatur 29-07-2010 14:16:20
Wert Jetzt: 16.1 °C um 29-07-2010 14:17:14
Höchstwert: 24.6 °C um 29-07-2010 14:16:20
Minimalwert: 15.0 °C um 28-07-2010 14:15:24
Mittelwert: 19.6 °C von Anzahl Werte: 137

Das wird so nicht gehen. dazu müsste das ganze Array umsortiert werden.

@ Rainer, deine Werte dürften nicht stimmen, weil Du die Zeit nur nach dem höchsten Wert sortierst. Die Zeit muss aber mit der höchsten Temperatur überein stimmen und nicht mit der letzten Aktualisierung des Timestamp.

Bitte schön. :slight_smile:

<?
// Maximal-Minimal-Mittelwert letzte 24 Stunden mit Datum und Uhrzeit der jeweiligen Temperatur.
$temp = AC_GetLoggedValues(28761 /*[Archive Handler]*/, 35017, time()-(1440*60), time(), 0);

foreach($temp as $key => $v)
{
    $value[] = $v['Value'];
    $time[] = $v['TimeStamp'];
    $anzahl = count($value);
    $werte = array_map(null, $value, $time);
    rsort($werte);
    foreach($werte as $keys)
    {
        $min = $keys;
    }
}

$maxWert = $werte[0][0];
$timeMaxwert = $werte[0][1];
$minWert = $min[0];
$timeMinwert = $min[1];

$mittelWert = array_sum($value)/$anzahl;
echo "Die Höchsttemperatur betrug am ".strftime("%d.%m.%Y um %H:%M:%S",intval($timeMaxwert))." ".$maxWert." °C"."
"."Die Tiefsttemperatur betrug am: ".strftime("%d.%m.%Y um %H:%M:%S",intval($timeMinwert))." ".$minWert." °C"."
"."Mittelwert: ".number_format($mittelWert, 1)." °C";

?>
Die Höchsttemperatur betrug am 28.07.2010 um 18:45:16 27.3 °C
Die Tiefsttemperatur betrug am: 28.07.2010 um 04:18:32 12.7 °C
Mittelwert: 18.8 °C

War mal ein Versuch

hier das ganze als funktion zum includen (es muss nur der archive handler angepasst werden):

	function GetMinMaxValues($variableID,$timespan)
	//$variableID:integer = ID der auszulesenden Varibale (muss im Archiv vorhanden sein)
	//$timespan:integer = 0{Werte des aktuellen Tages von 0:00:00 bis jetzt}, -1{Werte des Vortages von 0:00:00 bis 23:59:59}, n{Letzte n Stunden}
	{
		if(!IPS_VariableExists($variableID)) die("Variable does not exist in function GetMinMaxValues!");
		if(!is_integer($timespan)) die("Timespan is not integer in function GetMinMaxValues!");
		if($timespan < -1) die("Timespan must be equal or greater than -1 in function GetMinMaxValues!");

		switch($timespan)
		{
			case 0: //Aktueller Tag von 0:00:00 bis jetzt
			  	$timeStart = strtotime(date("d.m.Y")." 00:00:00");
				$timeEnd = time();
				break;
			case -1: //Vortag von 0:00:00 bis 23:59:59
			  	$timeStart = strtotime(date("d.m.Y",strtotime("-1 day"))." 00:00:00");
				$timeEnd = strtotime(date("d.m.Y",strtotime("-1 day"))." 23:59:59");
				break;
			default: //Letzte n Stunden
			   $timeStart = time() - ($timespan * 3600);
				$timeEnd = time();
				break;
		}
		
		$logArray = AC_GetLoggedValues(43381 /*[Archive Handler]*/, $variableID, $timeStart, $timeEnd, 0);

		foreach($logArray as $key => $v)
		{
			$value[] = $v['Value'];
		   $time[] = $v['TimeStamp'];
		   $cnt = count($value);
		   $values = array_map(null, $value, $time);
		   rsort($values);

		   foreach($values as $keys)
		   {
		      $min = $keys;
		   }
		}

		$valueMax = $values[0][0];
		$timestampMax = $values[0][1];
		$valueMin = $min[0];
		$timestampMin = $min[1];
		$valueAverage = array_sum($value)/$cnt;

		return array("min" => $valueMin, "max" => $valueMax, "avg" => $valueAverage, "timestampmin" => $timestampMin, "timestampmax" => $timestampMax);
	}

beispiel funktionsaufruf und formatierung der werte:

	$ret = GetMinMaxValues(32970 /*[Bereiche\Aussenbereich\Umgebung\Wetterstation\Temperatur]*/,-1);
	print("Min: ".$ret["min"]);
	print("
Max: ".$ret["max"]);
	print("
Avg: ".round($ret["avg"],1));
	print("
TimeMin: ".date("d.m.Y H:i",$ret["timestampmin"]));
	print("
TimeMax: ".date("d.m.Y H:i",$ret["timestampmax"]));

ergibt:

Min: 11.8
Max: 17.4
Avg: 13.8
TimeMin: 29.07.2010 02:43
TimeMax: 29.07.2010 17:10

oder z.b. für die letzte woche

	$ret = GetMinMaxValues(32970 /*[Bereiche\Aussenbereich\Umgebung\Wetterstation\Temperatur]*/,7*24);
	print("Min: ".$ret["min"]);
	print("
Max: ".$ret["max"]);
	print("
Avg: ".round($ret["avg"],1));
	print("
TimeMin: ".date("d.m.Y H:i",$ret["timestampmin"]));
	print("
TimeMax: ".date("d.m.Y H:i",$ret["timestampmax"]));

ergibt:

Min: 6.8
Max: 23
Avg: 15.9
TimeMin: 25.07.2010 05:11
TimeMax: 23.07.2010 16:40

Danke
das ist perfekt:D

Wer das ganze im Webfront nutzen will, 2 String Variablen und ein Dummymodul anlegen. Profil zuweisen.

<?
if($IPS_SENDER == "WebFront")
{
    SetValue($IPS_VARIABLE, $IPS_VALUE);
}

// Maximal-Minimal-Mittelwert letzte 24 Stunden mit Datum und Uhrzeit der jeweiligen Temperatur.
$temp = AC_GetLoggedValues(28761 /*[Archive Handler]*/, 35017, time()-($IPS_VALUE*24*60*60), time(), 0);

foreach($temp as $keys => $v)
{
    $value[] = $v['Value'];
    $time[] = $v['TimeStamp'];
    $anzahl = count($value);
    $werte = array_map(null, $value, $time);
    rsort($werte);
    foreach($werte as $key)
    {
        $min = $key;
    }
}

$maxWert = $werte[0][0];
$timeMaxwert = $werte[0][1];
$minWert = $min[0];
$timeMinwert = $min[1];

$mittelWert = array_sum($value)/$anzahl;

$text = "<b style=color:#FF0000;/>Die Tageshöchsttemperatur betrug am ".strftime('%d.%m.%Y um %H:%M:%S',intval($timeMaxwert))." ".$maxWert." °C"."</b><br><br>";
$text.= "<b style=color:#0000FF;/>Die Tagestiefsttemperatur betrug am ".strftime('%d.%m.%Y um %H:%M:%S',intval($timeMinwert))." ".$minWert." °C"."</b><br><br>";
$text.= "<b>Tagesmittelwert: ".number_format($mittelWert, 1)." °C"."</b>";
SetValue(56783 /*[Wetterstation\Außentemperatur\Max-Min-Mittel]*/, $text);

?>

Hallo Leute,

ich habe das Skript nun lange genutzt - m.E. ohne Probleme - heute sah ich eine Fehlermeldung und kann mir nicht erklären woher die kommt.
Mein (bzw. das hier gepostete Skript mit kleinen Anpassungen) Skript:

// Maximal-Minimal-Mittelwert letzte 24 Stunden
$temp = AC_GetLoggedValues(58740 /*[Archive Handler]*/ , 21257 , time()-(1440*60), time(), 0);

foreach ($temp as $key => $v)
{
    $value[] = $v['Value'];
    $anzahl = count($value);
    rsort($value);
}
$maxWert = array_shift($value);
$minWert = array_pop($value);
$mittelWert = array_sum($value)/$anzahl;

SetValueFloat(33750 /*[Raum-Temperaturen\Außentemperatur\Max-Wert]*/ , $maxWert);
SetValueFloat(11557 /*[Raum-Temperaturen\Außentemperatur\Mittelwert]*/ , $mittelWert);
SetValueFloat(17334 /*[Raum-Temperaturen\Außentemperatur\Min-Wert]*/ , $minWert);
//echo "Höchstwert: ".$maxWert." °C"."
"."Minimalwert: ".$minWert." °C "."
"."Mittelwert: ".number_format($mittelWert, 1)." °C";

?>

Die Fehlermeldung:
Fatal error: Maximum execution time of 30 seconds exceeded in [Raum-Temperaturen\Außentemperatur\Max-/Min-Werte berechnen] on line 4

Warum funktioniert das Skript nicht mehr?
Ist eine .dll erforderlich, die ich evtl. beim Aufräumen gelöäscht habe?

Joachim

Fatal error: Maximum execution time of 30 seconds exceeded in
da steht es doch, dein Script braucht länger wie 30sec! Warum auch immer.

Die Variable gibt es noch?