Regemmenge letzte 24h, unabhänging vom Tageswechsel

Die beiden aktuellen Scripts habe ich am Ende dieses ersten Beitrags eingefügt, damit das Suchen einfacher ist.

Hallo,
ich möchte für meine Beregnungssteuerung die Regenmenge der letzten 24h ermitteln.
Also was z.B. seit gestern 10:00h bis heute 10:00h an Regen gefallen ist.
Im Einsatz ist eine HomeMatic OC3, welche die

  • Regenmenge gestern im mm, (Beispiel: 2.95mm)
  • Regenmenge heute in mm und (12.39mm)
  • Regenmenge in mm ausgibt. (384.97mm)

Die Regenmengen gestern und heute werden in der CCU2 standardmäßig um 7:30h zurückgestellt.
Dies ist auch nicht das Problem. Das kann geändert werden.

Ich benötige aber noch die 24h-Regenmenge, und die bezieht sich immer auf die letzten 24h, unabhängig vom Tageswechsel.

Mein Ansatz: Regenzähler alle Stunde auslesen, in eine 24h-Tabelle schreiben. Die ältesten Werte fallen raus, die neuen kommen neu rein. Hierüber kann dann die Summe gebildet werden.
Wenn erforderlich, kann so auch der Regen der letzen Stunde, der letzten 3 Stunden, der letzten 6 Stunden und der letzten 12 Stunden ermittelt werden.
Der Regenzähler wird (bei 999?) zurückgesetzt, Wie kann dies beachtet werden?

Mein Problem ist: Wie mache ich dies am besten mit PHP in Symcon?

Symcon-Forum, Homematic-Forum, FHEM-Forum sowie Google habe ich befragt, aber nichts hierzu gefunden. Es wurden nur Lösungen für die Mengen 24h (letzter Tag) (bei mir: 2.95mm) angezeigt. Aber das habe ich schon…

Mit freundlichen Grüßen
Matthias

#####################################################################
Hier die Lösung:

Ich habe mit umfangreicher Unterstützung von Fonzo meine Aufgabenstellung gelöst.
Es werden die Regenmengen in mm ermittelt für:
die letzte Stunde
die letzten 3 Stunden
die letzten 6 Stunden
die letzten 12 Stunden
die letzten 24 Stunden
die letzten 48 Stunden
die letzten 72 Stunden
die letzten 96 Stunden

Zudem wird mit einem zweiten Script die Regenmenge
des aktuellen Tages (00:00 Uhr bis jetzt)
des Vortages (00:00 Uhr bis 24:00 Uhr)
ermittelt.
Mein Regenmesser ist ein Homematic OC3. Hier werden die Werte für heute und gestern von 7:30 bis 7:30 ermittelt.
Dies könne in der CCU2 per internem Programm geändert werden, aber ich möchte Standards nicht ändern.
Der DWD ermittelt die täglichen Mengen von 7:00 bis 7:00 Uhr.

Die Werte werden z.B. für Bewässerungsberechnungen benötigt.

Schritte:

  1. Die in den beiden Scripts aufgeführten Variablen anlegen
  2. Die ID des Sensors (muss kein OC3 sein) im Script hinterlegen
  3. Die Archiv-ID wird automatisch ermittelt (Fonzo)
    4.1 Script „Daten sammeln“ neu anlegen, das Script „Daten sammeln“ reinkopieren
    4.2 Ereignis: „Täglich alle 1 Stunden“ zuordnen
    5.1 Script „Daten sammeln (00-24)“ neu anlegen, das Script „Daten sammeln (00-24)“ reinkopieren
    5.2 Ereignis: „Täglich alle 1 Stunden“ zuordnen

Nun werden jede Stunde die ermittelten Werte in die jeweiligen Variablen geschrieben.

Script „Daten sammeln“


<?
/*
 ################################################################################
 # IP-Symcon Programm                                                           #
 #                                                                              #
 # Beschreibung : Niederschlagsmengen ermitteln (aus Archivdaten)               #
 # Create date  : 2016-09-25                                                    #
 # Last change  : 2016-10-02                                                    #
 # Version      : 0.05                                                          #
 # Datei        : 34747 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Daten sammeln]*/.ips.php                                                 #
 # Autor        : Matthias Herold                                               #
 # Copyright    :                                                               #
 ################################################################################
 */

// Hardware
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.10_Wetterstation\0.10_Wetterstation OC3_1_WEATHER\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler

// Variablen (Float mit einer Nachkommastelle)
$ID_Rain1  = 10048 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 1 Stunde]*/;
$ID_Rain3  = 14741 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 3 Stunden]*/;
$ID_Rain6  = 21054 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 6 Stunden]*/;
$ID_Rain12 = 57499 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 12 Stunden]*/;
$ID_Rain24 = 34752 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 24 Stunden]*/;
$ID_Rain48 = 33555 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 48 Stunden]*/;
$ID_Rain72 = 25730 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 72 Stunden]*/;
$ID_Rain96 = 51750 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag letzte 96 Stunden]*/;

//--config end--------------------

//  letzte Stunde
OC3Rainfall(1, $ID_Rain1, $ID_OC3Rainfall);

//  letzte 3 Stunden
OC3Rainfall(3, $ID_Rain3, $ID_OC3Rainfall);

//  letzte 6 Stunden
OC3Rainfall(6, $ID_Rain6, $ID_OC3Rainfall);

//  letzte 12 Stunden
OC3Rainfall(12, $ID_Rain12, $ID_OC3Rainfall);

//  letzte 24 Stunden
OC3Rainfall(24, $ID_Rain24, $ID_OC3Rainfall);

//  letzte 48 Stunden
OC3Rainfall(48, $ID_Rain48, $ID_OC3Rainfall);

//  letzte 72 Stunden
OC3Rainfall(72, $ID_Rain72, $ID_OC3Rainfall);

//  letzte 96 Stunden
OC3Rainfall(96, $ID_Rain96, $ID_OC3Rainfall);


function OC3Rainfall($lasthours, $varid, $ID_OC3Rainfall)
							// $lasthours			Anzahl der Stunden, die ausgewertet werden sollen
							// $varid 				ObjektID, in die der Wert abgelegt werden soll
							// $ID_OC3Rainfall	ObjektID der OC3 Regenmenge mit Überlaufzähler
	{
	$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
	$ZeitraumVON = time()- (3600 * $lasthours);
	$ZeitraumBIS = time();
	$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
	$isempty = empty($LogDatenAR);
	if ($isempty)
		{
   	SetValue($varid, 0);
    	}
	else
   	{
		$idrain = (count($LogDatenAR)-1);
      $currentrainfall = $LogDatenAR[0]["Value"];
      $lastrainfall = $LogDatenAR[$idrain]["Value"];
      $totalrainfall =    $currentrainfall - $lastrainfall;
      SetValue($varid, $totalrainfall);
		}
	}

?>

Script „Daten sammeln (00-24)“


<?
/*
 ################################################################################
 # IP-Symcon Programm                                                           #
 #                                                                              #
 # Beschreibung : Niederschlagsmengen ermitteln 0-24 Uhr (aus Archivdaten)      #
 # Create date  : 2016-09-25                                                    #
 # Last change  : 2016-10-02                                                    #
 # Version      : 0.05                                                          #
 # Datei        : 53515 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Daten sammeln (00-24)]*/.ips.php                                                 #
 # Autor        : Matthias Herold                                               #
 # Copyright    :                                                               #
 ################################################################################
 */

// Quelle:
// https://www.symcon.de/forum/threads/32432-Regemmenge-letzte-24h-unabhänging-vom-Tageswechsel?p=300435#post300435

// Hardwae
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.10_Wetterstation\0.10_Wetterstation OC3_1_WEATHER\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler

// Archive
$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen

// Variablen (Float mit einer Nachkommastelle)
$ID_Rain_h = 26945 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag heute (0-24 Uhr)]*/;
$ID_Rain_g = 55681 /*[99 meine Projekte\0 UMW\UMW Niederschlag\Niederschlag gestern (0-24 Uhr)]*/;

//*****************************************************************************
// heute von 00:00 bis jetzt
//*****************************************************************************
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, strtotime("today 00:00"), time(), 0);
$count = count($LogDatenAR);
if ($count == 0)
	{
   SetValue($ID_Rain_h, 0);
   }
else
   {
   $idrain_h = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_h]["Value"];
   $totalrainfall_h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_h, $totalrainfall_h);
   }

//*****************************************************************************
// gestern von 00:00 bis 24:00
//*****************************************************************************
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, strtotime("yesterday 00:00"), strtotime("today 00:00"), 0);
$count = count($LogDatenAR);
if ($count == 0)
   {
   SetValue($ID_Rain_g, 0);
   }
else
   {
   $idrain_g = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_g]["Value"];
   $totalrainfall_g =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_g, $totalrainfall_g);
   }
   
?>

Hallo Matthias,

ich würde ein array mit 24 Werten anlegen (je Stunde 1) und eine Hilfsvariable „alter Wert“.
Dann das neue Programm stündlich ausführen, Differenz aktuelle Regenmenge - alter Wert = Regenmenge vergangene Stunde.
Diesen Wert ins array, mit Index der Stunde reinschreiben. Die Summe aller Werte ist die Regenmenge der letzten 24 Stunden.
Zum Schluß noch die aktuelle Regenmenge im „alten Wert“ abspeichern.

Code-Schnipsel habe ich jetzt nicht eingefügt. weil ich leider auch jeden Befehl in der Syntax nachlesen muss.

Ih hoffe, der Ansatz hilft die weiter.

Gruß, Peter

Hallo Peter,
erstmal Danke für Deine Antwort.
so in etwa stelle ich es mir auch vor.

Wie können arrays hierzu erstellt werden?
evtl. kann jemand Codeschnipsel liefern?

Im Prinzip kann diese Aufgabenstellung (Artikel 1) für viele Aufgabenstellungen gelten:

  • Verbrauch von Strom, Wasser, Gas
  • Erzeugung von Strom (Voltaikanlagen)
  • Luftdruckänderungen

Mit freundlichen Grüßen
Matthias

Ich würde das so machen, ist aber nur ein Vorschlag, gibt vielleicht auch noch andere elegantere Lösungen:

  • Installiere das PHP Modul Symcon Misc. Erstelle Dir in IP-Symcon eine neue Instanz vom Typ Zählerüberlauf, den max Wert setzt Du auf 999, wobei ich nicht genau weis wann der Zähler in der CCU zurückgesetzt wird, und als Quelle gibst Du die Regenmenge der OC3 an.

  • Dann erstellst Du drei Variablen letzter erfasster OC3 Gesamtwert (Typ Float), OC3 Daten 24h (Typ String), OC3 Regenwert letzte 24 Stunden (Typ Float) und legst unter der Variable OC3 Daten 24h (Typ String) ein Skript an Daten 24h sammeln

  • Auf das Skript legst Du ein Ereignis das das Skript stündlich ausführt

Das Skript sieht so aus:


<?
 $currentrainfall = GetValue(11555 /*[Geräte\Bewässerung\Regen\OC3 Gesamtregenmenge\OC3 Wetterstation Gesamtregenmenge]*/);
 $lastrainfall = GetValue(27515 /*[Geräte\Bewässerung\Homematic Wetterstation\letzter erfasster OC3 Gesamtwert]*/);
 SetValue(27515 /*[Geräte\Bewässerung\Homematic Wetterstation\letzter erfasster OC3 Gesamtwert]*/, $currentrainfall);
 $rainfallhour = 	$currentrainfall -	$lastrainfall; 
 $getrainfalljson = GetValue(54969 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Daten 24h]*/);
 $getrainfall = json_decode($getrainfalljson, true); //Array mit den stündlich erfassten Daten der letzten 24 Stunden
 $rainperiod = array($rainfallhour);
 $setrainfall = array_merge($rainperiod, $getrainfall);
 unset($setrainfall[24]);
 $rainperiodjson  = json_encode($setrainfall);
 SetValue(54969 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Daten 24h]*/, $rainperiodjson);
 $totalrainfall24 =	array_sum($setrainfall);
 SetValue(25084 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Regenwert letzte 24 Stunden]*/, $totalrainfall24);
  
?>

Jetzt musst Du noch initial den richtigen Wert beim Überlaufzähler setzten und den gleichen Wert bei letzter erfasster OC3 Gesamtwert (Typ Float) eintragen.

Die Variable OC3 Daten 24h (Typ String) setzt Du initial mit


$init = array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 $rainperiodjson  = json_encode($init);
 Setvalue(54969 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Daten 24h]*/, $rainperiodjson);

Jetzt musst Du nur noch abwarten das das Skript stündlich ausgeführt wird. dann wird jedesmal der Array neu geschrieben und die Summe neu berechnet.

Hallo Fonzo,
das ist ja Klasse, was Du da geliefert hast.
Ich habe alles (fast) so hinbekommen, wie Du es beschrieben hast.
Nur dies hier verstehe ich noch nicht:

In Script kommt ja das lange Script rein. Wo und wie wird das obere Scriptchen eingetragen?
Da hänge ich nun…

Vielen Dank
Matthias

Das ist einfach ein extra Skript das Du nur brauchst um die Variable das erste mal zu befühlen. Also einfach ein Skript anlegen ausführen, danach kannst Du es dann wieder löschen.

Gesendet von iPhone mit Tapatalk

Danke.
Ich bin ja so stolz auf mich :slight_smile:
Es hat geklappt. Nun warten wir nur noch ab…
Matthias

Wenn Du bei der Variable mit dem Überlaufzähler (also der Gesamtregenmenge) doppelklickst und dort Logging Alle Variablenänderungen aufzeichnen, Aggregation Standard aktivierst, dann sollte mit dem Skript das selbe Ergebnis rauskommen:


//--config
	$OC3RainfallID = 25188 /*[Geräte\Bewässerung\Regen\Gesamtregenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler
	$ObjIDRain24 = 25084 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Regenwert letzte 24 Stunden]*/; // ObjektId der Variable Regenfall letzte 24 Stunden
	//--config end--------------------

	$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen 
	$ZeitraumVON = time()-86400;     
	$ZeitraumBIS = time(); 
	$LogDatenAR = AC_GetLoggedValues($ArchiveID, $OC3RainfallID, $ZeitraumVON, $ZeitraumBIS, 0); 
	$idrain24 = (count($LogDatenAR)-1);
	$currentrainfall = $LogDatenAR[0]["Value"];
 	$lastrainfall = $LogDatenAR[$idrain24]["Value"];
	$totalrainfall24 =	$currentrainfall - $lastrainfall;
	SetValue($ObjIDRain24, $totalrainfall24);

Das Vorgehen erspart Dir aber die zwei Hilfsvariablen im Vergleich zu oben. Das Skript muss dann halt regelmäßig über ein Ereignis ausgeführt werden damit die 24 Stunden Variable aktuell ist.

Hallo Fonzo,
Deine letzte Version gefällt mir persönlich am besten:

  • Logging habe ich meistens eingeschaltet
  • Anpassung an andere Zeiträume ist einfacher
  • kann für alle geloggten Werte übernommen werden

Ich habe auf Deiner Basis nun das Script soweit erstellt.
Es füllt Variablen mit den Zeiträumen

  • letzte Stunde
  • letzte 3 Stunden
  • letzte 6 Stunden
  • letzte 12 Stunden
  • letzte 24 Stunden
  • letzte 48 Stunden
  • letzte 72 Stunden.

Bei mir hat es in den letzten 24 Stunden nicht geregnet.
Ich vermute, dass von dater diese Meldung erscheint:

20.09.2016 13:00:00*| ScriptEngine*| Ergebnis für Ereignis 16475
<br />
<b>Notice</b>:  Undefined offset: 0 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>24</b><br />
<br />
<b>Notice</b>:  Undefined offset: -1 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>25</b><br />
<br />
<b>Notice</b>:  Undefined offset: 0 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>33</b><br />
<br />
<b>Notice</b>:  Undefined offset: -1 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>34</b><br />
<br />
<b>Notice</b>:  Undefined offset: 0 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>42</b><br />
<br />
<b>Notice</b>:  Undefined offset: -1 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>43</b><br />
<br />
<b>Notice</b>:  Undefined offset: 0 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>51</b><br />
<br />
<b>Notice</b>:  Undefined offset: -1 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>52</b><br />
<br />
<b>Notice</b>:  Undefined offset: 0 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>61</b><br />
<br />
<b>Notice</b>:  Undefined offset: -1 in <b>/var/lib/symcon/scripts/26993.ips.php</b> on line <b>62</b><br />

Das sind genau die Zeiten 1, 3, 6, 12 und 24.
Wenn es in diesen Zeiträumen nicht geregnet hat, sollten diese Meldungen wieder auftreten. Kann dies unterbunden werden?

<?
// Quelle:
// https://www.symcon.de/forum/threads/32432-Regemmenge-letzte-24h-unabhänging-vom-Tageswechsel?p=300435#post300435

//
//--config
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.20_Wetter\0.20_Wetterstation OC3\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler
$ID_Rain1 = 30722 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 1 Stunde]*/;
$ID_Rain3 = 34889 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 3 Stunden]*/;
$ID_Rain6 = 59999 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 6 Stunden]*/;
$ID_Rain12 = 41951 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 12 Stunden]*/;
$ID_Rain24 = 37123 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 24 Stunden]*/;
$ID_Rain48 = 45283 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 48 Stunden]*/;
$ID_Rain72 = 21321 /*[99 meine Projekte\UMW Homematic Wetterstation (2)\Regen letzte 72 Stunden]*/;

//--config end--------------------
$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen

//  letze Stunde
$ZeitraumVON = time()- (3600 * 1);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain1 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain1]["Value"];
$totalrainfall1 =    $currentrainfall - $lastrainfall;

//  letze 3 Stunden
$ZeitraumVON = time()- (3600 * 3);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain3 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain3]["Value"];
$totalrainfall3 =    $currentrainfall - $lastrainfall;

//  letze 6 Stunden
$ZeitraumVON = time()- (3600 * 6);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain6 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain6]["Value"];
$totalrainfall6 =    $currentrainfall - $lastrainfall;

//  letze 12 Stunden
$ZeitraumVON = time()- (3600 * 12);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain12 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain12]["Value"];
$totalrainfall12 =    $currentrainfall - $lastrainfall;

//  letze 24 Stunden
// $ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
$ZeitraumVON = time()- (3600 * 24);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain24 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain24]["Value"];
$totalrainfall24 =    $currentrainfall - $lastrainfall;

//  letze 48 Stunden
$ZeitraumVON = time()- (3600 * 48);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain48 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain48]["Value"];
$totalrainfall48 =    $currentrainfall - $lastrainfall;

//  letze 72 Stunden
$ZeitraumVON = time()- (3600 * 72);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain72 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain72]["Value"];
$totalrainfall72 =    $currentrainfall - $lastrainfall;


// -- Ergebnisse eintragen
SetValue($ID_Rain1, $totalrainfall1);
SetValue($ID_Rain3, $totalrainfall3);
SetValue($ID_Rain6, $totalrainfall6);
SetValue($ID_Rain12, $totalrainfall12);
SetValue($ID_Rain24, $totalrainfall24);
SetValue($ID_Rain48, $totalrainfall48);
SetValue($ID_Rain72, $totalrainfall72);
?>

Probier mal ob das geht:


	//--config
	$OC3RainfallID = 25188 /*[Geräte\Bewässerung\Regen\Gesamtregenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler
	$ObjIDRain24 = 25084 /*[Geräte\Bewässerung\Homematic Wetterstation\OC3 Regenwert letzte 24 Stunden]*/; // ObjektId der Variable Regenfall letzte 24 Stunden
	//--config end--------------------

	$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen 
	$ZeitraumVON = time()-86400;     
	$ZeitraumBIS = time(); 
	$LogDatenAR = AC_GetLoggedValues($ArchiveID, $OC3RainfallID, $ZeitraumVON, $ZeitraumBIS, 0); 
   $isempty = empty($LogDatenAR);
	if ($isempty)
	{
		SetValue($ObjIDRain24, 0);
	}
	else
	{
		$idrain24 = (count($LogDatenAR)-1);
		$currentrainfall = $LogDatenAR[0]["Value"];
	 	$lastrainfall = $LogDatenAR[$idrain24]["Value"];
		$totalrainfall24 =	$currentrainfall - $lastrainfall;
		SetValue($ObjIDRain24, $totalrainfall24);
	}

Nur mal dumm dazwischengefragt: Mit welcher Hardware messt ihr denn die Regenmenge? Würde mich sehr interessieren.

Gruß,
Ulrich

Hallo Ulrich,
ich setze den Homematic-Sensor OC3 ein.
Unter einem Trichter ist eine Wippe verbaut. Die Wippschläge werden intern gezählt und umgerechnet.
Geliefert werden von der OC3 u.a.:

  • Regenmenge als Zähler bis 999, umabhängig von einer Zeit. Bei 999 wird zurückgesetzt. in mm
  • Regen heute (ab 7:30) in mm
  • Regen gestern (von getsern 7:30 bis heute 7:30) in mm

Mit freundlichen Grüßen
Matthias

Hallo Fonzo,
hab ich gemacht.
Irgenwie passen die Werte nicht…

Tag ----- Wert1 — Zeit ------ Wert2 — Zeit
17.09. – 370,52 – 00:01 ---- 402,97 – 23:55
18.09. – 403,26 – 00:05 ---- 405,62 – 20:51
19:09. – 405,92 – 02:18 ---- 411,23 – 10:58
20.09. – 418,58 – 15:58 <-- 100ml per Hand reingekippt

Dies ist Dein neues Script mit Screenshot:

<?

//--config
    $OC3RainfallID = 26235 /*[0 Umwelt\0.20_Wetter\0.20_Wetterstation OC3\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler
    $ObjIDRain24 = 22075 /*[99 meine Projekte\UMW Homematic Wetterstation (3)\OC3 Regenwert letzte 24 Stunden]*/; // ObjektId der Variable Regenfall letzte 24 Stunden
    //--config end--------------------

    $ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
    $ZeitraumVON = time()-86400;
    $ZeitraumBIS = time();
    $LogDatenAR = AC_GetLoggedValues($ArchiveID, $OC3RainfallID, $ZeitraumVON, $ZeitraumBIS, 0);
   $isempty = empty($LogDatenAR);
    if ($isempty)
    {
        SetValue($ObjIDRain24, 0);
    }
    else
    {
        $idrain24 = (count($LogDatenAR)-1);
        $currentrainfall = $LogDatenAR[0]["Value"];
         $lastrainfall = $LogDatenAR[$idrain24]["Value"];
        $totalrainfall24 =    $currentrainfall - $lastrainfall;
        SetValue($ObjIDRain24, $totalrainfall24);
    }
?>

Mit „meinem“ Script vor 3 Artikeln soll es so aussehen:

Hier werden die Werte nicht ermittelt. Was mache ich falsch?
Ich habe Dein (älteres) Script nur angepasst: aus 24 mach 1, dann aus 24 mach 3 usw.


//  letze Stunde
$ZeitraumVON = time()- (3600 * 1);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain1 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain1]["Value"];
$totalrainfall1 =    $currentrainfall - $lastrainfall;

//  letze 3 Stunden
$ZeitraumVON = time()- (3600 * 3);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$idrain3 = (count($LogDatenAR)-1);
$currentrainfall = $LogDatenAR[0]["Value"];
$lastrainfall = $LogDatenAR[$idrain3]["Value"];
$totalrainfall3 =    $currentrainfall - $lastrainfall;

Aha! Vielen Dank, sehr interessant.

Muss ich mir noch mal näher anschauen. Melde mich wenn ich dazu gekommen bin.

Ich habe jetzt keine Regenmenge die ich so lange mitgeloggt habe um das bei mir zu testen und die letzten Tage bzw. Stunden hat es hier nicht geregnet also kommt logischerweise bei mir überall 0 raus.

Ich konnte Dir aber nicht ganz folgen was jetzt genau alles nicht geht.

Ich hab mal deine unterschiedlichen Werte genommen und lasse die mal bei mir mitlaufen. Um das stimmig ist kann ich erst sagen wenn es wieder regnet.


//--config
$ID_OC3Rainfall = 25188 /*[Geräte\Bewässerung\Regen\Gesamtregenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler
$ID_Rain1 = 36774 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 1 Stunde]*/;
$ID_Rain3 = 20100 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 3 Stunden]*/;
$ID_Rain6 = 27239 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 6 Stunden]*/;
$ID_Rain12 = 10233 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 12 Stunden]*/;
$ID_Rain24 = 56886 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 24 Stunden]*/;
$ID_Rain48 = 58938 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 48 Stunden]*/;
$ID_Rain72 = 52727 /*[Geräte\Bewässerung\Homematic Wetterstation\Debug\Regen letzte 72 Stunden]*/;

//--config end--------------------


//  letzte Stunde
OC3Rainfall(1, $ID_Rain1, $ID_OC3Rainfall);

//  letzte 3 Stunden
OC3Rainfall(3, $ID_Rain3, $ID_OC3Rainfall);

//  letzte 6 Stunden
OC3Rainfall(6, $ID_Rain6, $ID_OC3Rainfall);

//  letzte 12 Stunden
OC3Rainfall(12, $ID_Rain12, $ID_OC3Rainfall);

//  letzte 24 Stunden
OC3Rainfall(24, $ID_Rain24, $ID_OC3Rainfall);

//  letzte 48 Stunden
OC3Rainfall(48, $ID_Rain48, $ID_OC3Rainfall);

//  letzte 72 Stunden
OC3Rainfall(72, $ID_Rain72, $ID_OC3Rainfall);

function OC3Rainfall($lasthours, $varid, $ID_OC3Rainfall)//$lasthours (Anzahl der Stunden die ausgewertet werden sollen), $varid ObjektID in die der Wert abgelegt werden soll, $ID_OC3Rainfall ObjektID der OC3 Regenmenge mit Überlaufzähler
{
$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
$ZeitraumVON = time()- (3600 * $lasthours);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
//var_dump($LogDatenAR);
$isempty = empty($LogDatenAR);
if ($isempty)
    {
        SetValue($varid, 0);
    }
else
    {
        $idrain = (count($LogDatenAR)-1);
        $currentrainfall = $LogDatenAR[0]["Value"];
        $lastrainfall = $LogDatenAR[$idrain]["Value"];
        $totalrainfall =    $currentrainfall - $lastrainfall;
        SetValue($varid, $totalrainfall);
    }
}

Hallo Fonzo,
Dein jetziges Script funktioniert. Hier kann ich auch gleich lernen, wie Funktionen programmiert werden.
Alle Deine Veröffentlichungen hier sind schon ein Programmierkurs. Vielen Dank hierfür.
Bei mir regnet es auch nicht. Die vorherigen Screenshots sagen das ja auch aus.

Hier nun, was ich bisher gemacht habe:
Ich habe dann sogar ohne Fehlermeldungen auch Werte wie mit Deinem aktuellen Skript erhalten.
Jeder Abschnitt wurde aber x-mal gemacht und schön ist was anderes.

Im Script


$isempty = empty($LogDatenAR);

geändert in


$count = count($LogDatenAR);
$idrain_3h = (count($LogDatenAR)-1);

Das ging schonmal besser.
Es kamen aber immernoch diese Fehlermeldungen, wenn im Zeitraum kein oder nur ein Wert ist.


Notice:  Undefined offset: 0 in /var/lib/symcon/scripts/10799.ips.php on line 35
Notice:  Undefined offset: -1 in /var/lib/symcon/scripts/10799.ips.php on line 36

Hier das Script mit der Fehlermeldung:


//*****************************************************************************
//  letzte Stunde
//*****************************************************************************
$ZeitraumVON = time()-(3600 *1);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$count = count($LogDatenAR);
   $idrain_1h = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_1h]["Value"];
   $totalrainfall_1h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_1h, $totalrainfall_1h);

//*****************************************************************************
//  letzte 3 Stunden
//*****************************************************************************
$ZeitraumVON = time()-(3600 *3);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$count = count($LogDatenAR);
   $idrain_3h = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_3h]["Value"];
   $totalrainfall_3h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_3h, $totalrainfall_3h);

Mit diesen Anpassungen habe ich auf die Fehlermeldungen reagiert.


//*****************************************************************************
//  letzte Stunde
//*****************************************************************************
$ZeitraumVON = time()-(3600 *1);
$ZeitraumBIS = time();
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
$count = count($LogDatenAR);
if ($count == 0) // wenn es nicht geregnet hat
   {
   SetValue($ID_Rain_1h, 0);
   }
elseif ($count == 1) // wenn es nur einen Wert gibt ...
							// Differenz zwischen diesem Wwert und dem gemerkten Wert ermitteln
   {
   $idrain_1h = (count($LogDatenAR)-1);
	$currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = GetValue($ID_lastRain);
   $totalrainfall_1h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_1h, $totalrainfall_1h);
   }
else                 // wenn mind. zwei Werte gibt ...
							// Differenz aus dem ersten und dem letzten Wert ermitteln
   {
   $idrain_1h = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_1h]["Value"];
   $totalrainfall_1h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_1h, $totalrainfall_1h);
   }

Vielen Dank,
Du hast mir sehr geholfen.
Matthias

Hallo,
da es in den letzten Tagen ausreichend geregnet hat, konnte ich die Scripte testen. Die Werte sind ok.
Ich habe mit umfangreicher Unterstützung von Fonzo meine Aufgabenstellung gelöst.
Es werden die Regenmengen in mm ermittelt für:
die letzte Stunde
die letzten 3 Stunden
die letzten 6 Stunden
die letzten 12 Stunden
die letzten 24 Stunden
die letzten 48 Stunden
die letzten 72 Stunden
die letzten 96 Stunden

Zudem wird mit einem zweiten Script die Regenmenge
des aktuellen Tages (00:00 Uhr bis jetzt)
des Vortages (00:00 Uhr bis 24:00 Uhr)
ermittelt.
Mein Regenmesser ist ein Homematic OC3. Hier werden die Werte für heute und gestern von 7:30 bis 7:30 ermittelt.
Dies könne in der CCU2 per internem Programm geändert werden, aber ich möchte Standards nicht ändern.
Der DWD ermittelt die täglichen Mengen von 7:00 bis 7:00 Uhr.

Die Werte werden z.B. für Bewässerungsberechnungen benötigt.

Schritte:

  1. Die in den beiden Scripts aufgeführten Variablen anlegen
  2. Die ID des Sensors (muss kein OC3 sein) im Script hinterlegen
  3. Die Archiv-ID wird automatisch ermittelt (Fonzo)
    4.1 Script „Daten sammeln“ neu anlegen, das Script „Daten sammeln“ reinkopieren
    4.2 Ereignis: „Täglich alle 1 Stunden“ zuordnen
    5.1 Script „Daten sammeln (00-24)“ neu anlegen, das Script „Daten sammeln (00-24)“ reinkopieren
    5.2 Ereignis: „Täglich alle 1 Stunden“ zuordnen

Nun werden jede Stunde die ermittelten Werte in die jeweiligen Variablen geschrieben.

Script „Daten sammeln“


<?
/*
 ################################################################################
 # IP-Symcon Programm                                                           #
 #                                                                              #
 # Beschreibung : Niederschlagsmengen ermitteln (aus Archivdaten)               #
 # Create date  : 2016-09-25                                                    #
 # Last change  : 2016-10-02                                                    #
 # Version      : 0.05                                                          #
 # Datei        : 34747.ips.php                                                 #
 # Autor        : Matthias Herold                                               #
 # Copyright    :                                                               #
 ################################################################################
*/

// Hardware
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.20_Wetter\0.20_Wetterstation OC3\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler

// Variablen (Float mit einer Nachkommastelle)
$ID_Rain1  = 10048 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 1 Stunde]*/;
$ID_Rain3  = 14741 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 3 Stunden]*/;
$ID_Rain6  = 21054 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 6 Stunden]*/;
$ID_Rain12 = 57499 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 12 Stunden]*/;
$ID_Rain24 = 34752 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 24 Stunden]*/;
$ID_Rain48 = 33555 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 48 Stunden]*/;
$ID_Rain72 = 25730 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 72 Stunden]*/;
$ID_Rain96 = 51750 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag letzte 96 Stunden]*/;

//--config end--------------------

//  letzte Stunde
OC3Rainfall(1, $ID_Rain1, $ID_OC3Rainfall);

//  letzte 3 Stunden
OC3Rainfall(3, $ID_Rain3, $ID_OC3Rainfall);

//  letzte 6 Stunden
OC3Rainfall(6, $ID_Rain6, $ID_OC3Rainfall);

//  letzte 12 Stunden
OC3Rainfall(12, $ID_Rain12, $ID_OC3Rainfall);

//  letzte 24 Stunden
OC3Rainfall(24, $ID_Rain24, $ID_OC3Rainfall);

//  letzte 48 Stunden
OC3Rainfall(48, $ID_Rain48, $ID_OC3Rainfall);

//  letzte 72 Stunden
OC3Rainfall(72, $ID_Rain72, $ID_OC3Rainfall);

//  letzte 96 Stunden
OC3Rainfall(96, $ID_Rain96, $ID_OC3Rainfall);


function OC3Rainfall($lasthours, $varid, $ID_OC3Rainfall)
							// $lasthours			Anzahl der Stunden, die ausgewertet werden sollen
							// $varid 				ObjektID, in die der Wert abgelegt werden soll
							// $ID_OC3Rainfall	ObjektID der OC3 Regenmenge mit Überlaufzähler
	{
	$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen
	$ZeitraumVON = time()- (3600 * $lasthours);
	$ZeitraumBIS = time();
	$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, $ZeitraumVON, $ZeitraumBIS, 0);
	$isempty = empty($LogDatenAR);
	if ($isempty)
		{
   	SetValue($varid, 0);
    	}
	else
   	{
		$idrain = (count($LogDatenAR)-1);
      $currentrainfall = $LogDatenAR[0]["Value"];
      $lastrainfall = $LogDatenAR[$idrain]["Value"];
      $totalrainfall =    $currentrainfall - $lastrainfall;
      SetValue($varid, $totalrainfall);
		}
	}

?>

Script „Daten sammeln (00-24)“


<?
/*
 ################################################################################
 # IP-Symcon Programm                                                           #
 #                                                                              #
 # Beschreibung : Niederschlagsmengen ermitteln 0-24 Uhr (aus Archivdaten)      #
 # Create date  : 2016-09-25                                                    #
 # Last change  : 2016-10-02                                                    #
 # Version      : 0.05                                                          #
 # Datei        : 53515.ips.php                                                 #
 # Autor        : Matthias Herold                                               #
 # Copyright    :                                                               #
 ################################################################################
 */

// Quelle:
// https://www.symcon.de/forum/threads/32432-Regemmenge-letzte-24h-unabhänging-vom-Tageswechsel?p=300435#post300435

// Hardwae
$ID_OC3Rainfall = 26235 /*[0 Umwelt\0.20_Wetter\0.20_Wetterstation OC3\Regenmenge]*/; //ObjektID der OC3 Regenmenge mit Überlaufzähler

// Archive
$ArchiveID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0]; // Archiv Handler ID wird automatisch ausgelesen

// Variablen (Float mit einer Nachkommastelle)
$ID_Rain_h = 26945 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag heute (0-24 Uhr)]*/;
$ID_Rain_g = 55681 /*[99 meine Projekte\0 Klima+Wetter\UMW Niederschlag\Niederschlag gestern (0-24 Uhr)]*/;

//*****************************************************************************
// heute von 00:00 bis jetzt
//*****************************************************************************
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, strtotime("today 00:00"), time(), 0);
$count = count($LogDatenAR);
if ($count == 0)
	{
   SetValue($ID_Rain_h, 0);
   }
else
   {
   $idrain_h = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_h]["Value"];
   $totalrainfall_h =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_h, $totalrainfall_h);
   }

//*****************************************************************************
// gestern von 00:00 bis 24:00
//*****************************************************************************
$LogDatenAR = AC_GetLoggedValues($ArchiveID, $ID_OC3Rainfall, strtotime("yesterday 00:00"), strtotime("today 00:00"), 0);
$count = count($LogDatenAR);
if ($count == 0)
   {
   SetValue($ID_Rain_g, 0);
   }
else
   {
   $idrain_g = (count($LogDatenAR)-1);
   $currentrainfall = $LogDatenAR[0]["Value"];
   $lastrainfall = $LogDatenAR[$idrain_g]["Value"];
   $totalrainfall_g =    $currentrainfall - $lastrainfall;
   SetValue($ID_Rain_g, $totalrainfall_g);
   }
   
?>

Prima das das klappt. Nur so am Rande nutzt Du die Helligkeitswerte der OC3 für irgendwas? Habe mich noch nicht damit beschäftigt aber kann man damit auch Dämmerung messen?

Hallo Fonzo,

was meinst Du mit Dämmerung messen?

Ich berechne meine Dämmerungswerte an Hand von Datum und Geokoordinaten.

Was willst Du denn damit anfangen?