From adb765a3c406280db545a99a6d209ca9109ca2af Mon Sep 17 00:00:00 2001 From: vuffiraa <> Date: Sun, 21 Apr 2019 20:10:25 +0000 Subject: [PATCH] 70_BOTVAC.pm: cleaning statistics using html git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@19237 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/70_BOTVAC.pm | 132 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 91 insertions(+), 41 deletions(-) diff --git a/FHEM/70_BOTVAC.pm b/FHEM/70_BOTVAC.pm index f48f97b4f..d1739f093 100755 --- a/FHEM/70_BOTVAC.pm +++ b/FHEM/70_BOTVAC.pm @@ -217,47 +217,7 @@ sub Get($@) { } } elsif ( $what =~ /^(statistics)$/ ) { if (defined( $hash->{helper}{MAPS} and @{$hash->{helper}{MAPS}} > 0)) { - my $ret = ""; - my $mapcount = @{$hash->{helper}{MAPS}}; - my $cw = 9; #column width - my $cws = $cw * 11 + 4; #column width sum - $ret .= "".sprintf("%-".($cws)."s","Report: ".ReadingsVal($name,"name","name").", ".InternalVal($name,"VENDOR","VENDOR").", ".ReadingsVal($name,"model","model"))."\n\n"; - - $ret .= "".sprintf("%-".($cw-5)."s","Map").sprintf("%-".($cw+1)."s","Expected").sprintf("%-".($cw-4)."s","Map").sprintf("%-".($cw-4)."s","Map").sprintf("%-".($cw-2)."s","Charge").sprintf("%-".($cw+1)."s","Discharge").sprintf("%-".($cw-2)."s","Area").sprintf("%-".($cw+11)."s","Cleaning").sprintf("%-".($cw-2)."s","Charge").sprintf("%-".$cw."s","Status").sprintf("%-".($cw+2)."s","Date").sprintf("%-".($cw+10)."s","Time")."\n"; - - $ret .= "".sprintf("%-".($cw-5)."s","No.").sprintf("%-".($cw-4)."s","Area").sprintf("%-".($cw-4)."s","Time").sprintf("%-".($cw-4)."s","Area").sprintf("%-".($cw-4)."s","Time").sprintf("%-".($cw-2)."s","Delta").sprintf("%-".(($cw+1))."s","Speed").sprintf("%-".($cw-2)."s","Speed").sprintf("%-".($cw-2)."s","Cat.").sprintf("%-".($cw-3)."s","Mode").sprintf("%-".($cw-2)."s","Freq.").sprintf("%-".($cw-2)."s","During").sprintf("%-".$cw."s","").sprintf("%-".($cw+2)."s","").sprintf("%-".($cw+10)."s","")."\n"; - - $ret .= "".sprintf("%-".($cw-5)."s","").sprintf("%-".($cw-4)."s","qm").sprintf("%-".($cw-4)."s","min").sprintf("%-".($cw-4)."s","qm").sprintf("%-".($cw-4)."s","min").sprintf("%-".($cw-2)."s","%").sprintf("%-".($cw+1)."s","%/min").sprintf("%-".($cw-2)."s","qm/min").sprintf("%-".($cw-2)."s","").sprintf("%-".($cw-3)."s","").sprintf("%-".($cw-2)."s","").sprintf("%-".($cw-2)."s","Run").sprintf("%-".$cw."s","").sprintf("%-".($cw+2)."s","YYYY-MM-DD").sprintf("%-".($cw+10)."s","hh:mm:ss")."\n"; - $ret .= sprintf("-"x($cws))."\n"; - - for (my $i=0;$i<$mapcount;$i++) { - my $map = \$hash->{helper}{MAPS}[$i]; - my $t1 = GetSecondsFromString("$$map->{end_at}"); - my $t2 = GetSecondsFromString("$$map->{start_at}"); - my $dt = $t1-$t2-$$map->{time_in_suspended_cleaning}-$$map->{time_in_error}-$$map->{time_in_pause}; - my $dc = $$map->{run_charge_at_start}-$$map->{run_charge_at_end}; - my $expa = int($$map->{cleaned_area}*100/$dc+.5) if ($dc > 0); - my $expt = int($dt*100/$dc/60+.5) if ($dc > 0); - $ret .= sprintf("%-".($cw-5)."s",$i+1); # Map No. - $ret .= sprintf("%-".($cw-4)."s",($expa>0?$expa:0)); # Expected Area - $ret .= sprintf("%-".($cw-4)."s",($expt>0?$expt:0)); # Expected Time - $ret .= sprintf("%-".($cw-4)."s",int($$map->{cleaned_area}+.5)); # Map Area - $ret .= sprintf("%-".($cw-4)."s",($dt>0)?(int($dt/60+.5)):0); # Map Time - $ret .= sprintf("%-".($cw-2)."s",($dc>0?$dc:0)); # Charge Delta - $ret .= sprintf("%-".($cw+1)."s",($dt>0 and $dc>0)?(int($dc*600/$dt+.5)/10):0); # Discharge Speed - $ret .= sprintf("%-".($cw-2)."s",($expt>0 and $expa>0)?(int($expa*10/$expt+.5))/10:0); # Area Speed - $ret .= sprintf("%-".($cw-2)."s",GetCategoryText($$map->{category})); # Cleaning Category - $ret .= sprintf("%-".($cw-3)."s",GetModeText($$map->{mode})); # Cleaning Mode - $ret .= sprintf("%-".($cw-2)."s",GetModifierText($$map->{modifier})); # Cleaning Frequency - $ret .= sprintf("%-".($cw-2)."s",$$map->{suspended_cleaning_charging_count}."x"); # Charge During Run - $ret .= sprintf("%-".$cw."s",$$map->{status}); # Status - $ret .= sprintf("%-".($cws)."s",GetTimeFromString($$map->{generated_at})); # Date - $ret .= "\n"; - $ret .= "
".sprintf("-"x($cws))."
" if ($i%5==4); - } - $ret .= "\nManufacturer Specification\n"; - $ret .= "Vorwerk VR220(VR300), battery 84 Wh, eco (90 min, 120 qm, power 65 W), turbo (60 min, 90 qm, power 85 W)\n"; - return $ret; + return GetStatistics($hash); } else { return "maps for $what are not available yet"; } @@ -1667,6 +1627,96 @@ sub GetMap() { } +sub GetStatistics($) { + my($hash) = @_; + my $name = $hash->{NAME}; + my $mapcount = @{$hash->{helper}{MAPS}}; + my $ret = ""; + + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ''; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ''; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ' '; + $ret .= ''; + for (my $i=0;$i<$mapcount;$i++) { + my $map = \$hash->{helper}{MAPS}[$i]; + my $t1 = GetSecondsFromString($$map->{end_at}); + my $t2 = GetSecondsFromString($$map->{start_at}); + my $dt = $t1-$t2-$$map->{time_in_suspended_cleaning}-$$map->{time_in_error}-$$map->{time_in_pause}; + my $dc = $$map->{run_charge_at_start}-$$map->{run_charge_at_end}; + my $expa = int($$map->{cleaned_area}*100/$dc+.5) if ($dc > 0); + my $expt = int($dt*100/$dc/60+.5) if ($dc > 0); + $ret .= ''; + $ret .= ' '; # Map No. + $ret .= ' '; # Expected Area + $ret .= ' '; # Expected Time + $ret .= ' '; # Map Area + $ret .= ' '; # Map Time + $ret .= ' '; # Charge Delta + $ret .= ' '; # Discharge Speed + $ret .= ' '; # Area Speed + $ret .= ' '; # Cleaning Category + $ret .= ' '; # Cleaning Mode + $ret .= ' '; # Cleaning Frequency + $ret .= ' '; # Charge During Run + $ret .= ' '; # Status + $ret .= ' '; # Date + $ret .= ''; + } + $ret .= '
Report: '.ReadingsVal($name,"name","name").', '.InternalVal($name,"VENDOR","VENDOR").', '.ReadingsVal($name,"model","model").'
MapExpectedMapMapChargeDischargeAreaCleaningChargeStatusDateTime
No.AreaTimeAreaTimeDeltaSpeedSpeedCat.ModeFreq.During
qmminqmmin%%/minqm/minRunYYYY-MM-DD hh:mm:ss
'.($i+1).''.($expa>0?$expa:0).''.($expt>0?$expt:0).''.int($$map->{cleaned_area}+.5).''.(($dt>0)?(int($dt/60+.5)):0).''.($dc>0?$dc:0).''.(($dt>0 and $dc>0)?(int($dc*600/$dt+.5)/10):0).''.(($expt>0 and $expa>0)?(int($expa*10/$expt+.5))/10:0).''.GetCategoryText($$map->{category}).''.GetModeText($$map->{mode}).''.GetModifierText($$map->{modifier}).''.$$map->{suspended_cleaning_charging_count}.'x'.$$map->{status}.''.GetTimeFromString($$map->{generated_at}).'
'; + $ret .= "

Manufacturer Specification:
"; + $ret .= "Neato Botvac D3 Connected, up to 60 qm
"; + $ret .= "Neato Botvac D4 Connected, up to 75 qm
"; + $ret .= "Neato Botvac D5 Connected, up to 90 qm
"; + $ret .= "Neato Botvac D6/D7 Connected, up to 120 qm
"; + $ret .= "Vorwerk VR200, battery 84 Wh, eco (90 min, 120 qm, power 50 W), turbo (60 min, 90 qm, power 70 W)
"; + $ret .= "Vorwerk VR220(VR300), battery 84 Wh, eco (90 min, 120 qm, power 65 W), turbo (60 min, 90 qm, power 85 W)
"; + $ret .= ''; + + return $ret; +} + ####################################### # Websocket Functions #######################################