From 14539aea175016c3e4f9dc2ed4f9297e50d4a76a Mon Sep 17 00:00:00 2001 From: Ellert <> Date: Fri, 27 Jan 2017 14:49:04 +0000 Subject: [PATCH] 98_DOIFtools.pm: dynamic column width in report git-svn-id: https://svn.fhem.de/fhem/trunk@13249 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/98_DOIFtools.pm | 65 +++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 9480d9a15..61e7d9b3b 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - update: 98_DOIFtools.pm: dynamic column width in report - update: 98_DOIFtools.pm: add delete readings in other devices than DOIF - update: 88_HMCCU.pm: version 3.9 - update: 98_DOIFtools.pm: marking an eventline in DOIFs event monitor diff --git a/fhem/FHEM/98_DOIFtools.pm b/fhem/FHEM/98_DOIFtools.pm index 9fa90f527..9ed09ef9a 100644 --- a/fhem/FHEM/98_DOIFtools.pm +++ b/fhem/FHEM/98_DOIFtools.pm @@ -941,16 +941,28 @@ sub DOIFtools_Get($@) # event statistics my $regex = ReadingsVal($pn,"statisticsDeviceFilterRegex",".*"); my $evtsum = 0; + my $evtlen = 15 + 2; my $rate = 0; my $typsum = 0; + my $typlen = 10 + 2; my $typerate = 0; my $allattr = ""; my $rx = AttrVal($pn,"DOIFtoolsHideStatReadings","") ? "\.stat_" : "stat_"; - - $ret = "".sprintf("%-17s","TYPE").sprintf("%-25s","Name").sprintf("%-12s","Anzahl").sprintf("%-8s","Rate").sprintf("%-12s","Begrenzung")."\n"; - $ret .= sprintf("%-17s","").sprintf("%-25s","").sprintf("%-12s","Events").sprintf("%-8s","1/h").sprintf("%-12s","event-on...")."\n"; - $ret .= sprintf("-"x76)."\n"; my $te = ReadingsVal($pn,".te",0)/3600; + my $compRate = ReadingsNum($pn,"statisticsShowRate_ge",0); + foreach my $typ ( keys %types) { + $typlen = length($typ)+2 > $typlen ? length($typ)+2 : $typlen; + } + foreach my $key (sort keys %{$defs{$pn}->{READINGS}}) { + $rate = ($te ? int($hash->{READINGS}{$key}{VAL}/$te + 0.5) : 0) if ($key =~ m/^$rx($regex)/); + if ($key =~ m/^$rx($regex)/ and $rate >= $compRate) { + $evtlen = length($1)+2 > $evtlen ? length($1)+2 : $evtlen; + } + } + + $ret = "".sprintf("%-".$typlen."s","TYPE").sprintf("%-".$evtlen."s","NAME").sprintf("%-12s","Anzahl").sprintf("%-8s","Rate").sprintf("%-12s","Begrenzung")."\n"; + $ret .= sprintf("%-".$typlen."s","").sprintf("%-".$evtlen."s","").sprintf("%-12s","Events").sprintf("%-8s","1/h").sprintf("%-12s","event-on...")."\n"; + $ret .= sprintf("-"x($typlen+$evtlen+33))."\n"; my $i = 0; my $t = 0; foreach my $typ (sort keys %types) { @@ -958,38 +970,38 @@ sub DOIFtools_Get($@) $t=0; foreach my $key (sort keys %{$defs{$pn}->{READINGS}}) { $rate = ($te ? int($hash->{READINGS}{$key}{VAL}/$te + 0.5) : 0) if ($key =~ m/^$rx($regex)/ and defined($defs{$1}) and $defs{$1}->{TYPE} eq $typ); - if ($key =~ m/^$rx($regex)/ and defined($defs{$1}) and $defs{$1}->{TYPE} eq $typ and $rate >= ReadingsNum($pn,"statisticsShowRate_ge",0)) { + if ($key =~ m/^$rx($regex)/ and defined($defs{$1}) and $defs{$1}->{TYPE} eq $typ and $rate >= $compRate) { $evtsum += $hash->{READINGS}{$key}{VAL}; $typsum += $hash->{READINGS}{$key}{VAL}; $allattr = " ".join(" ",keys %{$attr{$1}}); - $ret .= sprintf("%-17s",$typ).sprintf("%-25s",$1).sprintf("%-12s",$hash->{READINGS}{$key}{VAL}).sprintf("%-8s",$rate).sprintf("%-12s",($allattr =~ " event-on") ? "ja" : "nein")."\n"; + $ret .= sprintf("%-".$typlen."s",$typ).sprintf("%-".$evtlen."s",$1).sprintf("%-12s",$hash->{READINGS}{$key}{VAL}).sprintf("%-8s",$rate).sprintf("%-12s",($allattr =~ " event-on") ? "ja" : "nein")."\n"; $i++; $t++; } } if ($t) { $typerate = $te ? int($typsum/$te + 0.5) : 0; - if($typerate >= ReadingsNum($pn,"statisticsShowRate_ge",0)) { - $ret .= sprintf("%52s","="x10).sprintf("%2s"," ").sprintf("="x6)."\n"; - $ret .= sprintf("%42s","Summe: ").sprintf("%-10s",$typsum).sprintf("%2s","∅:").sprintf("%-8s",$typerate)."\n"; - $ret .= sprintf("%43s","Geräte: ").sprintf("%-10s",$t)."\n"; - $ret .= sprintf("%43s","Events/Gerät: ").sprintf("%-10s",int($typsum/$t + 0.5))."\n"; - $ret .= "
".sprintf("-"x71)."
"; + if($typerate >= $compRate) { + $ret .= sprintf("%".($typlen+$evtlen+10)."s","="x10).sprintf("%2s"," ").sprintf("="x6)."\n"; + $ret .= sprintf("%".($typlen+$evtlen)."s","Summe: ").sprintf("%-10s",$typsum).sprintf("%2s","∅:").sprintf("%-8s",$typerate)."\n"; + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Geräte: ").sprintf("%-10s",$t)."\n"; + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Events/Gerät: ").sprintf("%-10s",int($typsum/$t + 0.5))."\n"; + $ret .= "
".sprintf("-"x($typlen+$evtlen+33))."
"; } } } - $ret .= sprintf("%52s","="x10).sprintf("%2s"," ").sprintf("="x6)."\n"; - $ret .= sprintf("%42s","Summe: ").sprintf("%-10s",$evtsum).sprintf("%2s","∅:").sprintf("%-8s",$te ? int($evtsum/$te + 0.5) : "")."\n"; - $ret .= sprintf("%42s","Dauer: ").sprintf("%d:%02d",int($te),int(($te-int($te))*60+.5))."\n"; - $ret .= sprintf("%43s","Geräte: ").sprintf("%-10s",$i)."\n"; - $ret .= sprintf("%43s","Events/Gerät: ").sprintf("%-10s",int($evtsum/$i + 0.5))."\n\n" if ($i); + $ret .= sprintf("%".($typlen+$evtlen+10)."s","="x10).sprintf("%2s"," ").sprintf("="x6)."\n"; + $ret .= sprintf("%".($typlen+$evtlen)."s","Summe: ").sprintf("%-10s",$evtsum).sprintf("%2s","∅:").sprintf("%-8s",$te ? int($evtsum/$te + 0.5) : "")."\n"; + $ret .= sprintf("%".($typlen+$evtlen)."s","Dauer: ").sprintf("%d:%02d",int($te),int(($te-int($te))*60+.5))."\n"; + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Geräte: ").sprintf("%-10s",$i)."\n"; + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Events/Gerät: ").sprintf("%-10s",int($evtsum/$i + 0.5))."\n\n" if ($i); fhem("count",1) =~ m/(\d+)/; - $ret .= sprintf("%43s","Geräte total: ").sprintf("%-10s","$1\n\n"); - $ret .= sprintf("%43s","Filter\n"); - $ret .= sprintf("%42s","TYPE: ").sprintf("%-10s",ReadingsVal($pn,"statisticsTYPEs","")."\n"); - $ret .= sprintf("%35s","NAME: ").sprintf("%-10s",ReadingsVal($pn,"statisticsDeviceFilterRegex",".*")."\n"); - $ret .= sprintf("%35s","Rate: ").sprintf("%-10s",">= ".ReadingsVal($pn,"statisticsShowRate_ge","0")."\n\n"); - $ret .= "
".sprintf("-"x71)."
"; + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Geräte total: ").sprintf("%-10s","$1\n\n"); + $ret .= sprintf("%".($typlen+$evtlen+1)."s","Filter\n"); + $ret .= sprintf("%".($typlen+$evtlen)."s","TYPE: ").sprintf("%-10s",ReadingsVal($pn,"statisticsTYPEs","")."\n"); + $ret .= sprintf("%".($typlen+$evtlen-7)."s","NAME: ").sprintf("%-10s",ReadingsVal($pn,"statisticsDeviceFilterRegex",".*")."\n"); + $ret .= sprintf("%".($typlen+$evtlen-7)."s","Rate: ").sprintf("%-10s",">= $compRate\n\n"); + $ret .= "
".sprintf("-"x($typlen+$evtlen+33))."
"; # attibute statistics $ret .= "".sprintf("%-30s","gesetzte Attribute in DOIF").sprintf("%-12s","Anzahl")."\n"; $ret .= sprintf("-"x42)."\n"; @@ -1010,7 +1022,7 @@ sub DOIFtools_Get($@) } } foreach $i (sort keys %da) { - $ret .= sprintf("%-28s","$i").sprintf("%-12s","$da{$i}")."\n"; + $ret .= sprintf("%-30s","$i").sprintf("%-12s","$da{$i}")."\n"; } } elsif ($arg eq "checkDOIF") { my @coll = (); @@ -1238,7 +1250,7 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
DOIFtoolsHideStatReadings 1, verstecken der stat_ Readings. Das Ändern des Attributs löscht eine bestehende Event-Aufzeichnung. Default 0.

attr <name> DOIFtoolsEventOnDeleted <0|1>
- DOIFtoolsEventOnDeleted 1, es werden Events für alle stat_ erzeugt, bevor sie gelöscht werden. Damit könnten die erfassten Daten geloggt werden. Default 0.
+ DOIFtoolsEventOnDeleted 1, es werden Events für alle stat_ erzeugt, bevor sie gelöscht werden. Damit könnten die erfassten Daten geloggt werden. Default 0.

attr <name> DOIFtoolsMyShortcuts <shortcut name>,<command>, ...
DOIFtoolsMyShortcuts <Bezeichnung>,<Befehl>,... anzeigen eigener Shortcuts, siehe globales Attribut menuEntries.
@@ -1269,7 +1281,8 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
  • statisticShowRate_ge zeigt die Event-Rate, ab der Geräte in die Auswertung einbezogen werden.
  • statisticsDeviceFilterRegex zeigt den aktuellen Gerätefilterausdruck an.
  • statisticsTYPEs zeigt eine Liste von TYPE an, für deren Geräte die Statistik erzeugt wird.
  • -
  • specialLog zeigt an ob DOIF-Listing im Log eingeschaltet ist.
  • +
  • targetDOIF zeigt das Ziel-DOIF, bei dem Readings gelöscht werden sollen.
  • +
  • targetDevice zeigt das Ziel-Gerät, bei dem Readings gelöscht werden sollen.