From 74611e811f71195ba95a2cc85ea73c58944a9700 Mon Sep 17 00:00:00 2001 From: Sailor <> Date: Mon, 9 Mar 2020 09:37:30 +0000 Subject: [PATCH] 73_GasCalculator: New set command to synchronize Counters git-svn-id: https://svn.fhem.de/fhem/trunk@21392 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/73_GasCalculator.pm | 108 ++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 24 deletions(-) diff --git a/fhem/FHEM/73_GasCalculator.pm b/fhem/FHEM/73_GasCalculator.pm index cff3d3dc4..c00f25477 100644 --- a/fhem/FHEM/73_GasCalculator.pm +++ b/fhem/FHEM/73_GasCalculator.pm @@ -198,7 +198,7 @@ sub GasCalculator_Attr(@) ####END####### Handle attributes after changes via fhem GUI ####################################################END##### -###START###### Manipulate reading after "set" command by fhem #################################################START#### +###START###### Manipulate reading after "get" command by fhem #################################################START#### sub GasCalculator_Get($@) { my ( $hash, @a ) = @_; @@ -206,38 +206,48 @@ sub GasCalculator_Get($@) ### If not enough arguments have been provided if ( @a < 2 ) { - return "\"get GasCalculator\" needs at least one argument"; + return "\"set GasCalculator\" needs at least one argument"; } my $GasCalcName = shift @a; my $reading = shift @a; - my $value; + my $value = join(" ", @a); my $ReturnMessage; + my @cList; - if(!defined($GasCalculator_gets{$reading})) - { - my @cList = keys %GasCalculator_sets; - return "Unknown argument $reading, choose one of " . join(" ", @cList); + ### Create Log entries for debugging + Log3 $GasCalcName, 5, $GasCalcName. "_Get - reading : " . $reading; + Log3 $GasCalcName, 5, $GasCalcName. "_Get - value : " . $value; - ### Create Log entries for debugging - Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - get list: " . join(" ", @cList); + + if(defined($hash->{READINGS})) { + push(@cList, " "); + push(@cList, keys(%{$hash->{READINGS}})); } + else { + push(@cList, " "); + } + + ### Create Log entries for debugging + Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - set list: " . join(" ", @cList); + + return "Unknown argument $reading, choose one of " . join(" ", @cList) if $reading eq '?'; if ( $reading ne "?") { - ### Create Log entries for debugging - Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - get " . $reading . " with value: " . $value; - ### Write current value $value = ReadingsVal($GasCalcName, $reading, undef); - + + ### Create Log entries for debugging + Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - get " . $reading . " with value: " . $value; + ### Create ReturnMessage $ReturnMessage = $value; } return($ReturnMessage); } -####END####### Manipulate reading after "set" command by fhem ##################################################END##### +####END####### Manipulate reading after "get" command by fhem ##################################################END##### ###START###### Manipulate reading after "set" command by fhem #################################################START#### sub GasCalculator_Set($@) @@ -254,17 +264,65 @@ sub GasCalculator_Set($@) my $reading = shift @a; my $value = join(" ", @a); my $ReturnMessage; + my @cList; - if(!defined($GasCalculator_sets{$reading})) - { - my @cList = keys %GasCalculator_sets; - return "Unknown argument $reading, choose one of " . join(" ", @cList); + ### Create Log entries for debugging + Log3 $GasCalcName, 5, $GasCalcName. "_Set - reading : " . $reading; + Log3 $GasCalcName, 5, $GasCalcName. "_Set - value : " . $value; - ### Create Log entries for debugging - Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - 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 $GasCalcName, 5, $GasCalcName. " : GasCalculator - 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 $GasCalcName, 5, $GasCalcName. " - Syncing Counter with :" . $value; + + ### Sreach for the ReadingsName of the Current CounterValue + my @SearchResult = grep(/_CounterCurrent/, @cList); + + ### Get current CalculatorValue + my $CalculaterValueCurrent = ReadingsVal($GasCalcName, $SearchResult[0], 0); + + ### Get current Offset from Attribute + my $CounterOffsetCurrent = AttrVal($GasCalcName, "GasCounterOffset", 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 $GasCalcName, 5, $GasCalcName. " - Search Result : " . Dumper(@SearchResult); + Log3 $GasCalcName, 5, $GasCalcName. " - CounterValueNew Given : " . $value; + Log3 $GasCalcName, 5, $GasCalcName. " - CounterValueCurrent Result : " . $CalculaterValueCurrent; + Log3 $GasCalcName, 5, $GasCalcName. " - CounterOffsetCurrent Result : " . $CounterOffsetCurrent; + Log3 $GasCalcName, 5, $GasCalcName. " - CounterValueCurrent Result : " . $CounterValueCurrent; + Log3 $GasCalcName, 5, $GasCalcName. " - CounterOffsetNew Result : " . $CounterOffsetNew; +# Log3 $GasCalcName, 5, $GasCalcName. " - CounterValueNew Check : " . $CounterValueNew; + + ### Set new Offset in Attributes + $attr{$GasCalcName}{GasCounterOffset} = $CounterOffsetNew; + + ### Create ReturnMessage + $ReturnMessage = $GasCalcName . " - Successfully synchromized Counter and Calculator with : " . $value . " kWh"; + } + elsif ($reading ne "?") { ### Create Log entries for debugging Log3 $GasCalcName, 5, $GasCalcName. " : GasCalculator - set " . $reading . " with value: " . $value; @@ -916,8 +974,9 @@ sub GasCalculator_Notify($$)
set
- command.set
- Befehl gesetzt werden.