Wetterstation: Regen 24h, Regen 3h, Regen 1h aus Logging

Ich nutze eine KS300 Wetterstation, die mir alle paar Minuten den Niederschlag in Form eines Zählerwerts der Wippe übermittelt, aus dem ich den Niederschlag in mm berechne. Den Niederschlagswert in mm setze ich täglich Mitternacht zurück.
Den Wert Regenmenge in mm lasse ich vom Logging aufzeichen.
Fürs Wetternetz-Sachsen.de möchte ich nun gerne die Werte für Niederschlag in 24h, 3h und in der letzten Stunde übermitteln.
Wie kann ich die Werte aus dem Logging abrufen bzw. berechnen?
Danke für eure Hinweise.

Ich rufe wie folgt die Regenmenge der letzten X Stunden mit der Funktion AC_GetLoggedValues ab:


//Ermittlung der Regenmenge der letzen X Stunden
$vorstunden = 24;
$datenid = 47115;  //die ID der Datenvariable

$werte = AC_GetLoggedValues(23229, $datenid, time()-(60*60*$vorstunden), time(), 0); //23229 ist die ID vom Archiv Control
$letzterwert = end($werte);

//Prüfung falls keine Werte kommen dann hat es nicht geregnet
if($letzterwert == false)
    {
    echo 0; //es hat nicht geregnet
    }
else
    {
    //Jetzt noch vom aktuellen Wert abziehen
    $ergebnis = GetValueFloat($datenid)-$letzterwert['Value'];
    echo $ergebnis;
    }

bin mal gespannt obs da andere einfachere Vorschläge gibt, mir kommt das etwas umständlich vor, habe es aber mit meinen Programmierkenntnissen nicht besser hingebracht. Tut aber immerhin :wink:

Ich setze die Variable mit der Regenmenge ja täglich gegen 00:00 Uhr zurück. Da ich die tägliche Regenmenge loggen möchte.
Wenn ich jetzt die Aggregate Values über diesen Zeitpunkt hinweg auslese und letzter Wert minus aktueller Wert rechne, dann stimmt doch das Ergebnis nicht?
z.B. zwischen 23.00 und 00:00 Uhr 5mm Regen. Jetzt wird 00:00 genullt, weil ein neuer Tag beginnt.
Zwischen 00:00 und 2:00 Uhr regnet es nochmal 3mm.
Jetzt ist es 2 Uhr und ich lasse mir die letzten 3h ausgeben…

Wie kann man denn damit umgehen? Aktuell fällt mir keine richtige Lösung ein.

Als Beispiel meine aktuelle Lösung:

<?

$debug = true;
// $debug = false;
	
$objectID = 25878 /*[MQTT\data\wemos_hochbeet\C1]*/; // Counter RG-11
$archiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];   // Archive-Handler-ID
$verbrauch_akt=getvalue($objectID);
$startdate = mktime(5, 30, 0, date("m"), date("d")-1, date("Y")); //Startzeit 
$enddate = mktime(5, 30, 0, date("m"), date("d"), date("Y")); //Endzeit

$data = AC_GetAggregatedValues($archiveID, $objectID, 0, $startdate, $enddate, 24);
$sum = 0;
for ($i = (sizeof($data)-1); $i >= 0; $i--) {
	$sum = $sum + $data[$i]['Avg'];
}



switch( $_IPS['SENDER'] ){
	case "Execute":
		echo "Werte setzen NUR über Variablen-Trigger oder Timer.

";
		echo "Start: ".date("H:i:s d.m.Y",$startdate)."
";
		echo "Ende : ".date("H:i:s d.m.Y",$enddate)."
";
		echo "Aktuelle Summe in [mm]: " . $sum * 0.001 . "

";
		print_r($data);
	break;
	case "Variable":
		SetValue(44693 /*[Steuerung\Gartenbewässerung\Bewässerung Steuerung\Regenmenge 05:30-05:30]*/, $sum * 0.001);
	break;
	case "TimerEvent":
		switch ($_IPS['EVENT']) {
			case "40576 /*[Steuerung\Gartenbewässerung\Regenmenge 05:30-05:30\Alle 1 Tag(e) um 05:30:00]*/":	// Timer Event, Regenmenge auf 0
				SetValue(44693 /*[Steuerung\Gartenbewässerung\Bewässerung Steuerung\Regenmenge 05:30-05:30]*/, 0);
			break;
		}
	break;
}

?>

Ich beregne um 5:30, berechne die Verdunstung bei Rasen um 14:00 am Vortag und ziehe die Regenmenge bis 5:30 wieder ab.
Dieses Script liefert „nur“ die Regenmenge von 5:30-5:30 bzw. der aktuellen Zeit, mehr ist ja noch nicht geloggt.

Du kannst natürlich auch andere Zeiten nutzen.

Oh, klar jetzt hab ich es besser verstanden. Dann geht es mit deiner Variable so nicht.

Ich habe das so gelöst, das in einer eigenen Variable (Zähler) zuerst mal jedes mal wenn es regnet die Kippvorgänge gezählt werden. Damit hast du in einer Variable zuerstmal die Gesamtregenmenge. Diese Variable kann man dann auch schön für die Charts verwenden und auch für deine Auswertung.

Damit ich dann Tägliche Werte (und Wöchentlich und monatliche…) habe lasse ich wie du zusätzlich das in eigene Variablen schreiben, die aber nur zur aktuellen Info sind und nicht geloggt werden. Die Tägliche Variable wird ebenfalls bei jedem Kippvorgang aktualisiert und die anderen werden wie bei dir nachts um 00:00 Uhr berechnet und fortgeschrieben.

Das sieht dann wie im Screenshot aus…

kannst ja mal überlegen ob das was für dich ist.

Grüße Helmut

Regenmessert.JPG

Vielen Dank, die Lösung gefällt mir gut, habe jetzt auch auf die Zählervariante umgestellt.

Hallo Zusammen,

so wie es im obigen Screenshot dargestellt ist würde mir das auch gefallen. Ich habe die Regenmenge pro Tag in Liter bzw. in mm schon

in einer Variable. Kann jemand ein Script einstellen das ich nur noch anpassen muss damit ich das so darstellen kann?

Viele Grüße
Thomas

Du suchst
AC_GetAggregatedValues — IP-Symcon :: Automatisierungssoftware

Ich guck :eek:

Diese Antwort hätte ich eigentlich von Nall-chan erwartet. :smiley:

In der Doku ist es oftmals nicht so gut beschrieben deshalb frage ich immer hier.

Ich habe Deinen Rat befolgt und machte mich ans Werk. Zum testen nahm ich den Stromzähler denn bei Regen habe ich noch keine geloggten Daten.

Das ist das Resultat für den Wochenzähler.

Hier ist das Script

<?php

$werte = AC_GetAggregatedValues(45270, 10051, 2 /* Wöchentlich */, strtotime('last monday', strtotime('tomorrow')), strtotime("now"), 0);

foreach($werte as $wert) {
	echo $wert['Avg'] . PHP_EOL;
}

Bekommt man den Wert auch ohne foreach heraus und wie bekomm ich den in die Variable?

Vermutlich mit GetValue holen und mit SetValue schreiben aber wie?

Ein kleiner denkanstoß würde bestimmt helfen.

Sorry …

Das stimmt für 90% der Doku absolut nicht.

Geht auch.

Ja, das würde auch gehen. Du bekommst ihn mit SetValue in eine Variable.

Du kannst ihn nicht mit GetValue holen, da dieser Befehl dafür ist, den Wert einer Variablen zu holen. Du hast den Wert den Du suchst, ja auch schon im Skript vorliegen bzw. hast ihn aus dem Archiv geholt. Daher muss nichts mehr geholt werden. Mit SetValue schreiben ist richtig.

Du hast allerdings die Aggregationsstufe „wöchentlich“ verwendet. Ich glaube, Du musst das noch ein bißchen besser an Deine Bedürfnisse anpassen.

Ich möchte Tag, Woche, Monat, Jahr. Mit dem wöchentlichen Wert habe ich ohne bestimmten Grund angefangen einfach um es zu versuchen.

Ist die wöchentliche Aggregationsstufe bei dem wöchentlichen Wert falsch? Es stimmt mit dem Stromzähler aber überein.:confused:

Du hast mir jetzt 7 Zeilen geschrieben, eine Zeile Script hätte vollauf gereicht. :wink:

Spaß beiseite, ich bin froh wenn mir jemand hilft. Das mit dem SetValue bekomme ich gerade nicht hin.

Ich habe es so versucht

SetValueFloat(57534, $wert);
       aber das Mistvieh will nicht so wie ich will.

Also Standart zier dich nicht und gib mir die richtige Codezeile und ich schenk dir einen Smiley. :smiley:

Gruß
Thomas

Vielleicht habe ich mich ein bißchen komisch ausgedrückt. Ich ging irgendwie davon aus, dass Du mit „Tag“ anfängst, mit „Woche“ weitermachst, und so weiter. Aber egal, fangen wir mit „Woche“ an.

Und was hast Du dann davon? Mir ist es immer wichtig, dass die Leute hier nicht nur Copy & Paste machen, sondern idealerweise was lernen und auch noch verstehen, was sie tun. Außerdem habe ich ja nix zu verschenken :wink:

$wert ist ein Array. Dies wirst Du der FloatVariable nicht zuweisen können. Du hast Dir den AVG-Wert ja schon mittels „echo“ ausgegeben. Diesen musst Du mit SetValue Deiner Float Variablen zuweisen.

Fertige Lösungen gibt es von mir hier nur sehr selten präsentiert. Dafür sind andere zuständig.

Bin mir aber sicher, dass Du es schaffen wirst, das $wert[‚Avg‘] Deiner Variablen zuzuweisen, ohne dass ich es Dir hier fertig serviere.

Klar doch, bin doch ein Profi haha…

Super, es hat geklappt.

Eines verstehe ich jetzt nicht ganz (trotz Doku) ich habe 2 verschiedene Zeilen versucht und beide haben funktioniert.

  1. SetValueFloat(57534, $wert[‚Avg‘]);

  2. SetValue(57534, $wert[‚Avg‘]);

Für was benötige ich „SetValueFloat“ wenn es mit „SetValue“ auch geht?

Danke vielmals für Deine Hilfe und hier sind die versprochenen Smileys

Danke nochmal!