Wie funktionier AC_GetLoggedValues?

HI,

klar, gerne. ich hab aber alles drin gelassen :slight_smile:

Hier noch mal komplett.


<?php

//array	
    $archive_ID = array ();
    array_push($archive_ID, 40572);
	array_push($archive_ID, 20433);


foreach($archive_ID AS $summeID)
{
            echo "SummeID Variable: ".$summeID."
";
            
            filter_variable(10904, $summeID) /* ID der Archive-Instanz */;

            function filter_variable($ArchiveID, $VariableID) 
                {

                //Alle Datensätze der letzten Stunden abfragen
                //   $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
                    $start = mktime(0, 0, 0, 1  , 1, 2019);
                    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control

                // Anzahl der Werte
                    $entries = count($logData);

                // Macht erst ab 3 Werten Sinn
                    if ($entries < 2) return;

                // Anzahl der Fehler protokolieren
                    $changes = 0;
                    for ($i = 2; $i < $entries; $i++){

                // Differenz Wert2-Wert1
                        $diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];

                // Differenz Wert3-Wert2
                        $diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];

                // Wenn der mittlere Wert entweder der größte oder kleinste Wert ist stimmt was nicht
                        if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
                            (($diff1 > 0.1) && ($diff2 < -0.1))){ 

                // lösche mittleren Wert
                            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);

                // Fehler in Logfile eintragen
                            IPS_LogMessage("Medianfilter", $VariableID.' '.$changes.'. diff1:'.$diff1.' $diff2:'.$diff2); 

                // eine Änderung mehr
                            $changes++;
                        }
                    }

                // Wenn es Änderungen gab
                    if ($changes > 0){
                // Variable neu aggregieren
                        AC_ReAggregateVariable ($ArchiveID, $VariableID);
                // Anzahl der Fehler ins Logfile
                        IPS_LogMessage("Medianfilter", $VariableID.': Fehlerhafte Werte:'.$changes); 
                    }
                    else{
                        IPS_LogMessage("Medianfilter", $VariableID.': Alles OK'); 
                    }
                }
 }
?>
    

Ergebnis:
SummeID Variable: 40572

Fatal error: Uncaught Error: Call to undefined function filter_variable() in C:\ProgramData\Symcon\scripts\23031.ips.php:14
Stack trace:
#0 {main}
thrown in C:\ProgramData\Symcon\scripts\23031.ips.php on line 14

(ZEILE 14: filter_variable(10904, $summeID) /* ID der Archive-Instanz */:wink:

Hi,
die Funktion muss außerhalb deiner Schleife stehen. Versuch mal (ungetestet):


 <?php

//array    
    $archive_ID = array ();
    array_push($archive_ID, 40572);
    array_push($archive_ID, 20433);


foreach($archive_ID AS $summeID)
{
    echo "SummeID Variable: ".$summeID."
";
            
    filter_variable(10904, $summeID) /* ID der Archive-Instanz */;

}

function filter_variable($ArchiveID, $VariableID) {

//Alle Datensätze der letzten Stunden abfragen
//   $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
    $start = mktime(0, 0, 0, 1  , 1, 2019);
    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control

// Anzahl der Werte
    $entries = count($logData);

// Macht erst ab 3 Werten Sinn
    if ($entries < 2) return;

// Anzahl der Fehler protokolieren
    $changes = 0;
    for ($i = 2; $i < $entries; $i++){

// Differenz Wert2-Wert1
        $diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];

// Differenz Wert3-Wert2
        $diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];

// Wenn der mittlere Wert entweder der größte oder kleinste Wert ist stimmt was nicht
        if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
            (($diff1 > 0.1) && ($diff2 < -0.1))){ 

// lösche mittleren Wert
            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);

// Fehler in Logfile eintragen
            IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).'-'.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s",  $logData[$i - 1]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2); 

// eine Änderung mehr
            $changes++;
        }
    }

// Wenn es Änderungen gab
    if ($changes > 0){
// Variable neu aggregieren
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
// Anzahl der Fehler ins Logfile
        IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes); 
    }
    else{
        IPS_LogMessage("Zählerfilter", $VariableID.': Alles OK'); 
    }
}
?>

Ralf

Moin,

hat direkt so funktioniert.

(hatte mich kurz gewundert warum kein Eintrag mehr im Log war, aber da hattest Du Median gegen Zähler getauscht, log eintrag also auch korrekt).

Ich hatte mir sowas schon gedacht und ähnliches versucht und im Internet gesucht wie function arbeitet, aber nix gefunden was ich verstanden habe - nun habe ich deutlich dazu gelernt. danke.

vielen Dank!

Hi,
ja ich habe Median umbenannt weil es nicht wirklich ein Median-Filter ist. Der Name vorher war nur son Schnellschuss. Eine Filtermöglichkeit sollte statt in den Store direkt ins Archive-Modul. Aus Erfahrung kann ich sagen das es kaum Sensoren gibt die immer fehlerfreie Signale liefern wenn man den professionellen Bereich (Industrieanlagen) verlässt.

Ralf

Hallo,

einen Fehler habe ich noch gefunden, da könnte man das Skript einfach umbauen (hab ich versucht, bekomme ich nur nicht hin).

Mein xcomfort sendet bei Temperaturen ganz oft 0.0 und dann wieder korrekte Werte. Davon habe ich 6 Sensoren die alles den gleichen Fehler haben.

Nun wäre meine Idee einfach den Wert 0 komplett raus zu löschen, dann hätte ich mehr Genugkeit wenn bei 0.1, 0.0. -0.1 die 0.0 fehlt als wenn im Sommer mal 0.0 zwischen drin ist.

Jetzt wäre nur die Frage wie ich den Auswertungsteil umbaue, das er nicht mehr die diff berechnet, sondern

if 0 = löschen :wink:

danke.

Hi,
wieder ohne Test:


        if (($logData[$i - 1]['Value'] < 0.1) ||
            (($diff1 < -0.1) && ($diff2 > 0.1)) ||
            (($diff1 > 0.1) && ($diff2 < -0.1))){ 


Floatwerte soll man nie auf Gleichheit wie (a = 0.0) vergleichen das es durch das Zahlenformat (IEEE) selten wirklich glatte Werte gibt. Also statt 1 gibt es dann vielleicht 1.0000000001 oder 0.99999999999.

Die 0 müsste aber so auch schon abgefangen worden sein denn die erste Differenz hätte negativ und die zweite positiv sein müssen.

Ralf

HI,
klappt leider nicht. Bei einigen Tests hat er das Gesamte Log in gelöscht, bei anderen test nur ein paar Sachen.
die 0 werte waren immer weg :wink: aber halt etwas zu viel - bzw viel zu viel.

In meinem Fall könnte man aber schon nach der 0 gehen, wenn der Wert falsch ist, dann ist das eine Glatte 0.

Hier siehst du mal die Temperatur unter der Erde und die nullen die mir den Durchschnitt versauen.

Hi,
wie schon gesagt der Spezialfall 0 ist eigentlich überflüssig. Bei mir lief das Script mit der Änderung heute Nacht für 8-10 Variablen und es hat nichts überflüssiges gelöscht. Bei einer Variablen lief aber die Neuberechnung nicht durch denn im WebFront waren die Ausreißer noch drin im ÜArchive aber nicht.

Ralf

HI,

sehr komisch.
Ich fülle eine Varieble mit ganz viel Müll, und dies Test Variable (Float, ID, 30457) ist danach komplett leer, es ist nur noch der letzte Wert da.
Das treue ich mich jetzt nicht an einer echten Messung auszuführen - würde aber so ja auch kein Unterschied machen?


SetValue(30457,	1	);
SetValue(30457,	0	);
SetValue(30457,	2	);
SetValue(30457,	0	);
SetValue(30457,	0	);
SetValue(30457,	2	);
SetValue(30457,	0	);
SetValue(30457,	0	);
SetValue(30457,	4	);
SetValue(30457,	4	);
SetValue(30457,	0	);
SetValue(30457,	5	);
SetValue(30457,	0	);
SetValue(30457,	0	);
SetValue(30457,	6	);
SetValue(30457,	6	);
SetValue(30457,	6	);
SetValue(30457,	0	);

(das geht noch ca. 50 Zeilen weiter…


<?php
// https://www.symcon.de/forum/threads/43652-Wie-funktionier-AC_GetLoggedValues?p=427016#post427016

//array    
$archive_ID = array ();
//GAS
array_push($archive_ID, 30457);
//array_push($archive_ID, 18799);
//array_push($archive_ID, 26323);




foreach($archive_ID AS $summeID)
{
    echo "SummeID Variable: ".$summeID."
";
    filter_variable(10904, $summeID) /* ID der Archive-Instanz */;

}

function filter_variable($ArchiveID, $VariableID) {
//Counter
$CountID = 58375;
$Count = GetValue(58375);

//Alle Datensätze der letzten Stunden abfragen
//   $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
    $start = mktime(0, 0, 0, 1  , 1, 2015);
    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control

// Anzahl der Werte
    $entries = count($logData);

// Macht erst ab 3 Werten Sinn
    if ($entries < 2) return;

// Anzahl der Fehler protokolieren
    $changes = 0;
    for ($i = 2; $i < $entries; $i++){

// Differenz Wert2-Wert1
        $diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];

// Differenz Wert3-Wert2
        $diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];


    echo "diff1 Variable: ".$diff1."
";
	echo "diff2 Variable: ".$diff2."
";
    
// Wert 0 Löschen
          if (($logData[$i - 1]['Value'] < 0.1) ||
            (($diff1 < -0.1) && ($diff2 > 0.1)) ||
            (($diff1 > 0.1) && ($diff2 < -0.1))){



// lösche mittleren Wert
            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);
		
					// Fehler in Logfile eintragen
		            IPS_LogMessage("0 Filter", IPS_GetName(IPS_GetParent($VariableID)).'-'.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s",  $logData[$i - 1]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2); 
					// eine Änderung mehr
		            $changes++;
		        	}
		    }

// Wenn es Änderungen gab
    if ($changes > 0){
// Variable neu aggregieren
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
// Anzahl der Fehler ins Logfile
        IPS_LogMessage("0 Filter", $VariableID.': Fehlerhafte Werte:'.$changes); 
        SetValue ($CountID, $Count + 1);
    }
    else{
        IPS_LogMessage("0 Filter", $VariableID.': Alles OK'); 
    }
}
?>

Hi,
ich hatte es explizit für einzelne Ausreißer geschrieben. In deinem Fall gibt es öfter zwei Nullen hintereinander deswegen geht es nicht.

Für 2 Ausreißer hintereinander muss der Filter für das Script unten so aussehen:


function filter_variable($ArchiveID, $VariableID) {

//Alle Datensätze der letzten Stunden abfragen

    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
//    $start = mktime(0, 0, 0, 1  , 1, 2019);
//    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
    $entries = count($logData);
    if ($entries < 4) return;
    $changes = 0;
    for ($i = 4; $i < $entries; $i++){
        $diff1 = $logData[$i - 2]['Value'] - $logData[$i - 4]['Value'];
        $diff2 = $logData[$i]['Value'] - $logData[$i - 2]['Value'];

        if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
            (($diff1 > 0.1) && ($diff2 < -0.1))){ 
            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 2]['TimeStamp'] - 1, $logData[$i - 2]['TimeStamp'] + 1);
            IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s",  $logData[$i - 2]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2); 
            $changes++;
        }
    }
    if ($changes > 0){
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
        IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes); 
        IPS_SetScriptTimer($_IPS['SELF'], 300);

    }
    else{
        IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK'); 
        IPS_SetScriptTimer($_IPS['SELF'], 10);
    }
}

Wenn Du wirklich nur 0 weg haben willst sollte es so gehen:


function filter_variable($ArchiveID, $VariableID) {

//Alle Datensätze der letzten Stunden abfragen

    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
//    $start = mktime(0, 0, 0, 1  , 1, 2019);
//    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
    $entries = count($logData);
    $changes = 0;
    for ($i = 0; $i < $entries; $i++){

        if ($logData[$i]['Value'] < 0.1){ 
            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i]['TimeStamp'] - 1, $logData[$i]['TimeStamp'] + 1);
            IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s",  $logData[$i]['TimeStamp'])); 
            $changes++;
        }
    }
    if ($changes > 0){
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
        IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes); 
        IPS_SetScriptTimer($_IPS['SELF'], 300);

    }
    else{
        IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK'); 
        IPS_SetScriptTimer($_IPS['SELF'], 10);
    }
}

Ich habe auch noch ein Problem gefunden. Wenn 2 Variablen reaggrigiert werden müssen klappt es bei der 2ten Variablen meist nicht. Die Doku erwähnt ja auch das es lange dauern kann und wenn die 2te Variable reaggrigiert werden soll läuft es noch für die 1te Variable und das wird dann nicht mehr ausgeführt.

Dieses Script lässt IPS 5 Minuten Zeit wenn eine Variable reaggrigiert werden muss:


<?php
$variablen = array( 18122, 
                    30980,
                    25391,
                    53556,
                    15741,
                    48510, 
                    32294,
                    48724,
                    14835,
                    22373
                    );

$CountID = IPS_GetObjectIDByIdent("Count", $_IPS['SELF']);
if ($CountID == false){
    $CountID = IPS_CreateVariable(1);
    IPS_SetName($CountID, "Count"); // Variable benennen
    IPS_SetParent($CountID, $_IPS['SELF']); 
    IPS_SetIdent($CountID, "Count"); 
}

$IndexID = IPS_GetObjectIDByIdent("Index", $_IPS['SELF']);
if ($IndexID == false){
    $IndexID = IPS_CreateVariable(1);
    IPS_SetName($IndexID, "Index"); // Variable benennen
    IPS_SetParent($IndexID, $_IPS['SELF']); 
    IPS_SetIdent($IndexID, "Index"); 
}

if($_IPS['SENDER'] == "TimerEvent"){
    if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
        $Index = GetValue($IndexID);
        $Count = GetValue($CountID);
        filter_variable(32968, $variablen[$Index]);
        $Index++;
        SetValue($IndexID, $Index);
        if ($Index == $Count) IPS_SetScriptTimer($_IPS['SELF'], 0);
        return;
    }
}

if (IPS_GetScriptTimer($_IPS['SELF']) != 0) return;
SetValue($CountID, count($variablen));
SetValue($IndexID, 0);
IPS_SetScriptTimer($_IPS['SELF'], 10);

function filter_variable($ArchiveID, $VariableID) {

//Alle Datensätze der letzten Stunden abfragen

    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  strtotime("yesterday 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
//    $start = mktime(0, 0, 0, 1  , 1, 2019);
//    $logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $start, time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv Control
    $entries = count($logData);
    if ($entries < 2) return;
    $changes = 0;
    for ($i = 2; $i < $entries; $i++){
        $diff1 = $logData[$i - 1]['Value'] - $logData[$i - 2]['Value'];
        $diff2 = $logData[$i]['Value'] - $logData[$i - 1]['Value'];

        if ((($diff1 < -0.1) && ($diff2 > 0.1)) ||
            (($diff1 > 0.1) && ($diff2 < -0.1))){ 
            AC_DeleteVariableData ($ArchiveID, $VariableID, $logData[$i - 1]['TimeStamp'] - 1, $logData[$i - 1]['TimeStamp'] + 1);
            IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Zeit:'.date("Y-m-d H:i:s",  $logData[$i - 1]['TimeStamp']).' diff1:'.$diff1.' $diff2:'.$diff2); 
            $changes++;
        }
    }
    if ($changes > 0){
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
        IPS_LogMessage("Zählerfilter", $VariableID.': Fehlerhafte Werte:'.$changes); 
        IPS_SetScriptTimer($_IPS['SELF'], 300);

    }
    else{
        IPS_LogMessage("Zählerfilter", IPS_GetName(IPS_GetParent($VariableID)).' - '.IPS_GetName($VariableID).' Alles OK'); 
        IPS_SetScriptTimer($_IPS['SELF'], 10);
    }
}

?>

Ralf

Moin,
danke, jetzt läuft es.
Für n DAU in PHP ist das echt eine herausforderung.

Fehler 1: Mein Skript was werte füllt, schaffte das füllen mit in 0.2 Sekunden. Die Abfrage des TimeStamp haut dann natürlich alles weg.
Lösung: IPS_Sleep (1000); // pro Eintrag

Fehler 2: if ($logData[$i][‚Value‘] < 0.1){ …
Hier werden alle Temperaturen im minus Bereich gelöscht, unglücklich bei der Bodenfrostwarnung
Lösung: if ($logData[$i][‚Value‘] == 0){

Du hast mich mit deinen Skripten sehr glücklich gemacht, danke!!!

PS.
das Aggrieren übernehme ich auch, bei meiner Hardware (Xeon CPU, 64GB, SSD Raid 10) geht das aber eh ziemlich fix.
Und danke, jetzt kann ich noch besser arrys ansprechen - übernehme ich auch.

Hi,
bei 0 könntest Du Glück haben das es da keine Rundungsprobleme gibt.

Ralf

Hallo @bumaas ,

die Fehlermeldung „Output-Buffer exceeds Limit (1048576 bytes). Operation halted.“ bekomme ich auch, wenn meine Skritpe zum Archive korrigieren laufen.

Kann ich das Limit einfach hoch stellen?
Mein IP-Symcon Windows- Server hat aktuell 6 oder 8 GB RAM, könnte aber auch noch erweitern, das wäre kein Problem.

Was darf man da einstellen?

danke.

@bumaas,
das mit dem verschieben verstehe ich jetzt nicht. geht ja eher um den Buffer?

Es geht ja wohl um das Script hier und nicht um den Datenaustausch von Modulen.

Michael

HI, das Skript lief eigentlich seit Jahren ohne das ich es angefasst habe. jetzt nicht mehr. Vermutulich zuviel Daten in den Variablen?

Daher geht es eher mir um die Spezialschalter für den Buffer wegen der Meldung „Output-Buffer exceeds Limit (1048576 bytes). Operation halted." und ob ich den Buffer erhöhen kann damit skripte dieser Art wieder laufen.

Die Meldung kommt weil dein Skript mehr als 1MB Fehlermeldungen wirft.
Da gibt es nix zu erhöhen.

Der Spezialschalter war für den Datenaustausch von Modulen gedacht und wurde auch imho nie eingeführt.
Nicht umsonst ist der Beitrag unter PHP-Module (Entwicklung) .

Michael

@HarmonyFan , hat du eine Idee warum das Skript nicht mehr läuft?

Was sagt es bei Dir?

Moin,
Bei mir läuft es sei 3 Jahren ohne Probleme

15.09.2023 07:30:10 | 00000 | CUSTOM  | Zählerfilter        | Keller Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:16:22 diff1:-0.0029999999999291 $diff2:-1449.312
15.09.2023 07:30:10 | 00000 | CUSTOM  | Zählerfilter        | Keller Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:14:59 diff1:-1449.312 $diff2:1449.307
15.09.2023 07:30:10 | 00000 | CUSTOM  | Zählerfilter        | 10348: Fehlerhafte Werte:2
15.09.2023 07:31:10 | 00000 | CUSTOM  | Zählerfilter        | Küche Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:15:35 diff1:-0.0010000000000332 $diff2:-381.209
15.09.2023 07:31:10 | 00000 | CUSTOM  | Zählerfilter        | Küche Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:14:57 diff1:-381.209 $diff2:381.209
15.09.2023 07:31:10 | 00000 | CUSTOM  | Zählerfilter        | 46504: Fehlerhafte Werte:2
15.09.2023 07:31:20 | 00000 | CUSTOM  | Zählerfilter        | Klo Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:15:56 diff1:-0.00099999999997635 $diff2:-572.484
15.09.2023 07:31:20 | 00000 | CUSTOM  | Zählerfilter        | Klo Dect200 - Multimeter (kWh) Zeit:2023-09-14 10:14:58 diff1:-572.484 $diff2:572.484

wie es soll. Hast du es Mal direkt in der console gestartet? Bei mir läuft es jede Nacht automatisch und auch nur über die letzten Werte.

Ralf

Hi,
aus eigener Erfahrung habe ich noch gemerkt das man die Routine filter_variable NIE auf normale Werte wie Momentanleistung anwenden darf da es kein Zähler ist. Um das zu verhindern prüfe ich jetzt in der Routine ob die Variable vom Typ Zähler ist. Einfach den Anfang der Filterroutine durch Folgendes ersetzen:

function filter_variable($ArchiveID, $VariableID) {

    if (AC_GetAggregationType($ArchiveID, $VariableID) == 0) return;

//Alle Datensätze der letzten Stunden abfragen

Ralf