2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-20 19:36:02 +00:00

47_OBIS: Fixed a glitch in signed-calcs (Thx to immi)

git-svn-id: https://svn.fhem.de/fhem/trunk@11315 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
icinger 2016-04-26 18:39:48 +00:00
parent d5f06a54b9
commit b0e359f672

View File

@ -212,6 +212,7 @@ sub OBIS_trySMLdecode($$)
my $telegramm = $&;
my @list=$telegramm=~/(7707)([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2,999})/g;
Log 5,"Telegram=$telegramm";
if (!@list) {Log 3,"OBIS - Empty datagram: .$telegramm\r\nfrom MSG: $msg"};
my $line=hex($list[1])."-".hex($list[2]).":".hex($list[3]).".".hex($list[4]).".".hex($list[5])."*255(";
my ($status,$statusL,$statusT,$valTime,$valTimeL,$valTimeT,$unit,$unitL,$unitT,$scaler,$scalerL,$scalerT,$data,$dataL,$dataT,$other);
@ -256,20 +257,15 @@ sub OBIS_trySMLdecode($$)
$line2.=">" if ($status=~/82$/);
my $val=0;
# signed Values
my $tmp="";
if ($dataT & 0b00010000) {
$val=unpack("c", pack("C", hex($data))) if ($dataL==1);
$val=unpack("s", pack("S", hex($data))) if ($dataL==2);
$val=unpack("l", pack("L", hex($data))) if ($dataL==4);
if (length(pack('j', -1))*8 == 64) {$val=unpack("q", pack("Q", hex($data))) if ($dataL==8)};
if ($data =~ /^[89a-f]/i) {$val = hex($data) - hex(sprintf ("FF" x $dataL)) -1;}
else {$val = hex($data)} #positive value
}
#unsigned Values
if ($dataT & 0b00100000) {
$val=unpack("C", pack("C", hex($data))) if ($dataL==1);
$val=unpack("S", pack("S", hex($data))) if ($dataL==2);
$val=unpack("L", pack("L", hex($data))) if ($dataL==4);
if (length(pack('j', -1))*8 == 64) {$val=unpack("Q", pack("Q", hex($data))) if ($dataL==8)};
if ($dataT & 0b00100000 || $val>0) {
$val=hex($data);
}
# $line2.=($val*$scaler).($unit eq "" ? "" : "*$unit") if($dataT ==80);
$line2.=($val*$scaler).($unit eq "" ? "" : "*$unit") if($dataT ==80);
$line2.=($val*$scaler).($unit eq "" ? "" : "*$unit"); # if($dataT ==96);
} elsif ($dataT & 0b01000000) { # Type Boolean - no Idea, where this is used
$line2=OBIS_hex2int($data); # 0=false, everything else is true