From f8b4cc54c7af26aa6e71a67e9ecd10647857ba53 Mon Sep 17 00:00:00 2001 From: Adimarantis <> Date: Tue, 25 May 2021 19:44:31 +0000 Subject: [PATCH] I2C_ADS1x1x: Added Average function, fixed doc tags git-svn-id: https://svn.fhem.de/fhem/trunk@24512 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/52_I2C_ADS1x1x.pm | 102 +++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/fhem/FHEM/52_I2C_ADS1x1x.pm b/fhem/FHEM/52_I2C_ADS1x1x.pm index 1f004e084..9e792022e 100755 --- a/fhem/FHEM/52_I2C_ADS1x1x.pm +++ b/fhem/FHEM/52_I2C_ADS1x1x.pm @@ -13,6 +13,7 @@ use strict; use warnings; use SetExtensions; use Scalar::Util qw(looks_like_number); +use List::Util qw(sum); my %I2C_ADS1x1x_Config = ( @@ -105,6 +106,7 @@ sub I2C_ADS1x1x_Initialize($) { "a3_mode:RTD,NTC,RAW,RES,off ". "a0_res a1_res a2_res a3_res ". "a0_r0 a1_r0 a2_r0 a3_r0 ". + "a0_avg a1_avg a2_avg a3_avg ". "a0_bval a1_bval a2_bval a3_bval ". "a0_gain:6V,4V,2V,1V,0.5V,0.25V ". "a1_gain:6V,4V,2V,1V,0.5V,0.25V ". @@ -417,10 +419,23 @@ sub I2C_ADS1x1x_I2CRec($@) { # ueber CallFn vom physical aufgerufen ( $refvoltage/$mask) * # normiere anhand der Auflösung 2^15 im positiven Bereich ( 1.0 - (2.0 * (($value & ($mask+1)) >> ($bits-1)))); # bei gesetzten Bit 2^15 Faktor -1, ansonsten +1 ($mask+1 = 0x8000/0x800) + my $sensor= $clientmsg->{sensor}; + + #Build average with floating windows to smoothe shaky sensors + my @avg=(); + my $avgs=$hash->{helper}{"a".$sensor}; + if (defined $avgs) { + @avg=@$avgs; + } + my $avgmax=AttrVal($name,"a".$sensor."_avg",1); + push @avg,$voltage; + while (@avg>$avgmax) { shift @avg; } + $hash->{helper}{"a".$sensor}=[@avg]; + $voltage=sum(@avg)/@avg; + #rounded voltage only for reading, continue calculation will full precision my $voltager = sprintf( '%.' . AttrVal($clientHash->{NAME}, 'decimals', 3) . 'f', $voltage ); Log3 $hash,5 , "$name:voltage=$voltage, ref=".$I2C_ADS1x1x_Config{'Gain'}{$gain}{refVoltage}; - my $sensor= $clientmsg->{sensor}; readingsBulkUpdate($hash, "a".$sensor."_voltage", $voltager) if (ReadingsVal($name,"a".$sensor."_voltage",0) != $voltager); my $divider=AttrVal($name,"a".$sensor."_res",1000); my $highvoltage=AttrVal($name,"sys_voltage",3.3); @@ -458,11 +473,10 @@ sub I2C_ADS1x1x_I2CRec($@) { # ueber CallFn vom physical aufgerufen =item summary_DE liest/konvertiert Daten eines via angeschlossenen ADS1x1x A/D Wandlers =begin html -

I2C_ADS1x1x

(en | de)