Hallo miteinander.
Vielleicht ist ja jemand mit guten Mathematikkenntnissen unter euch, der einen fixen Einfall für mein Berechnungsproblem hat.
Problem:
Ich habe eine komulative Zählerabweichung, welche durch Störeinwirkungen auf einen meiner Zählerwerte wirkte.
Jetzt möchte ich gerne die Zählerwerte im Archiv so manipulieren, dass diese wieder auf den richtigen Zählerwert kommen.
01.07.2021 → Wert 7369 / Digital und analog ok.
01.12.2021 → Wert digital: 8139 / Wert analog: 7765
Hat hierfür jemand eine gute Idee, wie ich die Werte so berechne, dass diese „gleichmäßig“ korrigiert werden?
Hallo Burkhard,
vielen Dank für deine Antwort. Bin mittlerweile mit mehr nachdenken auch auf eine Lösung gekommen.
Es wurde ca. das doppelte gezählt (der von dir errechnete Faktor von 1,94). Ich kalkuliere jetzt die Werte neu ab dem Zeitpunkt als der Zählerwert auseinander gelaufen ist und nehme immer ca. 50% der sich bildenden differenz.
Schaut dann so aus:
$debug = TRUE;
$SourceID = 12481 ; // Variable mit Zählerwert
$TargetID = 27266; // Zielvariable
$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet
$StartDate="01.07.2021";
$Startvalue = 7368.36;
if ($debug){$beginn = microtime(true); };
$d = 0;
$timestamp = 0;
$start = new DateTimeImmutable($StartDate);
$starttime = strtotime($start->format('Y-m-d H:i:s'));
AC_DeleteVariableData($ArchiveID, $TargetID, 0, 0);
AC_SetLoggingStatus($ArchiveID , $TargetID, true);
while ($starttime < strtotime('today')){
$datetime = $start->modify('+'.$d.' day');
$starttime = strtotime($datetime->format('Y-m-d H:i:s'));
$datetime = $datetime->modify('+1 day');
$endtime = strtotime($datetime->format('Y-m-d H:i:s'));
if ($debug){echo "Starttime: ".date('d.m.Y H:i:s', $starttime).PHP_EOL;};
$logData = AC_GetLoggedValues($ArchiveID, $SourceID, $starttime, $endtime, 0); //Datensätze abfragen
$entries = count($logData);// Anzahl der Werte
if ($debug){echo "Einträge: ".$entries.PHP_EOL;};
if ($entries >0) {
for ($i = ($entries-1); $i > 0; $i--){
$diff = $logData[$i]['Value']-$Startvalue;
if ($debug){echo "Diff: ".$diff.PHP_EOL;};
$diff_50 = $diff *0.515; //50%
$value = $Startvalue + $diff_50;
if ($debug){echo "Diff: ".$value.PHP_EOL;};
$timestamp = $logData[$i]['TimeStamp'];
AC_AddLoggedValues ($ArchiveID, $TargetID, [['TimeStamp' => $timestamp,'Value' => $value]]);
}
}
$d++;
}
AC_SetAggregationType ($ArchiveID, $TargetID, 1);
AC_ReAggregateVariable ($ArchiveID, $TargetID);
if ($debug){
$dauer = round(microtime(true) - $beginn,2);
echo "Verarbeitung des Skripts: $dauer Sek.";
}