Tageshöchsttemperatur ermitteln?

Hallo Rainer,

ja die Variable gibt es noch - ist die hiesige Aussentemperatur!:wink:

Joachim

kurzer Nachtrag:
Ich habe nun noch mal versucht, ob es bei Änderung der Variablen eine Wirkung hat. Leider ohne nennenswerte Erfolg. Auch hier brach das Skript mit der gleichen Fehlermeldung (Zeitüberschreitung) ab.
Dann habe ich wieder die alter Variable eingesetzt und probiert. Nach mehreren Versuchen wird das Skript dann doch plötzlich durchlaufen (was ja zeigt, das es nicht fehlerhaft sein kann)! Der Durchlauf benötigt aber zwischen 5500 und 7800msec…:confused:
Komische Geschichte…

Joachim

wieviele Daten stehen denn in der Variable im Archive Handler. Je mehr es werden desto länger dauert die Auswertung.

Hallo Joachim,

ich denke da kommt die Datenbank die sich hinter dem IPS-Logging versteckt langsam aber sicher an seine Grenzen.

Wie groß ist denn deine DB mittlerweile? (…/IP-Symcon/DB/)

Je mehr Daten das die SQLite-DB enthält und je Größer dein Abfragezeitraum im Skript desto länger benötigt das Skript. Ist diese Laufzeit länger als die in der php.ini angegebene Zeit (max_execution_time) dann bricht dein Skript eben mit diesem Fehler ab.

Die gespeicherten Aussentemperaturwerte werden mit 203616 Datensätzen angezeigt. Die Datenbank hat eine Größe von 371.172kB - das finde ich nicht wirklich groß für eine Datenbank…:confused:

Joachim

Ich habe auch dieses Problem mit den 30 Sekunden. Meine Datenbank ist 758kb groß und hat für die Temperatur momentan 5618 Datensätze. Sicher ist mein Script zu Abfrage falsch… Vielleicht könnte mir da jemand weiterhelfen? So frage ich die Daten ab (dabei kommt die Timeout-Meldung / über 30 Sekunden):

<?

// Maximal-Minimal-Mittelwert des letzten Monats mit Datum und Uhrzeit der jeweiligen Temperatur.
$temp = AC_GetLoggedValues(27419 /*[Archive Handler]*/, 22112, time()-(43200*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;

    SetValue(15711 /*[Dummy\Wetterwerte\Temp-Monat-min]*/ , $minWert." °C am ".strftime("%d.%m.%y um %H:%M Uhr",intval($timeMinwert)));
    SetValue(48825 /*[Dummy\Wetterwerte\Temp-Monat-max]*/ , $maxWert." °C am ".strftime("%d.%m.%y um %H:%M Uhr",intval($timeMaxwert)));
    SetValue(52715 /*[Dummy\Wetterwerte\Temp-Monat-durchschnitt]*/ , number_format($mittelWert, 1)." °C");

?>

Tom

Moin,

ich habe nicht ganz verstanden, wozu man dieses Skript braucht ?!
Mit der Funktion AC_GetAggregatedValues bekommst Du alles geliefert, inkl. Timestamps. Und schneller ist es allemal.

Gruß
Walter

Hallo Walter, danke für den Hinweis. Leider hab ich keinen Plan was ich mit AC_GetAggregatedValues machen soll. Hast Du eventuell einen Tipp wie ich meine Variante oben damit umsetzen könnte?

Tom

Hallo,

ich berechne Durchschnittswerte für unterschiedliche Zeiträume wie folgt :

// akt. Woche
$count=0;
$Zeitraum=10;
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,2,time()-($Zeitraum*24*60*60),time(),0);
SETVALUE(19759 ,$temp[$count] ['Avg'] ); // Durchschnitt
SETVALUE(26411 ,$temp[$count] ['Max'] ); // Maximalwert
SETVALUE(18251 ,date("d.m.Y H:i:s",$temp[$count] ['MaxTime'])); // Max Datum
SETVALUE(55240 ,$temp[$count] ['Min'] ); // MinWert
SETVALUE(59210 ,date("d.m.Y H:i:s",$temp[$count] ['MinTime'])); // Min Datum

// akt. Monat
$Zeitraum=90;
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,3,time()-($Zeitraum*24*60*60),time(),0);
$count=0;
SETVALUE(58397 ,$temp[$count] ['Avg'] ); // Durchschnitt
SETVALUE(54968 ,$temp[$count] ['Max'] ); // Maximalwert
SETVALUE(18575 ,date("d.m.Y H:i:s",$temp[$count] ['MaxTime'])); // Max Datum
SETVALUE(57225 ,$temp[$count] ['Min'] ); // MinWert
SETVALUE(32064 ,date("d.m.Y H:i:s",$temp[$count] ['MinTime'])); // Min Datum

// akt. Jahr
$jahr=date("Y");
$timestamp = mktime(0,0,0,1,1,$jahr);
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,4,$timestamp, time(),0);
SETVALUE(57963 ,$temp[$count] ['Avg'] ); // Durchschnitt
SETVALUE(34848 ,$temp[$count] ['Max'] ); // Maximalwert
SETVALUE(56344 ,date("d.m.Y H:i:s",$temp[$count] ['MaxTime'])); // Max Datum
SETVALUE(49706 ,$temp[$count] ['Min'] ); // MinWert
SETVALUE(20669 ,date("d.m.Y H:i:s",$temp[$count] ['MinTime'])); // Min Datum

Laufzeit unter 1 Sekunde. Und meine Datenbank ist auch schon mächtig groß :smiley:

AC_GetAggregatedValues: liefert kumulierte und statistische Werte zu einer Log_Variable.

array AC_GetAggregatedValues (integer $InstanceID, integer $VariableID, integer $AggregationType, integer $StartTime, integer $EndTime, integer $Limit)

integer $InstanceID
integer $VariableID
integer $AggregationType: enum[0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]
integer $StartTime
integer $EndTime
integer $Limit

Gruß
Walter

Hallo Walter, da kann ich nur DANKE sagen. Werde ich gleich mal bei mir versuchen.

Tom

Hallo,
das ist genau das, was ich noch benötige für meine Außentemperatur :slight_smile:
Nur mit dem Einbinden komm ich nicht ganz mit!
2 String Variablen anlegen?
Könntest du mir das genauer erklären?

Danke schön

Schau mal hier :http://www.ip-symcon.de/service/dokumentation/konzepte/variablen/

Gruß
Walter

Hallo Walter,

ich hätte mal noch Fragen zum besser Verständnis Deiner Lösung.

// akt. Woche 
$count=0; 
$Zeitraum=10; 
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,2,time()-($Zeitraum*24*60*60),time(),0); 

Das sind in diesem Beispiel die letzten 10 Tage und nicht nur eine Woche, oder verstehe ich das falsch?

// akt. Monat 
$count=0; 
$Zeitraum=90; 
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,3,time()-($Zeitraum*24*60*60),time(),0); 

Und das nach meinem Verständnis die letzten 90 Tage?

Oder hat $AggregationType: enum[0=Hour, 1=Day, 2=Week, 3=Month, 4=Year] dabei eine Auswirkung? Die Wirkung dieser Variable verstehe ich nicht ganz. Was bewirken [0=Hour, 1=Day, 2=Week, 3=Month, 4=Year]?

Wenn ich es richtig verstanden habe so komme ich hiermit an die Werte des Vorjahres:

$vorjahr=date("Y")-1;
$vjbeginn = mktime(0,0,0,1,1,$vorjahr);
$vjende = mktime(0,0,0,12,31,$vorjahr);
$temp=AC_GetAggregatedValues(19907 /*[Archive Handler]*/,18673,4,$vjbeginn,$vjende);

Tom

Hallo,

Exakt. Der Zeitraum liefert die Grunddaten. Mit dem Aggregation Type steuerst Du, auf welchen Zeitraum verdichtet wird.
Du erhältst dann ein 2-dimensionales Array zurück, in dem ich nur den relevaten Index 0 auswerte ( jüngster Zeitraum, also je nach AggType Woche, Monat oder Jahr). Schau Dir einfach mit print_r($temp) mal das Rohergebnis an, dann wird das klar. Die Grundaten sind etwas großzügig gewählt, könntest Du auch ändern. Bringt aber im Zeitverhalten und im Ergebnis keinen Unterschied. Deine Jahresformel müsste so stimmen. Auch hier einfach mal das Array anzeigen lassen und checken.

Gruß
Walter

Danke für die hilfreichen Infos. Die Abfrage ist nun bei mir im Millisekundenbereich.

Hallo, ich habe dein Script an meine Variablen Angepasst:

34815 ist der Logger

13108 ist die Temperatur Variable die ich Logge

43714 ist eine String Variable zum Anzeigen

Ich bekomme immer die Fehlermeldung:
PHP-Error-Notice: Undefined variable: IPS_VALUE
Error in Script C:\IP-Symcon\scripts\49389.ips.php on Line 9
Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\49389.ips.php on line 9

Das Script sieht wie folgt aus:


<?
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(34815 /*[Archive Handler]*/, 13108, 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(43714 /*[Wetterstation\Außentemperatur\Max-Min-Mittel]*/, $text);

?>?>

[/QUOTE]

Danke für die Hilfe,lg Michl

Welche IPS-Version benutzt Du?!

Ver. 2.7

Ich habe aber nur eine String Variable angelegt liegt es an dem?
Was ich mit der zweiten String Variablen machen mujss, ist mir unklar???

Lg

Eine String für die Auswahl wieviele Tage Du auswerten willst
Die zweite Variable für das Ausgabeergebnis.

Siehe hier, mit Screenshot.

Und bau die IPS-Systemvariablen bitte nach den neue Konventionen um.

$IPS_Value lautet seit geraumer Zeit $_IPS[‚VALUE‘]

Die anderen entsprechend Doku

http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/