From 1391b590302b2e3052254f07afa387aabec299af Mon Sep 17 00:00:00 2001 From: Sailor <> Date: Mon, 9 Mar 2020 09:37:07 +0000 Subject: [PATCH] 73_WaterCalculator: New set command to synchronize Counters git-svn-id: https://svn.fhem.de/fhem/trunk@21391 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/73_WaterCalculator.pm | 100 +++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 20 deletions(-) diff --git a/fhem/FHEM/73_WaterCalculator.pm b/fhem/FHEM/73_WaterCalculator.pm index dfc6ac748..a3fbfd442 100644 --- a/fhem/FHEM/73_WaterCalculator.pm +++ b/fhem/FHEM/73_WaterCalculator.pm @@ -267,31 +267,41 @@ sub WaterCalculator_Get($@) ### If not enough arguments have been provided if ( @a < 2 ) { - return "\"get WaterCalculator\" needs at least one argument"; + return "\"set WaterCalculator\" needs at least one argument"; } my $WaterCalcName = shift @a; my $reading = shift @a; - my $value; + my $value = join(" ", @a); my $ReturnMessage; + my @cList; - if(!defined($hash->{helper}{gets}{$reading})) - { - my @cList = keys %{$hash->{helper}{gets}}; - return "Unknown argument $reading, choose one of " . join(" ", @cList); + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. "_Get - reading : " . $reading; + Log3 $WaterCalcName, 5, $WaterCalcName. "_Get - value : " . $value; - ### Create Log entries for debugging - Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - get list: " . join(" ", @cList); + + if(defined($hash->{READINGS})) { + push(@cList, " "); + push(@cList, keys(%{$hash->{READINGS}})); } + else { + push(@cList, " "); + } + + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - set list: " . join(" ", @cList); + + return "Unknown argument $reading, choose one of " . join(" ", @cList) if $reading eq '?'; if ( $reading ne "?") { ### Write current value $value = ReadingsVal($WaterCalcName, $reading, undef); - + ### Create Log entries for debugging Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - get " . $reading . " with value: " . $value; - + ### Create ReturnMessage $ReturnMessage = $value; } @@ -315,17 +325,65 @@ sub WaterCalculator_Set($@) my $reading = shift @a; my $value = join(" ", @a); my $ReturnMessage; + my @cList; - if(!defined($hash->{helper}{gets}{$reading})) - { - my @cList = keys %{$hash->{helper}{sets}}; - return "Unknown argument $reading, choose one of " . join(" ", @cList); + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. "_Set - reading : " . $reading; + Log3 $WaterCalcName, 5, $WaterCalcName. "_Set - value : " . $value; - ### Create Log entries for debugging - Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - set list: " . join(" ", @cList); - } - if ( $reading ne "?") + if(defined($hash->{READINGS})) { + push(@cList, "SyncCounter"); + push(@cList, keys(%{$hash->{READINGS}})); + } + else { + push(@cList, "SyncCounter"); + } + + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - set list: " . join(" ", @cList); + + return "Unknown argument $reading, choose one of " . join(" ", @cList) if $reading eq '?'; + + ### If the command supposed to synchronize the CounterValues between CounterModule and CalculatorModule + if ($reading eq "SyncCounter") { + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. " - Syncing Counter with :" . $value; + + ### Sreach for the ReadingsName of the Current CounterValue + my @SearchResult = grep(/_CounterCurrent/, @cList); + + ### Get current CalculatorValue + my $CalculaterValueCurrent = ReadingsVal($WaterCalcName, $SearchResult[0], 0); + + ### Get current Offset from Attribute + my $CounterOffsetCurrent = AttrVal($WaterCalcName, "WaterCounterOffset", 0); + + ### Calculate CounterValue + my $CounterValueCurrent = $CalculaterValueCurrent - $CounterOffsetCurrent; + + ### Calculate new Offset + my $CounterOffsetNew = $value - $CounterValueCurrent; + + ### Calculate Ceck +# my $CounterValueNew = $CounterValueCurrent + $CounterOffsetNew; + + ### Create Log entries for debugging + Log3 $WaterCalcName, 5, $WaterCalcName. " - Search Result : " . Dumper(@SearchResult); + Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterValueNew Given : " . $value; + Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterValueCurrent Result : " . $CalculaterValueCurrent; + Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterOffsetCurrent Result : " . $CounterOffsetCurrent; + Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterValueCurrent Result : " . $CounterValueCurrent; + Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterOffsetNew Result : " . $CounterOffsetNew; +# Log3 $WaterCalcName, 5, $WaterCalcName. " - CounterValueNew Check : " . $CounterValueNew; + + ### Set new Offset in Attributes + $attr{$WaterCalcName}{WaterCounterOffset} = $CounterOffsetNew; + + ### Create ReturnMessage + $ReturnMessage = $WaterCalcName . " - Successfully synchromized Counter and Calculator with : " . $value . " kWh"; + } + elsif ($reading ne "?") { ### Create Log entries for debugging Log3 $WaterCalcName, 5, $WaterCalcName. " : WaterCalculator - set " . $reading . " with value: " . $value; @@ -959,8 +1017,9 @@ sub WaterCalculator_Notify($$) @@ -1477,8 +1536,9 @@ sub WaterCalculator_Notify($$)