Unit.pm: add decimal mark support

git-svn-id: https://svn.fhem.de/fhem/trunk@12677 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2016-11-27 16:34:00 +00:00
parent b309c0a76a
commit fa5c50cd0e
2 changed files with 227 additions and 81 deletions

View File

@ -445,17 +445,6 @@ sub values2weathercondition($$$$$) {
return $condition; return $condition;
} }
#################################
### Logfile integer conversions
###
sub activity2log($) {
my ($data) = @_;
return "1" if ( $data =~ /^(alive|ok)$/i );
return "0";
}
#TODO rewrite for Unit.pm #TODO rewrite for Unit.pm
sub fmtTime($) { sub fmtTime($) {
my ($value) = @_; my ($value) = @_;
@ -478,6 +467,21 @@ sub fmtTime($) {
#################### ####################
# HELPER FUNCTIONS # HELPER FUNCTIONS
sub decimal_mark ($$) {
my ( $v, $f ) = @_;
return $v unless ( looks_like_number($v) && $f );
my $text = reverse $v;
if ( $f eq "2" ) {
$text =~ s:\.:,:g;
$text =~ s/(\d\d\d)(?=\d)(?!\d*,)/$1./g;
}
else {
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
}
return scalar reverse $text;
}
sub roundX($;$) { sub roundX($;$) {
my ( $v, $n ) = @_; my ( $v, $n ) = @_;
$n = 1 if ( !$n ); $n = 1 if ( !$n );

View File

@ -147,8 +147,12 @@ my $rtype_base = {
de => 'Länge', de => 'Länge',
en => 'length', en => 'length',
}, },
format => '%.0f', format => '%.0f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
1 => { 1 => {
@ -159,8 +163,12 @@ my $rtype_base = {
de => 'Masse', de => 'Masse',
en => 'mass', en => 'mass',
}, },
format => '%.0f', format => '%.0f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
2 => { 2 => {
@ -171,8 +179,12 @@ my $rtype_base = {
de => 'Zeit', de => 'Zeit',
en => 'time', en => 'time',
}, },
format => '%.0f', format => '%.0f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
3 => { 3 => {
@ -183,8 +195,12 @@ my $rtype_base = {
de => 'elektrische Stromstärke', de => 'elektrische Stromstärke',
en => 'electric current', en => 'electric current',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
4 => { 4 => {
@ -195,8 +211,12 @@ my $rtype_base = {
de => 'absolute Temperatur', de => 'absolute Temperatur',
en => 'absolute temperature', en => 'absolute temperature',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
5 => { 5 => {
@ -207,8 +227,12 @@ my $rtype_base = {
de => 'Stoffmenge', de => 'Stoffmenge',
en => 'amount of substance', en => 'amount of substance',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
6 => { 6 => {
@ -219,8 +243,12 @@ my $rtype_base = {
de => 'Lichtstärke', de => 'Lichtstärke',
en => 'luminous intensity', en => 'luminous intensity',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
7 => { 7 => {
@ -231,8 +259,12 @@ my $rtype_base = {
de => 'Energie', de => 'Energie',
en => 'energy', en => 'energy',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
8 => { 8 => {
@ -243,8 +275,12 @@ my $rtype_base = {
de => 'Frequenz', de => 'Frequenz',
en => 'frequency', en => 'frequency',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
9 => { 9 => {
@ -255,8 +291,12 @@ my $rtype_base = {
de => 'Leistung', de => 'Leistung',
en => 'power', en => 'power',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
10 => { 10 => {
@ -267,8 +307,12 @@ my $rtype_base = {
de => 'Druck', de => 'Druck',
en => 'pressure', en => 'pressure',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
11 => { 11 => {
@ -279,8 +323,12 @@ my $rtype_base = {
de => 'absoluter Druck', de => 'absoluter Druck',
en => 'absolute pressure', en => 'absolute pressure',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
12 => { 12 => {
@ -291,8 +339,12 @@ my $rtype_base = {
de => 'Luftdruck', de => 'Luftdruck',
en => 'air pressure', en => 'air pressure',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
13 => { 13 => {
@ -303,8 +355,12 @@ my $rtype_base = {
de => 'elektrische Spannung', de => 'elektrische Spannung',
en => 'electric voltage', en => 'electric voltage',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
14 => { 14 => {
@ -315,8 +371,12 @@ my $rtype_base = {
de => 'ebener Winkel', de => 'ebener Winkel',
en => 'plane angular', en => 'plane angular',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
15 => { 15 => {
@ -327,8 +387,12 @@ my $rtype_base = {
de => 'Geschwindigkeit', de => 'Geschwindigkeit',
en => 'speed', en => 'speed',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
16 => { 16 => {
@ -339,8 +403,12 @@ my $rtype_base = {
de => 'Beleuchtungsstärke', de => 'Beleuchtungsstärke',
en => 'illumination intensity', en => 'illumination intensity',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
17 => { 17 => {
@ -351,8 +419,12 @@ my $rtype_base = {
de => 'Lichtstrom', de => 'Lichtstrom',
en => 'luminous flux', en => 'luminous flux',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
18 => { 18 => {
@ -363,8 +435,12 @@ my $rtype_base = {
de => 'Volumen', de => 'Volumen',
en => 'volume', en => 'volume',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
19 => { 19 => {
@ -375,8 +451,12 @@ my $rtype_base = {
de => 'Logarithmische Größe', de => 'Logarithmische Größe',
en => 'logarithmic level', en => 'logarithmic level',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
20 => { 20 => {
@ -387,8 +467,12 @@ my $rtype_base = {
de => 'elektrische Ladung', de => 'elektrische Ladung',
en => 'electric charge', en => 'electric charge',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
21 => { 21 => {
@ -399,8 +483,12 @@ my $rtype_base = {
de => 'elektrische Kapazität', de => 'elektrische Kapazität',
en => 'electric capacity', en => 'electric capacity',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
22 => { 22 => {
@ -411,8 +499,12 @@ my $rtype_base = {
de => 'elektrische Widerstand', de => 'elektrische Widerstand',
en => 'electric resistance', en => 'electric resistance',
}, },
format => '%.1f', format => '%.1f',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
23 => { 23 => {
@ -423,8 +515,12 @@ my $rtype_base = {
de => 'Flächeninhalt', de => 'Flächeninhalt',
en => 'surface area', en => 'surface area',
}, },
format => '%i', format => '%i',
scope => { min => 0 }, decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
}, },
24 => { 24 => {
@ -432,8 +528,12 @@ my $rtype_base = {
de => 'Währung', de => 'Währung',
en => 'currency', en => 'currency',
}, },
format => '%.2f', format => '%.2f',
scope => '^[0-9]*(?:\.[0-9]*)?$', decimal_mark => {
de => 2,
en => 1,
},
scope => '^[0-9]*(?:\.[0-9]*)?$',
}, },
25 => { 25 => {
@ -441,6 +541,11 @@ my $rtype_base = {
de => 'Zahlen', de => 'Zahlen',
en => 'Numbering', en => 'Numbering',
}, },
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
tmpl => '%value%', tmpl => '%value%',
}, },
@ -1242,13 +1347,24 @@ my $rtypes = {
}, },
# currency # currency
#https://en.wikipedia.org/wiki/Euro
#https://en.wikipedia.org/wiki/Linguistic_issues_concerning_the_euro
euro => { euro => {
ref_base => 24, ref_base => 24,
format => '%.2f', format => '%.2f',
symbol => '€', symbol => '€',
suffix => 'EUR', suffix => 'EUR',
txt => 'Euro', txt => {
scope => '^([0-9]*(?:\.[0-9]*)?)$', de => 'Euro',
en => 'euro',
},
tmpl => {
de => '%symbol%%value%',
de_de => '%value%' . chr(0x202F) . '%symbol%',
en => '%symbol%%value%',
},
scope => '^([0-9]*(?:\.[0-9]*)?)$',
}, },
pound_uk => { pound_uk => {
@ -1258,15 +1374,15 @@ my $rtypes = {
suffix => 'GBP', suffix => 'GBP',
txt => { txt => {
de => 'Pfund', de => 'Pfund',
en => 'Pound', en => 'pound',
}, },
txt_long => { txt_long => {
de => 'Britisches Pfund', de => 'Britisches Pfund',
en => 'British Pound', en => 'British pound',
}, },
txt_long_pl => { txt_long_pl => {
de => 'Britische Pfund', de => 'Britische Pfund',
en => 'British Pound', en => 'British pound',
}, },
tmpl => '%symbol%%value%', tmpl => '%symbol%%value%',
tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%', tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%',
@ -1274,12 +1390,18 @@ my $rtypes = {
}, },
dollar_us => { dollar_us => {
ref_base => 24, ref_base => 24,
format => '%.2f', format => '%.2f',
symbol => '$', symbol => '$',
suffix => 'USD', suffix => 'USD',
txt => 'Dollar', txt => {
txt_long => 'US Dollar', de => 'Dollar',
en => 'dollar',
},
txt_long => {
de => 'US Dollar',
en => 'US dollar',
},
tmpl => '%symbol%%value%', tmpl => '%symbol%%value%',
tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%', tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%',
scope => '^([0-9]*(?:\.[0-9]*)?)$', scope => '^([0-9]*(?:\.[0-9]*)?)$',
@ -2467,8 +2589,10 @@ sub replaceTemplate ($$$$;$) {
return return
if ( !$odesc || ref($odesc) ne "HASH" ); if ( !$odesc || ref($odesc) ne "HASH" );
$value = $odesc->{value} $value = ${$odesc}{value}{$lang}
if ( !defined($value) && defined( $odesc->{value} ) ); if (!defined($value)
&& defined( $odesc->{value} )
&& defined( $odesc->{value}{$lang} ) );
return $value return $value
if ( !defined($value) || $value eq "" ); if ( !defined($value) || $value eq "" );
@ -2485,15 +2609,26 @@ sub replaceTemplate ($$$$;$) {
# keep only defined language if set # keep only defined language if set
foreach ( keys %{$desc} ) { foreach ( keys %{$desc} ) {
if ( defined( $desc->{$_} ) next if ( !defined( $desc->{$_} )
&& ref( $desc->{$_} ) eq "HASH" || ref( $desc->{$_} ) ne "HASH" );
&& defined( $desc->{$_}{$l} ) )
{ # find any direct format
if ( defined( $desc->{$_}{$l} ) ) {
my $v; my $v;
$v = $desc->{$_}{$l}; $v = $desc->{$_}{$l};
delete $desc->{$_}; delete $desc->{$_};
$desc->{$_} = $v if ( defined($v) ); $desc->{$_} = $v if ( defined($v) );
} }
# extract xx from xx_yz formats
elsif ( $l =~ /^([a-z]+)(_([a-z]+))?$/i
&& defined( $desc->{$_}{$1} ) )
{
my $v;
$v = $desc->{$_}{$1};
delete $desc->{$_};
$desc->{$_} = $v if ( defined($v) );
}
} }
# handle textual types after language normalisation # handle textual types after language normalisation
@ -2604,7 +2739,10 @@ sub replaceTemplate ($$$$;$) {
} }
} }
foreach my $k ( keys %{$desc} ) { foreach my $k ( keys %{$desc} ) {
$txt =~ s/%$k%/$desc->{$k}/g; my $vdm = $desc->{$k};
$vdm = UConv::decimal_mark( $vdm, $desc->{decimal_mark} )
if ( defined( $desc->{decimal_mark} ) );
$txt =~ s/%$k%/$vdm/g;
} }
return ($txt) if ( !wantarray ); return ($txt) if ( !wantarray );
@ -2646,7 +2784,10 @@ sub replaceTemplate ($$$$;$) {
} }
} }
foreach my $k ( keys %{$desc} ) { foreach my $k ( keys %{$desc} ) {
$txt_long =~ s/%$k%/$desc->{$k}/g; my $vdm = $desc->{$k};
$vdm = UConv::decimal_mark( $vdm, $desc->{decimal_mark} )
if ( defined( $desc->{decimal_mark} ) );
$txt_long =~ s/%$k%/$vdm/g;
} }
} }
@ -2875,7 +3016,8 @@ sub formatValue($$$;$$$$) {
$desc->{value}{$lang} = $value; $desc->{value}{$lang} = $value;
$desc->{value_num} = $value_num if ( defined($value_num) ); $desc->{value_num} = $value_num if ( defined($value_num) );
my ( $txt, $txt_long ) = replaceTemplate( $device, $reading, $desc, $lang ); my ( $txt, $txt_long ) =
replaceTemplate( $device, $reading, $desc, $lang, $value );
$desc->{value_txt}{$lang} = $txt; $desc->{value_txt}{$lang} = $txt;
$desc->{value_txt_long}{$lang} = $txt_long if ( defined($txt_long) ); $desc->{value_txt_long}{$lang} = $txt_long if ( defined($txt_long) );