DB-handling IPS #1799 vs. #1829

Kann es sein, dass am Handling bzw. Speichern der Werte in der Datenbank etwas geändert wurde?
Bisher war mir so, dass die Werte auf Aktualisierung gespeichert wurden und nun scheint mir eine Speicherung auf Änderung stattzufinden und deshalb mein ehemals darauf geschriebenes Script nicht mehr das macht, was es sollte.
Ich finde das zwar lobenswert, dass die DB „kleingehalten“ wird, aber eine Ankündigung im Changelog hätte ich ganz nett gefunden… wenn es denn so ist, wie ich vermute;)

Grund:
Meine Wetterstation spuckt über die Schnittstelle die Gesamtniederschlagsmenge aus, welche ich in eine Variable schreibe und durch die Differenz der neuen Ausgabe zur Variable, die Niederschlagsmengen der letzten (1, 24 u. seit Mitternacht(heute)) Stunden errechnen lasse.
Das lief mit folgendem Script bisher tadellos:

<?
$archiveID = 30962;   	// Archive-Handler-ID
$objectID = 32855; 	// Variablen-ID
$updatetime = IPS_GetVariable($objectID);   	// Variable abfragen
$updatetime = $updatetime['VariableUpdated']; 	// Letztes Update $objectID
$nsm_g = GetValueFloat($objectID);    // Gesamte Niederschlagsmenge
$ende = time(); 		// JETZT
$stunden = 60*60;    // 1 Stunde a 60 Minuten mit 60 Sekunden

// Scriptstart
// Auslesezeiten der Datenbank
$start_1h = time()-(1*$stunden); 	// Datenbank auslesen ab 1 Stunde vor JETZT
$start_24h = time()-(24*$stunden); 	// Datenbank auslesen ab 24 Stunden vor JETZT
$mitternacht = mktime(0,0,0,date("n"),date("j"),date("Y")); 	// Timestamp - Heute 0:00 Uhr


// Abfrage 1 Stunde
if (($ende - $updatetime) < (1*$stunden))
{
$buffer_1h = AC_GetLoggedValues($archiveID, $objectID, $start_1h, $ende, 0);
$anzahl = count($buffer_1h);
$wert = $buffer_1h[$anzahl-1];
$ns_1h = $wert['Value'];
$nsm_1h = round($nsm_g - $ns_1h,1);
}
	else{$nsm_1h = 0;}
SetValueFloat(47235, $nsm_1h);  	// Variablen schreiben


// Abfrage 24 Stunden
if (($ende - $updatetime) < (24*$stunden))
{
$buffer_24h = AC_GetLoggedValues($archiveID, $objectID, $start_24h, $ende, 0);
$anzahl = count($buffer_24h);
$wert = $buffer_24h[$anzahl-1];
$ns_24h = $wert['Value'];
$nsm_24h = round($nsm_g - $ns_24h,1);
}
	else{$nsm_24h = 0;}
SetValueFloat(40632, $nsm_24h);   	// Variablen schreiben


// Abfrage Heute
if ($updatetime > $mitternacht)
{
$buffer_heute = AC_GetLoggedValues($archiveID, $objectID, $mitternacht, $ende, 0);
$anzahl = count($buffer_heute);
$wert = $buffer_heute[$anzahl-1];
$ns_heute = $wert['Value'];
$nsm_heute = round($nsm_g - $ns_heute,1);
}
	else{$nsm_heute = 0;}
SetValueFloat(46526, $nsm_heute);   	// Variablen schreiben

//echo "Niederschlagsmenge (1h):$nsm_1h L (24h):$nsm_24h L (Heute):$nsm_heute L"."
";

?>

Aber seit Build #1829 musste ich das Script ändern:

<?
$archiveID = 30962;   	// Archive-Handler-ID
$objectID = 32855; 	// Variablen-ID
$updatetime = IPS_GetVariable($objectID);   	// Variable abfragen
$updatetime = $updatetime['VariableUpdated']; 	// Letztes Update $objectID
$nsm_g = GetValueFloat($objectID);    // Gesamte Niederschlagsmenge
$ende = time(); 		// JETZT
$stunden = 60*60;    // 1 Stunde a 60 Minuten mit 60 Sekunden

// Scriptstart
// Auslesezeiten der Datenbank
$start_1h = time()-(1*$stunden); 	// Datenbank auslesen ab 1 Stunde vor JETZT
$start_24h = time()-(24*$stunden); 	// Datenbank auslesen ab 24 Stunden vor JETZT
$mitternacht = mktime(0,0,0,date("n"),date("j"),date("Y")); 	// Timestamp - Heute 0:00 Uhr


// Abfrage 1 Stunde
if (($ende - $updatetime) < (1*$stunden))
{
$buffer_1h = AC_GetLoggedValues($archiveID, $objectID, $start_1h, $ende, 0);
$anzahl = count($buffer_1h);
$wert = $buffer_1h[$anzahl-1];
$ns_1h = $wert['Value'];
$nsm_1h = round($nsm_g - $ns_1h,1);
	if (($nsm_g - $ns_1h) == $nsm_g)
	{$nsm_1h = 0;}
}
	//else{$nsm_1h = 0;}
SetValueFloat(47235, $nsm_1h);  	// Variablen schreiben


// Abfrage 24 Stunden
if (($ende - $updatetime) < (24*$stunden))
{
$buffer_24h = AC_GetLoggedValues($archiveID, $objectID, $start_24h, $ende, 0);
$anzahl = count($buffer_24h);
$wert = $buffer_24h[$anzahl-1];
$ns_24h = $wert['Value'];
$nsm_24h = round($nsm_g - $ns_24h,1);
	if (($nsm_g - $ns_24h) == $nsm_g)
	{$nsm_24h = 0;}
}
	//else{$nsm_24h = 0;}
SetValueFloat(40632, $nsm_24h);   	// Variablen schreiben


// Abfrage Heute
if ($updatetime > $mitternacht)
{
$buffer_heute = AC_GetLoggedValues($archiveID, $objectID, $mitternacht, $ende, 0);
$anzahl = count($buffer_heute);
$wert = $buffer_heute[$anzahl-1];
$ns_heute = $wert['Value'];
$nsm_heute = round($nsm_g - $ns_heute,1);
	if (($nsm_g - $ns_heute) == $nsm_g)
	{$nsm_heute = 0;}
}
	else{$nsm_heute = 0;}
SetValueFloat(46526, $nsm_heute);   	// Variablen schreiben

//echo "Niederschlagsmenge (1h):$nsm_1h L (24h):$nsm_24h L (Heute):$nsm_heute L"."
";

?>

…sonst würde mir die „Stunden-Niederschlagsmenge“ immer nur die aktuell aus der Wetterstation ausgelesene Gesamtniederschlagsmenge berechnen und wiedergeben.

Wenn ich nun keinen Knoten im Kopf habe und meine Vermutung stimmt, dann wünche ich mir auch solche, vielleicht nebensächlichen Änderungen der Release, im Changelog als bemerkenswert:wink:

Wir machen jetzt minütliche Commits, da schwächere Systeme sonst zu viel I/O auf der Festplatte haben. Tut uns leid, das wir vergessen haben, das zu notieren. Ich habe es soeben nachgereicht ;).

Danke Horst!

…dann habe ich wohl doch keinen Knoten im Kopf:D
Mir selbst war das selbst nur peinlich, weil ich Wettermelder beim MDR bin und seit 2 Tagen obskure Niederschlagsmeldungen per (IPS-)automatisierter email versendet habe und dies erst heute durch Lesen, der mir selbst (2x täglich) zugestellten äquivalenten mail herausgefunden habe:rolleyes:

Kleine Änderungen können manchmal große Wirkung haben, aber wenn man weiß, an welcher Schraube gedreht wurde, kann man oft schon vorher darüber nachdenken, was passieren wird.

ich habe das Script schon seit langem am laufen, habe aber festgestellt, dass ich eine Fehlermeldung bekomme:

Notice: Undefined offset: -1 in [Scripte\Regenwerte] on line 29


// Abfrage 1 Stunde

if (($ende - $updatetime) < (1*$stunden))
{
$buffer_1h = AC_GetLoggedValues($archiveID, $objectID, $start_1h, $ende, 0);
$anzahl = count($buffer_1h);
$wert = $buffer_1h[$anzahl-1];
$ns_1h = $wert['Value'];
$nsm_1h = round($nsm_g - $ns_1h,1);
    if (($nsm_g - $ns_1h) == $nsm_g)
    {$nsm_1h = 0;}
}
    //else{$nsm_1h = 0;}
SetValueFloat(29488, $nsm_1h);      // Variablen schreiben

es geht um diese Zeile

$wert = $buffer_1h[$anzahl-1];

habe aber keine Idee wo da der Haken ist.
Hat da jemand eine Idee

$wert = $buffer_1h[$anzahl-1]; 

$buffer_1h ist ein Array
$anzahl-1 gibt die Nummer des Elementes des Arrays an auf das zugegriffen werden soll.

Der Fehler besagt, dass das entsprechende Element nicht existiert. In diesem Fall ist der Zähler -1. Ein Array kann logischerweise keine negative Anzahl von Elementen haben. Das Array scheint daher leer zu sein ==> Anzahl 0 - 1 = -1.

muss noch was anderes sein, egal ob 0, oder +1 es kommt die gleiche Fehlermeldung. Bei nancilla läuft es ja so ?!

$anzahl = count($buffer_1h);

Nochmal - das Array ist leer wenn die Anzahl null ist.

$buffer_1h = AC_GetLoggedValues($archiveID, $objectID, $start_1h, $ende, 0);

Die Zeile die das Array befüllt ergibt daher wohl keine Daten. Die Frage ist daher ob der Archive-Handler bezüglich dieser Variable für den fraglichen Zeitraum Daten beinhaltet.

manchmal sieht man vor lauter Wald die Bäume nicht mehr.
Natürlich, in der letzten Stunde kein Regen ergibt auch kein Wert, also kann nichts drin stehen

Mittlerweile sieht das Script bei mir so aus:

// Abfrage 1 Stunde
if (($ende - $updatetime) < (1*$stunden))
{
$buffer_1h = AC_GetLoggedValues($archiveID, $objectID, $start_1h, $ende, 0);
$anzahl = count($buffer_1h);
$wert = $buffer_1h[$anzahl-1];
$ns_1h = $wert['Value'];
$nsm_1h = round($nsm_g - $ns_1h,2);
	// Sicherheitsabfrage, falls Gesamtniederschlag der Station auf Null
	if ((($nsm_g - $ns_1h) == $nsm_g)  or ($nsm_1h < -0.01))
	{$nsm_1h = 0;}

Damit wird der Fehler abgefangen.

Hallo Nancilla,

hast Du das Script nochmals angepasst. Ich bekomme trotz Sicherheitsabfrage wieder die Fehlermeldung

Die „Fehlermeldung“ ist nur eine Notiz und kannst du eigentlich missachten.

Wenn sie dich aber stört, dann pass einfach die Zeile

$wert = $buffer_1h[$anzahl-1];

an und unterdrücke die Meldung mit einem @ davor:

@$wert = $buffer_1h[$anzahl-1];