2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-08 07:24:21 +00:00

93_DbRep: contrib 8.50.0

git-svn-id: https://svn.fhem.de/fhem/trunk@26314 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2022-08-12 19:02:13 +00:00
parent 90b046a16d
commit af296e23e5

View File

@ -9239,7 +9239,7 @@ return "$name|$err|$ret|$brt";
} }
#################################################################################################### ####################################################################################################
# alle im @dayRows Array enthaltene DB Einträge löschen # reduceLog alle im @dayRows Array enthaltene DB Einträge löschen
#################################################################################################### ####################################################################################################
sub _DbRep_rl_deleteDayRows { sub _DbRep_rl_deleteDayRows {
my $paref = shift; my $paref = shift;
@ -9295,7 +9295,7 @@ sub _DbRep_rl_deleteDayRows {
processingDay => $processingDay processingDay => $processingDay
}; };
_DbRep_logProgress ($params); _DbRep_rl_logProgress ($params);
#} #}
} }
1; 1;
@ -9317,7 +9317,8 @@ return $err;
} }
#################################################################################################### ####################################################################################################
# Mode (pro Stunde) in DB updaten und @updateDay füllen bei # reduceLog
# Stundenupdates vornehmen und @updateDay füllen bei
# $mode = *=day # $mode = *=day
#################################################################################################### ####################################################################################################
sub _DbRep_rl_updateHour { sub _DbRep_rl_updateHour {
@ -9348,7 +9349,7 @@ sub _DbRep_rl_updateHour {
for my $hourHash (@$updateHourref) { # Only count for logging... for my $hourHash (@$updateHourref) { # Only count for logging...
for my $hourKey (keys %$hourHash) { for my $hourKey (keys %$hourHash) {
$c++ if ($hourHash->{$hourKey}->[0] && scalar @{$hourHash->{$hourKey}->[4]} >= 1); $c++ if ($hourHash->{$hourKey}->[0] && scalar @{$hourHash->{$hourKey}->[4]} > 1);
} }
} }
@ -9366,13 +9367,18 @@ sub _DbRep_rl_updateHour {
$mstr eq 'max' ? 'rl_max_h' : $mstr eq 'max' ? 'rl_max_h' :
'rl_h'; 'rl_h';
my $minutes = $mstr eq 'average' ? '30:00' : my $updminutes = $mstr eq 'average' ? '30:00' :
$mstr eq 'max' ? '59:59' : $mstr eq 'max' ? '59:59' :
'00:00'; '00:00';
#Log3 ($name, 3, "DbRep $name - content updateHour Array:\n".Dumper @$updateHourref); #Log3 ($name, 3, "DbRep $name - content updateHour Array:\n".Dumper @$updateHourref);
eval { $paref->{updminutes} = $updminutes;
$paref->{event} = $event;
$paref->{th} = $th;
$paref->{iref} = \$i;
$paref->{kref} = \$k;
for my $hourHash (@$updateHourref) { for my $hourHash (@$updateHourref) {
for my $hourKey (keys %$hourHash) { for my $hourKey (keys %$hourHash) {
@ -9380,8 +9386,17 @@ sub _DbRep_rl_updateHour {
next if (!$hourHash->{$hourKey}->[0]); next if (!$hourHash->{$hourKey}->[0]);
my ($updDate,$updHour) = $hourHash->{$hourKey}->[0] =~ /(.*\d+)\s(\d{2}):/; my ($updDate,$updHour) = $hourHash->{$hourKey}->[0] =~ /(.*\d+)\s(\d{2}):/;
$paref->{updDate} = $updDate;
$paref->{updHour} = $updHour;
$paref->{timestamp} = $hourHash->{$hourKey}->[0];
$paref->{device} = $hourHash->{$hourKey}->[1];
$paref->{reading} = $hourHash->{$hourKey}->[3];
$paref->{oldvalue} = $hourHash->{$hourKey}->[4]->[0];
if ($mstr eq 'average') { # Berechnung Average if ($mstr eq 'average') { # Berechnung Average
if (scalar @{$hourHash->{$hourKey}->[4]} >= 1) { # wahr wenn reading hat mehrere Datensätze diese Stunde if (scalar @{$hourHash->{$hourKey}->[4]} > 1) { # wahr wenn reading hat mehrere Datensätze diese Stunde
$i++;
for my $val (@{$hourHash->{$hourKey}->[4]}) { for my $val (@{$hourHash->{$hourKey}->[4]}) {
$sum += $val; $sum += $val;
@ -9390,35 +9405,27 @@ sub _DbRep_rl_updateHour {
my $value = sprintf "%.${ndp}f", $sum / scalar @{$hourHash->{$hourKey}->[4]}; my $value = sprintf "%.${ndp}f", $sum / scalar @{$hourHash->{$hourKey}->[4]};
$sum = 0; $sum = 0;
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updDate $updHour:$minutes, EVENT=$event, VALUE=$value WHERE DEVICE=$hourHash->{$hourKey}->[1] AND READING=$hourHash->{$hourKey}->[3] AND TIMESTAMP=$hourHash->{$hourKey}->[0] AND VALUE=$hourHash->{$hourKey}->[4]->[0]"); $paref->{logtxt} = "(hourly-$mstr) updating";
$paref->{newvalue} = $value;
$sth_upd->execute(("$updDate $updHour:$minutes", $event, $value, $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $hourHash->{$hourKey}->[0], $hourHash->{$hourKey}->[4]->[0])); $err = __DbRep_rl_updateHourDatabase ($paref);
$i++; if ($err) {
Log3 ($name, 2, "DbRep $name - ERROR - reduceLog $mstr failed for day $processingDay: $err");
$err = encode_base64($err, "");
$params = { DbRep_rollbackOnly ($name, $dbh);
name => $name, return $err;
logtxt => "(hourly-$mstr) updating",
iref => \$i,
kref => \$k,
th => $th,
processingDay => $processingDay
};
_DbRep_logProgress ($params);
if ($mode =~ /=day/i) { # timestamp, event, value, device, reading, Date
push(@$updateDayref, ["$updDate $updHour:$minutes", $event, $value, $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $updDate]);
} }
} }
else { else {
if ($mode =~ /=day/i) { # timestamp, event, value, device, reading, Date __DbRep_rl_onlyFillDayArray ($paref);
push(@$updateDayref, [$hourHash->{$hourKey}->[0], $hourHash->{$hourKey}->[2], $hourHash->{$hourKey}->[4]->[0], $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $updDate]);
}
} }
} }
elsif ($mstr eq 'max') { # Berechnung Max elsif ($mstr eq 'max') { # Berechnung Max
if (scalar @{$hourHash->{$hourKey}->[4]} >= 1) { if (scalar @{$hourHash->{$hourKey}->[4]} > 1) {
$i++;
for my $val (@{$hourHash->{$hourKey}->[4]}) { for my $val (@{$hourHash->{$hourKey}->[4]}) {
if (!defined $max) { if (!defined $max) {
@ -9432,45 +9439,25 @@ sub _DbRep_rl_updateHour {
my $value = sprintf "%.${ndp}f", $max; my $value = sprintf "%.${ndp}f", $max;
undef $max; undef $max;
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updDate $updHour:$minutes, EVENT=$event, VALUE=$value WHERE DEVICE=$hourHash->{$hourKey}->[1] AND READING=$hourHash->{$hourKey}->[3] AND TIMESTAMP=$hourHash->{$hourKey}->[0] AND VALUE=$hourHash->{$hourKey}->[4]->[0]"); $paref->{logtxt} = "(hourly-$mstr) updating";
$paref->{newvalue} = $value;
$sth_upd->execute(("$updDate $updHour:$minutes", $event, $value, $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $hourHash->{$hourKey}->[0], $hourHash->{$hourKey}->[4]->[0])); $err = __DbRep_rl_updateHourDatabase ($paref);
$i++; if ($err) {
Log3 ($name, 2, "DbRep $name - ERROR - reduceLog $mstr failed for day $processingDay: $err");
$params = { $err = encode_base64($err, "");
name => $name,
logtxt => "(hourly-$mstr) updating",
iref => \$i,
kref => \$k,
th => $th,
processingDay => $processingDay
};
_DbRep_logProgress ($params);
if ($mode =~ /=day/i) { # timestamp, event, value, device, reading, Date
push(@$updateDayref, ["$updDate $updHour:$minutes", $event, $value, $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $updDate]);
}
}
else {
if ($mode =~ /=day/i) { # timestamp, event, value, device, reading, Date
push(@$updateDayref, [$hourHash->{$hourKey}->[0], $hourHash->{$hourKey}->[2], $hourHash->{$hourKey}->[4]->[0], $hourHash->{$hourKey}->[1], $hourHash->{$hourKey}->[3], $updDate]);
}
}
}
}
}
1;
}
or do {
$err = encode_base64($@, "");
Log3 ($name, 2, "DbRep $name - ERROR - reduceLog $mstr failed for day $processingDay: $@");
DbRep_rollbackOnly ($name, $dbh); DbRep_rollbackOnly ($name, $dbh);
return $err; return $err;
}; }
}
else {
__DbRep_rl_onlyFillDayArray ($paref);
}
}
}
}
$err = DbRep_commitOnly ($name, $dbh); $err = DbRep_commitOnly ($name, $dbh);
return $err if ($err); return $err if ($err);
@ -9478,8 +9465,66 @@ sub _DbRep_rl_updateHour {
return $err; return $err;
} }
################################################################
# reduceLog Stundenupdate Datenbank und
# füllen Tages Update Array
################################################################
sub __DbRep_rl_updateHourDatabase {
my $paref = shift;
my $name = $paref->{name};
my $mode = $paref->{mode};
my $table = $paref->{table};
my $sth_upd = $paref->{sth_upd};
my $updateDayref = $paref->{updateDayref};
my $updDate = $paref->{updDate};
my $updHour = $paref->{updHour};
my $updminutes = $paref->{updminutes};
my $event = $paref->{event};
my $newvalue = $paref->{newvalue};
my $device = $paref->{device};
my $reading = $paref->{reading};
my $timestamp = $paref->{timestamp};
my $oldvalue = $paref->{oldvalue};
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updDate $updHour:$updminutes, EVENT=$event, VALUE=$newvalue WHERE DEVICE=$device AND READING=$reading AND TIMESTAMP=$timestamp AND VALUE=$oldvalue");
eval { $sth_upd->execute("$updDate $updHour:$updminutes", $event, $newvalue, $device, $reading, $timestamp, $oldvalue);
}
or do { return $@;
};
_DbRep_rl_logProgress ($paref);
if ($mode =~ /=day/i) {
push(@$updateDayref, ["$updDate $updHour:$updminutes", $event, $newvalue, $device, $reading, $updDate]);
}
return;
}
################################################################
# reduceLog Tages Array füllen
################################################################
sub __DbRep_rl_onlyFillDayArray {
my $paref = shift;
my $mode = $paref->{mode};
my $updateDayref = $paref->{updateDayref};
my $timestamp = $paref->{timestamp};
my $event = $paref->{event};
my $oldvalue = $paref->{oldvalue};
my $device = $paref->{device};
my $reading = $paref->{reading};
my $updDate = $paref->{updDate};
if ($mode =~ /=day/i) {
push(@$updateDayref, [$timestamp, $event, $oldvalue, $device, $reading, $updDate]);
}
return;
}
#################################################################################################### ####################################################################################################
# Mode Day in DB updaten # reduceLog Tagesupdates vornehmen
#################################################################################################### ####################################################################################################
sub _DbRep_rl_updateDay { sub _DbRep_rl_updateDay {
my $paref = shift; my $paref = shift;
@ -9546,49 +9591,59 @@ sub _DbRep_rl_updateDay {
$mstr eq 'max' ? '23:59:59' : $mstr eq 'max' ? '23:59:59' :
'00:00:00'; '00:00:00';
$paref->{time} = $time;
$paref->{event} = $event;
Log3 ($name, 3, "DbRep $name - reduceLog (daily-$mstr) updating ".(keys %updateHash).", deleting $c records of day: $processingDay") if(keys %updateHash); Log3 ($name, 3, "DbRep $name - reduceLog (daily-$mstr) updating ".(keys %updateHash).", deleting $c records of day: $processingDay") if(keys %updateHash);
eval {
if ($mstr eq 'average') { # Update Average if ($mstr eq 'average') { # Update Average
for my $uhk (keys %updateHash) { for my $uhk (keys %updateHash) {
my $value = sprintf "%.${ndp}f", $updateHash{$uhk}->{sum} / scalar @{$updateHash{$uhk}->{tedr}}; my $value = sprintf "%.${ndp}f", $updateHash{$uhk}->{sum} / scalar @{$updateHash{$uhk}->{tedr}};
my $lastUpdH = pop @{$updateHash{$uhk}->{tedr}}; my $lastUpdH = pop @{$updateHash{$uhk}->{tedr}};
for my $tedr (@{$updateHash{$uhk}->{tedr}}) { for my $tedr (@{$updateHash{$uhk}->{tedr}}) {
Log3 ($name, 4, "DbRep $name - DELETE FROM $table WHERE DEVICE='$tedr->[2]' AND READING='$tedr->[3]' AND TIMESTAMP='$tedr->[0]'");
$sth_delD->execute(($tedr->[2], $tedr->[3], $tedr->[0]));
$id++; $id++;
$params = { $paref->{logtxt} = "(daily-$mstr) deleting";
name => $name, $paref->{iref} = \$id;
logtxt => "(daily-$mstr) deleting", $paref->{kref} = \$kd;
iref => \$id, $paref->{th} = $thd;
kref => \$kd, $paref->{timestamp} = $tedr->[0];
th => $thd, $paref->{device} = $tedr->[2];
processingDay => $processingDay $paref->{reading} = $tedr->[3];
};
_DbRep_logProgress ($params); $err = __DbRep_rl_deleteDayDatabase ($paref);
if ($err) {
Log3 ($name, 3, "DbRep $name - ERROR - reduceLog $mstr=day failed for day $processingDay: $err");
$err = encode_base64($err, "");
DbRep_rollbackOnly ($name, $dbh);
return $err;
}
} }
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updateHash{$uhk}->{date} $time, EVENT=$event, VALUE=$value WHERE (DEVICE=$lastUpdH->[2]) AND (READING=$lastUpdH->[3]) AND (TIMESTAMP=$lastUpdH->[0])");
$sth_updD->execute( $updateHash{$uhk}->{date}." $time", $event, $value, $lastUpdH->[2], $lastUpdH->[3], $lastUpdH->[0] );
$iu++; $iu++;
$params = { $paref->{logtxt} = "(daily-$mstr) updating";
name => $name, $paref->{iref} = \$iu;
logtxt => "(daily-$mstr) updating", $paref->{kref} = \$ku;
iref => \$iu, $paref->{th} = $thu;
kref => \$ku, $paref->{date} = $updateHash{$uhk}->{date};
th => $thu, $paref->{timestamp} = $lastUpdH->[0];
processingDay => $processingDay $paref->{device} = $lastUpdH->[2];
}; $paref->{reading} = $lastUpdH->[3];
$paref->{value} = $value;
_DbRep_logProgress ($params); $err = __DbRep_rl_updateDayDatabase ($paref);
if ($err) {
Log3 ($name, 3, "DbRep $name - ERROR - reduceLog $mstr=day failed for day $processingDay: $err");
$err = encode_base64($err, "");
DbRep_rollbackOnly ($name, $dbh);
return $err;
}
} }
} }
elsif ($mstr eq 'max') { # Update Max elsif ($mstr eq 'max') { # Update Max
@ -9597,51 +9652,50 @@ sub _DbRep_rl_updateDay {
my $lastUpdH = pop @{$updateHash{$uhk}->{tedr}}; my $lastUpdH = pop @{$updateHash{$uhk}->{tedr}};
for my $tedr (@{$updateHash{$uhk}->{tedr}}) { for my $tedr (@{$updateHash{$uhk}->{tedr}}) {
Log3 ($name, 4, "DbRep $name - DELETE FROM $table WHERE DEVICE='$tedr->[2]' AND READING='$tedr->[3]' AND TIMESTAMP='$tedr->[0]'");
$sth_delD->execute(($tedr->[2], $tedr->[3], $tedr->[0]));
$id++; $id++;
$params = { $paref->{logtxt} = "(daily-$mstr) deleting";
name => $name, $paref->{iref} = \$id;
logtxt => "(daily-$mstr) deleting", $paref->{kref} = \$kd;
iref => \$id, $paref->{th} = $thd;
kref => \$kd, $paref->{timestamp} = $tedr->[0];
th => $thd, $paref->{device} = $tedr->[2];
processingDay => $processingDay $paref->{reading} = $tedr->[3];
};
_DbRep_logProgress ($params); $err = __DbRep_rl_deleteDayDatabase ($paref);
}
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updateHash{$uhk}->{date} 23:59:59, EVENT=$event, VALUE=$value WHERE (DEVICE=$lastUpdH->[2]) AND (READING=$lastUpdH->[3]) AND (TIMESTAMP=$lastUpdH->[0])"); if ($err) {
Log3 ($name, 3, "DbRep $name - ERROR - reduceLog $mstr=day failed for day $processingDay: $err");
$sth_updD->execute( $updateHash{$uhk}->{date}." 23:59:59", $event, $value, $lastUpdH->[2], $lastUpdH->[3], $lastUpdH->[0] ); $err = encode_base64($err, "");
$iu++;
$params = {
name => $name,
logtxt => "(daily-$mstr) updating",
iref => \$iu,
kref => \$ku,
th => $thu,
processingDay => $processingDay
};
_DbRep_logProgress ($params);
}
}
1;
}
or do {
$err = encode_base64($@, "");
Log3 ($name, 3, "DbRep $name - ERROR - reduceLog $mstr=day failed for day $processingDay: $@");
DbRep_rollbackOnly ($name, $dbh); DbRep_rollbackOnly ($name, $dbh);
return $err; return $err;
}; }
}
$iu++;
$paref->{logtxt} = "(daily-$mstr) updating";
$paref->{iref} = \$iu;
$paref->{kref} = \$ku;
$paref->{th} = $thu;
$paref->{date} = $updateHash{$uhk}->{date};
$paref->{timestamp} = $lastUpdH->[0];
$paref->{device} = $lastUpdH->[2];
$paref->{reading} = $lastUpdH->[3];
$paref->{value} = $value;
$err = __DbRep_rl_updateDayDatabase ($paref);
if ($err) {
Log3 ($name, 3, "DbRep $name - ERROR - reduceLog $mstr=day failed for day $processingDay: $err");
$err = encode_base64($err, "");
DbRep_rollbackOnly ($name, $dbh);
return $err;
}
}
}
$err = DbRep_commitOnly ($name, $dbh); $err = DbRep_commitOnly ($name, $dbh);
return $err if ($err); return $err if ($err);
@ -9649,8 +9703,60 @@ sub _DbRep_rl_updateDay {
return $err; return $err;
} }
################################################################
# reduceLog Tageswerte löschen
################################################################
sub __DbRep_rl_deleteDayDatabase {
my $paref = shift;
my $name = $paref->{name};
my $table = $paref->{table};
my $sth_delD = $paref->{sth_delD};
my $device = $paref->{device};
my $reading = $paref->{reading};
my $timestamp = $paref->{timestamp};
Log3 ($name, 4, "DbRep $name - DELETE FROM $table WHERE DEVICE='$device' AND READING='$reading' AND TIMESTAMP='$timestamp'");
eval { $sth_delD->execute($device, $reading, $timestamp);
}
or do { return $@;
};
_DbRep_rl_logProgress ($paref);
return;
}
################################################################
# reduceLog Tageswerte updaten
################################################################
sub __DbRep_rl_updateDayDatabase {
my $paref = shift;
my $name = $paref->{name};
my $table = $paref->{table};
my $sth_updD = $paref->{sth_updD};
my $event = $paref->{event};
my $device = $paref->{device};
my $reading = $paref->{reading};
my $value = $paref->{value};
my $date = $paref->{date};
my $time = $paref->{time};
my $timestamp = $paref->{timestamp};
Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$date $time, EVENT=$event, VALUE=$value WHERE (DEVICE=$device) AND (READING=$reading) AND (TIMESTAMP=$timestamp)");
eval { $sth_updD->execute("$date $time", $event, $value, $device, $reading, $timestamp);
}
or do { return $@;
};
_DbRep_rl_logProgress ($paref);
return;
}
#################################################################################################### ####################################################################################################
# Grenzen für Logausgabe abhängig von der Zeilenanzahl # reduceLog Grenzen für Logausgabe abhängig von der Zeilenanzahl
#################################################################################################### ####################################################################################################
sub _DbRep_rl_logThreshold { sub _DbRep_rl_logThreshold {
my $rn = shift; my $rn = shift;
@ -9663,9 +9769,9 @@ return $th;
} }
################################################################ ################################################################
# Logausgabe Fortschritt reduceLog # reduceLog Logausgabe Fortschritt
################################################################ ################################################################
sub _DbRep_logProgress { sub _DbRep_rl_logProgress {
my $paref = shift; my $paref = shift;
my $name = $paref->{name}; my $name = $paref->{name};
my $logtxt = $paref->{logtxt}; my $logtxt = $paref->{logtxt};