Regenmenge Montag bis Sonntag, Stunde und Woche

Hallo Zusammen,

mal wieder eine Frage bezüglich der Regenmessung.
Ich habe mir Skripte geschrieben, die die tägliche Regenmenge, die Menge Gestern und Vorgestern berechnen. Nun würde ich die Sache gerne noch Wochentagen zuordnen. Kann man über if/ else so etwas bewerkstelligen? Kann man den Wochentag abfragen (Montag oder Dienstag …) und dann über if/ else die Regenmenge des Tages in die entsprechende Variable schreiben?
Wie müsste das Skript hierfür aussehen? Ich habe leider meine Probleme mit if/ else. Einfache Abfragen bekomme ich noch hin. Gleiche Frage für die Berechnung Stunde und Woche.
Ich habe an Variablen. MengeAktuell (Änderung der Variable bei jeder Änderung der Gesamtmenge vom Sensor) ist die aktuelle Änderung.
Dann, wie oben genannt für den gesamten Tag und für die letzten 2 Tage.
Ich hoffe auf Hilfe!
In den Foren gibt es hierfür leider keine Vorlage. Nutzen will ich das für meine Beregnungsanlage.

Liebe Grüße
Lieschen

Hi Lieschen,

wie holst du denn die Werte aus der DB?
wenn man z.B. via AC_get… arbeitet, bekommt man ein Array von Informationen, u.A. den Wert und den Timestamp. Aus diesem Timestamp lässt sich dann auch der Wochentag ableiten.
Vielleicht zeigst du mal dein bisheriges Script, so kann man konkret helfen

hier mal ein Beispiel, wie man aus IPS die Regenmenge pro Tag (ab 1. des Monats bis gestern) aus der DB holt:


$archiveID 	= IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID
$varID 		= 17989  /*[Wetterdaten RS.loc\Thies Niederschlag-Sensor (6017 CH00)\Meßdaten\Menge\Menge ( mm)]*/ ; // Variablen-ID der Zähler-Variable
$ts 			= mktime(0, 0, 0, date("m", time()), 1, date("Y", time())); //Startzeitam 1. des Monats vor einem Jahr
$te 			= mktime(23, 59, 59, date("m", time()), date("d", time())-1, date("Y", time())); //Startzeit vor 1 Monat

// IPS-DB Daten: Abfrage Max/Avg/Min-Werte
$rawData = AC_GetAggregatedValues($archiveID, $varID, 1, $ts, $te, 200);
print_r($rawData);

als Ergbnis wird dieses Array ausgeworfen (gekürzt):


Array
(
    [0] => Array
        (
            [Avg] => 0.0069925002110263
            [Duration] => 86400
            [LastTime] => 1338155999
            [Max] => 0.00078808823479903
            [MaxTime] => 1338072976
            [Min] => 0
            [MinTime] => 1338082338
            [TimeStamp] => 1338069600
        )

    [1] => Array
        (
            [Avg] => 0.0011588236919804
            [Duration] => 86400
            [LastTime] => 1338069599
            [Max] => 0.00050044117693915
            [MaxTime] => 1338066421
            [Min] => 0
            [MinTime] => 1338014822
            [TimeStamp] => 1337983200
        )

    [2] => Array
        (
            [Avg] => 0
            [Duration] => 86400
            [LastTime] => 1337983199
            [Max] => 0
            [MaxTime] => 1337896800
            [Min] => 0
            [MinTime] => 1337896800
            [TimeStamp] => 1337896800
        )

    [3] => Array
        (
            [Avg] => 0
            [Duration] => 86400
            [LastTime] => 1337896799
            [Max] => 0
            [MaxTime] => 1337810400
            [Min] => 0
            [MinTime] => 1337810400
            [TimeStamp] => 1337810400
        )


Für jeden Kalendertag wird ein „Sub-Array“ ausgegeben, und zwar in chronologisch umgekehrter Reihenfolge. Array „0“ wäre gestern, „1“ vorgestern usw.
Weiterhin repräsentiert der Wert „Avg“ die Niederschlagsmenge des jeweiligen Tages (in meinem Fall mm/m²), der „Timestamp“ das Datum des Tages.

Das ist das Skript für die Regenmenge. Getriggert durch eine Variablenänderung des OC-3 Sensors, der leider nur ein Zähler (gesamt) ist.
Liter_heute ist meine „Arbeitsvariable“ (natürlich nicht in Litern, sondern mm).


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regenerfassung.ips.php
Trigger  : Regenzaehler_neu
Interval : OnUpdate
*/



define("KORREKTURFAKTOR", 0.273); // Faktor für die Umrechnung der Wippenschläge in Millimeter



// aktuelle Werte einlesen
$rza = GetValueInteger(47277 /*[Wetterformeln\Regen_2\Regenzaehler_alt]*/); // vorausgegangene Messung
$rzn = GetValueInteger(51986 /*[Wetterformeln\Regen_2\Regenzaehler_neu]*/); // aktuelle Messung

// zur Bug-Bereinigung die unteren Nibbles vertauschen
//$rzn = ( $rzn & 0xff00      )  // LSB ausblenden
//     + (($rzn & 0x00f0) >> 4)  // oberes  Nibble des LSB 4x rechts schieben (entspricht Division durch 16)
//     + (($rzn & 0x000f) << 4); // unteres Nibble des LSB 4x links schieben  (entspricht Multiplikation mit 16)
//SetValueInteger(47277 /*[Wetterformeln\Regen_2\Regenzaehler_alt]*/, $rzn);

// Zählerüberlauf abfangen
//if ($rza > $rzn) $rzn += 4096;

// Zuwachs (Wippenschläge) seit der letzten Messung
$Zuwachs = $rzn - $rza;

// Berechnung der aktuellen Regenmenge in Millimetern (entspricht Liter/qm) für den laufenden Tag
$lpd = GetValueFloat(16341 /*[Wetterformeln\Regen_2\Liter_heute]*/);
$lpd += $Zuwachs*KORREKTURFAKTOR;
SetValueFloat(16341 /*[Wetterformeln\Regen_2\Liter_heute]*/, $lpd);
?>

Die schreibe ich dann in „RegenHeute“, was meine Anzeige in Webfront ist.

<?

$Liter_Heute =  GetValueFloat(16341 /*[Wetterformeln\Regen_2\Liter_heute]*/);
SetValueFloat(22181 /*[Wetterformeln\Regen_2\RegenHeute]*/, $Liter_Heute);
?>

Auch getriggert bei Variablenänderung.

Das Folgende ist mein „0 Uhr“ getriggertes Skript zum Schreiben der Werte auf „Gestern“ und „Vorgestern“ und zum Nullen des „RegenHeute“.

<?

$RegenHeute = GetValueFloat (22181 /
[Wetterformeln\Regen_2\RegenHeute]*/);
$RegenGestern = GetValueFloat (46929 /*[Wetterformeln\Regen_2\RegenGestern]*/);
$RegenVorGestern = GetValueFloat (33077 /*[Wetterformeln\Regen_2\RegenVorgestern]*/);
$Regenzaehler_alt = GetValueInteger (47277 /*[Wetterformeln\Regen_2\Regenzaehler_alt]*/);
$Regenzaehler_neu = GetValueInteger (51986 /*[Wetterformeln\Regen_2\Regenzaehler_neu]*/);
$WT = GetValueFloat (19989 /*[Wetterformeln\Regen_2\WT]*/);

SetValueFloat (33077 /*[Wetterformeln\Regen_2\RegenVorgestern]*/, $RegenGestern);
SetValueFloat (46929 /*[Wetterformeln\Regen_2\RegenGestern]*/, $RegenHeute);
SetValueFloat (22181 /*[Wetterformeln\Regen_2\RegenHeute]*/, 0);
SetValueFloat (16341 /*[Wetterformeln\Regen_2\Liter_heute]*/, 0);

SetValueInteger (47277 /*[Wetterformeln\Regen_2\Regenzaehler_alt]*/, $Regenzaehler_neu);

//$WT = ($WT + 1);
//if ($WT > 7);
	$WT = 0;

// else {
//     $WT = $WT;
//    }

?>

Unten der Versuch des Aufzählen auf einen Wochentagszähler. Hier habe ich dann aber das Problem mit if/else bekommen. Keine Ahnung wie ich das hinbekomme.

Besten Dank schon einmal fürs Gedankenmachen.
Lieschen

HiHi…

das ist super nett von dir Rakete, jedoch muss ich dafür noch ein wenig „Lernen“ um das zu verstehen. Ich habe keine Ahnung wie ich das mache.
Hast du noch eine einfachere Lösung im Rahmen meiner rudimentären PHP- Kenntnisse?
Ich wundere mich, das es dafür noch kein IPSLibrary- Krimskrams gibt.

LG
Lieschen

kurze Frage: speicherst du die fortlaufende Regenmenge in irgendeiner Zählervariable (quasi wie bei einem Stromzähler)?
Nachtrag:

das bekommen wir hin, ich muss nur wissen, wo du stehst;)

Für jeden Tag ja. Wird dann aber Morgens auf die „Gestern“ und Vorgestern kopiert und dann Genullt. Sonst gibt es nur den Sensorzähler.

dann leg dir mal eine Zählervariable für den Niederschlag an und schreib ab sofort die gezählte Regenmenge da rein. Der Rest kommt gleich

Anbei meine Variablen

„Gesamtniederschlag“ als float ist angelegt. die kann ich aber bis dato erst Morgens bei meinem Rundumschlag aufaddieren.

Einen Schritt weiter als am „Anfang“ :slight_smile:

hier mal ein Ansatz (aus der Hüfte geschossen):
das Script liest Dir die Regenmengen pro Tag (aus der neu anzuglegenden Zähler-Variable) aus. Ich habe das zunächst auf die letzten 7 Tage beschränkt, ist aber beliebig erweiterbar.
Ich gehe mal zunächst davon aus, dass Du die Daten der jeweiligen Tage in die bestehenden Variablen haben möchtest.
Dann sähe das so aus:


<?

$archiveID 			= IPS_GetInstanceIDByName("Archive Handler", 0);   // Archive-Handler-ID angeben
$varID 				= 17989  /*[Wetterdaten RS.loc\Thies Niederschlag-Sensor (6017 CH00)\Meßdaten\Menge\Menge ( mm)]*/ ; // Variablen-ID der Ns-Zähler-Variable
$NsMenge_heute    = 12341;    // eigene Variable für Ns-Wert "heute" angeben
$NsMenge_gestern  = 12342;    //    :
$NsMenge_2days    = 12343;    //    :
$NsMenge_3days    = 12344;    //    :
$NsMenge_4days    = 12345;    //    :
$NsMenge_5days    = 12346;    //    :
$NsMenge_6days    = 12347;    //    :
$NsMenge_7days    = 12348;    // eigene Variable für Ns-Wert für "vor 7 tagen" angeben

$ts 					= mktime(0, 0, 0, date("m", time()), date("d", time())-8, date("Y", time())); //Startzeitvor 8 tagen 0:00 Uhr
$te 					= mktime(23, 59, 59, date("m", time()), date("d", time()), date("Y", time())); //Ende heute 23:59:59 Uhr

// IPS-DB Daten: Abfrage Ns-Max/Avg/Min-Werte
$rawData = AC_GetAggregatedValues($archiveID, $varID, 1, $ts, $te, 200);

//print_r($rawData);

// Variablen befüllen:
setValueFloat($NsMenge_heute, $rawData[0]['Avg']);
setValueFloat($NsMenge_gestern, $rawData[1]['Avg']);
setValueFloat($NsMenge_2days, $rawData[2]['Avg']);
setValueFloat($NsMenge_3days, $rawData[3]['Avg']);
setValueFloat($NsMenge_4days, $rawData[4]['Avg']);
setValueFloat($NsMenge_5days, $rawData[5]['Avg']);
setValueFloat($NsMenge_6days, $rawData[6]['Avg']);
setValueFloat($NsMenge_7days, $rawData[7]['Avg']);

?>

so, jetzt bist du dran mit Fragen :wink:

bin mir nicht sicher, was du genau meinst/tust, bitte mal kurz erläutern

Super Sache… doch Fragen:


$varID                 = 17989  /*[Wetterdaten RS.loc\Thies Niederschlag-Sensor (6017 CH00)\Meßdaten\Menge\Menge ( mm)]*/ ; // Variablen-ID der Ns-Zähler-Variable

Hier ist der Sensorzähler gemeint, oder? Dieser gibt aber nur „Absolutwerte“ ohne Korrekturfaktor für die mm/m2 aus. Oder ist das die Variable für den „Gesamtniederschlag“?

Und führe ich das Skript dann auch Morgens aus?

Diese „Zählervariable“ meine ich… ohhh meine Unwissenheit… wie lege ich sie genau an?

Ich kann im Moment die Gesamtniederschlagmenge nur für den Tag ausrechnen. Mein Regensensor zählt dauerhaft drauf. Ist aber wie gesagt ohne Korrekturfaktor.
Etwas was die reelle Regenmenge dauerhaft aufzeichnet habe ich nicht. Habe auch keine Ahnung wie ich das mache.

Ich denke, wir müssen noch Grundsätzliches klären. Ist aber nicht schlimm.
Mir scheint, dass du „genau anders herum“ mit Datenaufzeichnung umgehst: erst verdichten (auf einen Tag z.B.) und dann auf verschiedene Anzeige-Variablen verteilen. Das raubt Dir unglaubliche Flexibilität im Umgang mit den aufgezeichneten Daten.
Deutlich sinnvoller ist: alle ankommenden Meßwerte direkt in eine Zählervariable schreiben (selbst wenn sie im Sekundentakt kommen sollten). Erst in der Auswertung wird entschieden, welcher Zeitraum betrachte wird, wie fein die Daten aufgelöst werden etc. Nur dann bekommst Du Auswertungsmöglichkeiten im IPS wie diese hier.

In Deinem Falle würde ich die vom Sensor kommenden Daten in mm/m² umrechnen und dann in der Zählervariable aufaddieren lassen. Mehr braucht und soll man hier nicht tun. Die Auswertung ist davon völlig unabhängig und verändert auch die bisher aufgezeichneten Daten nicht mehr.

Mit $varID ist genau diese Zählervariable gemeint, ich denke die wirst du erst noch anlegen müssen

im Objektbaum eine Variable (vermutlich Float) anlegen, im vorletzten Fenster der Variablen-Eigenschaften „Aggregationstyp“ auf „Zähler“ stellen (und in der Doku lesen, was es damit auf sich hat ;))

OK, das habe ich verstanden und das klingt auch äußerst sinnvoll.
Könntest du mir noch den Tipp geben, wie ich diese anlege, umrechne und das aufaddieren erledige.

Mache ich das dann mit einem Skript, das auf Variablenänderung getriggert ist? Und wie muss das aussehen?

Sorry und VIELEN DANK für die Mühe… bin halt nur Arzt und kein PHP- versierter Informatiker/ Techniker… :wink:

ja, kein Problem, Moment