2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-25 03:44:52 +00:00

93_DbRep: contrib 8.52.8

git-svn-id: https://svn.fhem.de/fhem/trunk@27711 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2023-06-28 15:58:21 +00:00
parent a5e1c8c3f4
commit 290aaf595d

View File

@ -1,5 +1,5 @@
##########################################################################################################
# $Id: 93_DbRep.pm 27396 2023-04-05 11:01:24Z DS_Starter $
# $Id: 93_DbRep.pm 27577 2023-05-16 19:56:58Z DS_Starter $
##########################################################################################################
# 93_DbRep.pm
#
@ -59,6 +59,9 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
# Version History intern
my %DbRep_vNotesIntern = (
"8.52.8" => "28.06.2023 fix check of DbRep_afterproc, DbRep_beforeproc if should exec PERL code ",
"8.52.7" => "16.05.2023 DbRep_afterproc, DbRep_beforeproc can execute FHEM commands as well as PERL code ",
"8.52.6" => "11.04.2023 change diffValue for aggr month ",
"8.52.5" => "10.04.2023 change diffValue, Forum: https://forum.fhem.de/index.php?msg=1271853 ",
"8.52.4" => "10.04.2023 fix perl warning ",
"8.52.3" => "04.04.2023 fix diffValue writeToDB: https://forum.fhem.de/index.php?topic=53584.msg1270905#msg1270905 ",
@ -464,8 +467,8 @@ sub DbRep_Initialize {
"dumpMemlimit ".
"dumpSpeed ".
"dumpFilesKeep:0,1,2,3,4,5,6,7,8,9,10 ".
"executeBeforeProc ".
"executeAfterProc ".
"executeBeforeProc:textField-long ".
"executeAfterProc:textField-long ".
"expimpfile ".
"fastStart:0,1 ".
"fetchRoute:ascent,descent ".
@ -1637,6 +1640,16 @@ sub DbRep_Attr {
}
}
}
if ($aName =~ /executeAfterProc|executeBeforeProc/xs) {
if($cmd eq "set") {
if ($aVal =~ m/^\s*(\{.*\}|{.*|.*})\s*$/xs && $aVal !~ /{".*"}/xs) {
$aVal = $1;
eval $aVal;
return $@ if ($@);
}
}
}
if ($aName eq "role") {
if($cmd eq "set") {
@ -4609,7 +4622,11 @@ sub DbRep_diffval {
if(!@array) {
my $aval = AttrVal($name, "aggregation", "");
if($aval eq "hour") {
if($aval eq "month") {
my @rsf = split /[ -]/, $runtime_string_first;
@array = ($runtime_string." ".$rsf[0]."_".$rsf[1]."\n");
}
elsif($aval eq "hour") {
my @rsf = split /[ :]/, $runtime_string_first;
@array = ($runtime_string." ".$rsf[0]."_".$rsf[1]."\n");
}
@ -4832,11 +4849,6 @@ sub DbRep_diffvalDone {
my %rh = split("§", $rowlist);
#Log3 ($name, 4, "DbRep $name - print result of diffValue calculation after decoding ...");
#for my $key (sort(keys(%rh))) {
# Log3 ($name, 4, "DbRep $name - runtimestring Key: $key, value: ".$rh{$key});
#}
readingsBeginUpdate($hash);
for my $key (sort(keys(%rh))) {
@ -12397,21 +12409,21 @@ return ($txt);
###################################################################################
sub DbRep_beforeproc {
my $hash = shift;
my $txt = shift // q{process};
my $cmd = shift // q{process};
my $name = $hash->{NAME};
my $fn = AttrVal($name, 'executeBeforeProc', '');
my $ebd = AttrVal($name, 'executeBeforeProc', '');
if($ebd) {
Log3 ($name, 3, "DbRep $name - execute command before $txt: '$ebd' ");
my $err = AnalyzeCommandChain(undef, $ebd);
if($fn) {
Log3 ($name, 3, "DbRep $name - execute command before $cmd: '$fn' ");
my $err = _DbRep_procCode ($hash, $fn);
if ($err) {
Log3 ($name, 2, "DbRep $name - command message before $txt: \"$err\" ");
my $erread = "Warning - message from command before $txt appeared";
Log3 ($name, 2, "DbRep $name - command message before $cmd: \"$err\" ");
my $erread = "Warning - message from command before $cmd appeared";
ReadingsSingleUpdateValue ($hash, "before".$txt."_message", $err, 1);
ReadingsSingleUpdateValue ($hash, "before_".$cmd."_message", $err, 1);
ReadingsSingleUpdateValue ($hash, "state", $erread, 1);
}
}
@ -12427,21 +12439,21 @@ sub DbRep_afterproc {
my $cmd = shift // q{process};
my $bfile = shift // q{};
my $erread;
my ($err,$erread);
my $name = $hash->{NAME};
$cmd = (split " ", $cmd)[0];
my $sval = ReadingsVal ($name, 'state', '');
my $ead = AttrVal ($name, 'executeAfterProc', '');
if($ead) {
Log3 ($name, 3, "DbRep $name - execute command after $cmd: '$ead' ");
my $err = AnalyzeCommandChain(undef, $ead);
my $fn = AttrVal ($name, 'executeAfterProc', '');
if($fn) {
Log3 ($name, 3, "DbRep $name - execute command after $cmd: '$fn' ");
$err = _DbRep_procCode ($hash, $fn);
if ($err) {
Log3 ($name, 2, qq{DbRep $name - command message after $cmd: "$err"});
Log3 ($name, 2, qq{DbRep $name - command message after $cmd: >$err<});
$erread = $sval eq 'error' ? $sval : qq(WARNING - $cmd finished, but message after command appeared);
ReadingsSingleUpdateValue ($hash, 'after_'.$cmd.'_message', $err, 1);
@ -12465,6 +12477,34 @@ sub DbRep_afterproc {
return '';
}
###################################################################################
# Befehl oder Code prozessieren
###################################################################################
sub _DbRep_procCode {
my $hash = shift;
my $fn = shift;
my $err = q{};
my $name = $hash->{NAME};
$fn =~ s/\s*#.*//g; # Kommentare entfernen
$fn = join ' ', split /\s+/sx, $fn; # Funktion serialisieren
if ($fn =~ m/^\s*(\{.*\})\s*$/xs) { # unnamed Funktion direkt mit {...}
$fn = $1;
eval $fn;
if ($@) {
$err = $@;
}
}
else {
$err = AnalyzeCommandChain (undef, $fn);
}
return $err;
}
##############################################################################################
# timestamp_begin, timestamp_end bei Einsatz datetime-Picker entsprechend
# den Anforderungen formatieren
@ -14105,12 +14145,12 @@ sub DbRep_setVersionInfo {
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
# META-Daten sind vorhanden
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbRep.pm 27396 2023-04-05 11:01:24Z DS_Starter $ im Kopf komplett! vorhanden )
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbRep.pm 27577 2023-05-16 19:56:58Z DS_Starter $ im Kopf komplett! vorhanden )
$modules{$type}{META}{x_version} =~ s/1.1.1/$v/g;
} else {
$modules{$type}{META}{x_version} = $v;
}
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbRep.pm 27396 2023-04-05 11:01:24Z DS_Starter $ im Kopf komplett! vorhanden )
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbRep.pm 27577 2023-05-16 19:56:58Z DS_Starter $ im Kopf komplett! vorhanden )
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
@ -16503,54 +16543,59 @@ sub dbval {
</li>
<a id="DbRep-attr-executeAfterProc"></a>
<li><b>executeAfterProc </b> - you can specify a FHEM command or perl function which should be executed
<b>after command execution</b>. <br>
Perl functions have to be enclosed in {} .<br><br>
<li><b>executeAfterProc </b> <br><br>
You can specify a FHEM command or Perl code that should be executed <b>after the command is processed</b>. <br>
Perl code is to be enclosed in {...}. The variables $hash (hash of the DbRep device) and $name
(name of the DbRep device) are available. <br><br>
<ul>
<b>Example:</b> <br><br>
attr &lt;name&gt; executeAfterProc set og_gz_westfenster off; <br>
attr &lt;name&gt; executeAfterProc {adump ("&lt;name&gt;")} <br><br>
<ul>
<b>Example:</b> <br><br>
attr &lt;name&gt; executeAfterProc set og_gz_westfenster off; <br>
attr &lt;name&gt; executeAfterProc {adump ($name)} <br><br>
# "adump" is a function defined in 99_myUtils.pm e.g.: <br>
# "adump" is a function defined in 99_myUtils. <br>
<pre>
sub adump {
my ($name) = @_;
my $hash = $defs{$name};
# own function, e.g.
Log3($name, 3, "DbRep $name -> Dump finished");
my $hash = $defs{$name};
# the own function, e.g.
Log3($name, 3, "DbRep $name -> Dump is finished");
return;
}
</pre>
</ul>
</li>
</ul>
</li>
<a id="DbRep-attr-executeBeforeProc"></a>
<li><b>executeBeforeProc </b> - you can specify a FHEM command or perl function which should be executed
<b>before command execution</b>. <br>
Perl functions have to be enclosed in {} .<br><br>
<li><b>executeBeforeProc </b> <br><br>
A FHEM command or Perl code can be specified which is to be executed <b>before the command is processed</b>. <br>
Perl code is to be enclosed in {...}. The variables $hash (hash of the DbRep device) and $name
(name of the DbRep device) are available. <br><br>
<ul>
<b>Example:</b> <br><br>
attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
attr &lt;name&gt; executeBeforeProc {bdump ("&lt;name&gt;")} <br><br>
<ul>
<b>Example:</b> <br><br>
attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
attr &lt;name&gt; executeBeforeProc {bdump ($name)} <br><br>
# "bdump" is a function defined in 99_myUtils.pm e.g.: <br>
# "bdump" is a function defined in 99_myUtils. <br>
<pre>
sub bdump {
my ($name) = @_;
my $hash = $defs{$name};
# own function, e.g.
Log3($name, 3, "DbRep $name -> Dump starts now");
my $hash = $defs{$name};
# the own function, e.g.
Log3($name, 3, "DbRep $name -> Dump starts");
return;
}
</pre>
</ul>
</li>
</ul>
</li>
<a id="DbRep-attr-expimpfile"></a>
<li><b>expimpfile &lt;/path/file&gt; [MAXLINES=&lt;lines&gt;] </b>
@ -19545,54 +19590,60 @@ sub dbval {
</li>
<a id="DbRep-attr-executeAfterProc"></a>
<li><b>executeAfterProc </b> - Es kann ein FHEM-Kommando oder eine Perl-Funktion angegeben werden welche <b>nach der
Befehlsabarbeitung</b> ausgeführt werden soll. <br>
Funktionen sind in {} einzuschließen.<br><br>
<li><b>executeAfterProc </b> <br><br>
Es kann ein FHEM-Kommando oder Perl Code angegeben werden der <b>nach der Befehlsabarbeitung</b> ausgeführt
werden soll. <br>
Perl Code ist in {...} einzuschließen. Es stehen die Variablen $hash (Hash des DbRep Devices) und $name
(Name des DbRep-Devices) zur Verfügung. <br><br>
<ul>
<b>Beispiel:</b> <br><br>
attr &lt;name&gt; executeAfterProc set og_gz_westfenster off; <br>
attr &lt;name&gt; executeAfterProc {adump ("&lt;name&gt;")} <br><br>
<ul>
<b>Beispiel:</b> <br><br>
attr &lt;name&gt; executeAfterProc set og_gz_westfenster off; <br>
attr &lt;name&gt; executeAfterProc {adump ($name)} <br><br>
# "adump" ist eine in 99_myUtils definierte Funktion. <br>
# "adump" ist eine in 99_myUtils definierte Funktion. <br>
<pre>
sub adump {
my ($name) = @_;
my $hash = $defs{$name};
my $hash = $defs{$name};
# die eigene Funktion, z.B.
Log3($name, 3, "DbRep $name -> Dump ist beendet");
return;
}
</pre>
</ul>
</li>
</ul>
</li>
<a id="DbRep-attr-executeBeforeProc"></a>
<li><b>executeBeforeProc </b> - Es kann ein FHEM-Kommando oder eine Perl-Funktion angegeben werden welche <b>vor der
Befehlsabarbeitung</b> ausgeführt werden soll. <br>
Funktionen sind in {} einzuschließen.<br><br>
<li><b>executeBeforeProc </b> <br><br>
Es kann ein FHEM-Kommando oder Perl Code angegeben werden der <b>vor der Befehlsabarbeitung</b> ausgeführt
werden soll. <br>
Perl Code ist in {...} einzuschließen. Es stehen die Variablen $hash (Hash des DbRep Devices) und $name
(Name des DbRep-Devices) zur Verfügung. <br><br>
<ul>
<b>Beispiel:</b> <br><br>
attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
attr &lt;name&gt; executeBeforeProc {bdump ("&lt;name&gt;")} <br><br>
<ul>
<b>Beispiel:</b> <br><br>
attr &lt;name&gt; executeBeforeProc set og_gz_westfenster on; <br>
attr &lt;name&gt; executeBeforeProc {bdump ($name)} <br><br>
# "bdump" ist eine in 99_myUtils definierte Funktion. <br>
# "bdump" ist eine in 99_myUtils definierte Funktion. <br>
<pre>
sub bdump {
my ($name) = @_;
my $hash = $defs{$name};
my $hash = $defs{$name};
# die eigene Funktion, z.B.
Log3($name, 3, "DbRep $name -> Dump startet");
return;
}
</pre>
</ul>
</li>
</ul>
</li>
<a id="DbRep-attr-expimpfile"></a>
<li><b>expimpfile &lt;/Pfad/Filename&gt; [MAXLINES=&lt;lines&gt;]</b>