From 5c1cb14573c7ef93cf275768d892f8fce9ed93e7 Mon Sep 17 00:00:00 2001 From: timmib <> Date: Mon, 7 Feb 2022 19:39:46 +0000 Subject: [PATCH] 93_InfluxDBLogger.pm: string and original timestamp support git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@25650 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/93_InfluxDBLogger.pm | 148 +++++++++++++++++++++++++++++--------- 1 file changed, 115 insertions(+), 33 deletions(-) diff --git a/FHEM/93_InfluxDBLogger.pm b/FHEM/93_InfluxDBLogger.pm index 711afb013..21920d9ca 100644 --- a/FHEM/93_InfluxDBLogger.pm +++ b/FHEM/93_InfluxDBLogger.pm @@ -1,4 +1,4 @@ -# $Id$ +# $Id$ # 93_InfluxDBLogger.pm # package main; @@ -23,7 +23,7 @@ sub InfluxDBLogger_Initialize($) { $hash->{NotifyFn} = "InfluxDBLogger_Notify"; $hash->{SetFn} = "InfluxDBLogger_Set"; $hash->{RenameFn} = "InfluxDBLogger_Rename"; - $hash->{AttrList} = "disable:1,0 security:basic_auth,none,token username readingInclude readingExclude conversions deviceTagName measurement tags fields api:v1,v2 org precision:ms,s,us,ns " . $readingFnAttributes; + $hash->{AttrList} = "readingTimeStamps:1,0 stringValuesAllowed:1,0 disable:1,0 security:basic_auth,none,token username readingInclude readingExclude conversions deviceTagName measurement tags fields api:v1,v2 org precision:ms,s,us,ns " . $readingFnAttributes; Log3 undef, 2, "InfluxDBLogger: Initialized new"; } @@ -159,10 +159,11 @@ sub InfluxDBLogger_BuildMap($$$) my $devName = $dev_hash->{NAME}; my %map = (); + my $readingInclude = AttrVal($name, "readingInclude", undef); + my $readingExclude = AttrVal($name, "readingExclude", undef); + foreach my $event (@{$events}) { $event = "" if(!defined($event)); - my $readingInclude = AttrVal($name, "readingInclude", undef); - my $readingExclude = AttrVal($name, "readingExclude", undef); if ( (!defined($readingInclude) || $event =~ /$readingInclude/) && (!defined($readingExclude) || !($event =~ /$readingExclude/)) ) { Log3 $name, 4, "InfluxDBLogger: [$name] notified from device $devName about $event"; InfluxDBLogger_Map($own_hash, $dev_hash, $event, \%map); @@ -177,49 +178,79 @@ sub InfluxDBLogger_BuildData($$$$) my ($own_hash, $dev_hash, $map, $incompatible) = @_; my $name = $own_hash->{NAME}; my $data = ""; + my $stringValuesAllowed = AttrVal($name, "stringValuesAllowed", 0); my $rows = 0; my %m = %{$map}; - my %measuremnts = (); - foreach my $device (keys %m) { - my $readings = $m{$device}; - my %r = %{$readings}; - foreach my $reading (keys %r) { - my $value_map = $r{$reading}; - my $value = $value_map->{"value"}; - my $numeric = $value_map->{"numeric"}; - if ($numeric) { - my ($measurementAndTagSet,$fieldset) = InfluxDBLogger_BuildDataDynamic($own_hash, $dev_hash, $device, $reading, $value); - if (defined $measuremnts{$measurementAndTagSet}) { - $measuremnts{$measurementAndTagSet} .= "," . $fieldset; - } else { - $measuremnts{$measurementAndTagSet} = $fieldset; + + my $readingTimeStamps = AttrVal($name, "readingTimeStamps", 0); + + if ($readingTimeStamps) { + foreach my $device (keys %m) { + my $readings = $m{$device}; + my %r = %{$readings}; + foreach my $reading (keys %r) { + my $value_map = $r{$reading}; + my $value = $value_map->{"value"}; + my $numeric = $value_map->{"numeric"}; + if (($numeric) || ($stringValuesAllowed)) { + my ($measurementAndTagSet,$fieldset,$timestamp) = InfluxDBLogger_BuildDataDynamic($own_hash, $dev_hash, $device, $reading, $value, $numeric); + $data .= $measurementAndTagSet . " " . $fieldset; + if(defined($timestamp)) { + $data .= " " . $timestamp ."000000000" # nanoseconds + } + $data .= "\n"; + $rows++; + } + else { + push(@{$incompatible}, $device ." ". $reading . " " . $value); } - $rows++; - } - else { - push(@{$incompatible}, $device ." ". $reading . " " . $value); } } } - foreach my $measurementAndTagSet ( keys %measuremnts ) { - $data .= $measurementAndTagSet . " " . $measuremnts{$measurementAndTagSet} . "\n"; + else { + my %measuremnts = (); + foreach my $device (keys %m) { + my $readings = $m{$device}; + my %r = %{$readings}; + foreach my $reading (keys %r) { + my $value_map = $r{$reading}; + my $value = $value_map->{"value"}; + my $numeric = $value_map->{"numeric"}; + if (($numeric) || ($stringValuesAllowed)) { + my ($measurementAndTagSet,$fieldset,$timestamp) = InfluxDBLogger_BuildDataDynamic($own_hash, $dev_hash, $device, $reading, $value, $numeric); + if (defined $measuremnts{$measurementAndTagSet}) { + $measuremnts{$measurementAndTagSet} .= "," . $fieldset; + } else { + $measuremnts{$measurementAndTagSet} = $fieldset; + } + $rows++; + } + else { + push(@{$incompatible}, $device ." ". $reading . " " . $value); + } + } + } + foreach my $measurementAndTagSet ( keys %measuremnts ) { + $data .= $measurementAndTagSet . " " . $measuremnts{$measurementAndTagSet} . "\n"; + } } return $data, $rows; } -sub InfluxDBLogger_BuildDataDynamic($$$$$) +sub InfluxDBLogger_BuildDataDynamic($$$$$$) { - my ($hash, $dev_hash, $device, $reading, $value) = @_; + my ($hash, $dev_hash, $device, $reading, $value, $numeric) = @_; my $name = $hash->{NAME}; my $measurement = InfluxDBLogger_GetMeasurement($hash, $dev_hash, $device, $reading, $value); my $tag_set = InfluxDBLogger_GetTagSet($hash, $dev_hash, $device, $reading, $value); - my $field_set = InfluxDBLogger_GetFieldSet($hash, $dev_hash, $device, $reading, $value); + my $field_set = InfluxDBLogger_GetFieldSet($hash, $dev_hash, $device, $reading, $value, $numeric); + my $timestamp = InfluxDBLogger_GetTimeStamp($hash, $dev_hash, $device, $reading, $value); my $measurementAndTagSet = defined $tag_set ? $measurement . "," . $tag_set : $measurement; - return ($measurementAndTagSet,$field_set); + return ($measurementAndTagSet,$field_set,$timestamp); } sub InfluxDBLogger_GetMeasurement($$$$$) @@ -260,18 +291,42 @@ sub InfluxDBLogger_GetTagSet($$$$$) return $tags_set; } -sub InfluxDBLogger_GetFieldSet($$$$$) +sub InfluxDBLogger_GetFieldSet($$$$$$) { - my ($hash, $dev_hash, $device, $reading, $value) = @_; + my ($hash, $dev_hash, $device, $reading, $value, $numeric) = @_; my $name = $hash->{NAME}; my $field_set = AttrVal($name, "fields", "value=\$READINGVALUE"); $field_set =~ s/\$READINGNAME/$reading/ei; + if (!$numeric) { + $value = "\"" . $value . "\"" + } $field_set =~ s/\$READINGVALUE/$value/ei; return $field_set; } +sub InfluxDBLogger_GetTimeStamp($$$$$) +{ + my ($hash, $dev_hash, $device, $reading, $value) = @_; + my $name = $hash->{NAME}; + + my $readingTimeStamps = AttrVal($name, "readingTimeStamps", 0); + my $timeStamp = undef; + if ($readingTimeStamps) { + my $readingsTimestamp = ReadingsTimestamp($device, $reading,undef); + if(defined($readingsTimestamp)) + { + my $readingsTimestampNum = time_str2num($readingsTimestamp); + # ?? $timeStamp= $readingsTimestampNum+-2208992400 + $timeStamp=$readingsTimestampNum + } + } + + + return $timeStamp; +} + sub InfluxDBLogger_BuildUrl($) { my ($hash) = @_; @@ -303,7 +358,7 @@ sub InfluxDBLogger_Map($$$$) my ($hash, $dev_hash, $event, $map) = @_; my $name = $hash->{NAME}; my $deviceName = $dev_hash->{NAME}; - my @readingAndValue = split(":[ \t]*", $event); + my @readingAndValue = split(":[ \t]*", $event, 2); my $readingName = $readingAndValue[0]; my $readingValue = $readingAndValue[1]; @@ -610,7 +665,7 @@ sub InfluxDBLogger_Rename($$) { Sets all statistical counters to zero and removes the last error message.
set <name> set
set <name> write
attr <name> conversions <conv1,conv2>
attr <name> measurement <string>
attr <name> precision [ms|s|us|ns]
attr <name> stringValuesAllowed [0|1]
attr <name> readingTimeStamps [0|1]
set <name> set
set <name> write
attr <name> conversions <conv1,conv2>
attr <name> measurement <string>
attr <name> precision [ms|s|us|ns]
attr <name> stringValuesAllowed [0|1]
attr <name> readingTimeStamps [0|1]