#!/usr/bin/perl use strict; use warnings; use utf8; use IO::Socket; use MIME::Base64; use Data::Dumper; $Data::Dumper::Useqq=1; my $buffer=''; { local $/=undef; $buffer=; } my %data; my %deviceconf; for my $v (split(/[\x0D\x0A]+/,$buffer)) { if($v=~/^M:[^,]+,[^,]+,(.+)/g) { my $str=decode_base64($1); $data{meta}{'?1'}=substr_hex(\$str,1); $data{meta}{'?2'}=substr_hex(\$str,1); $data{meta}{RoomCount}=substr_ord(\$str,1); for(1..$data{meta}{RoomCount}) { my ($roomid,$name,$rfaddr)=unpack('H2 C/a H6',$str); substr($str,0,5+length($name),''); utf8::upgrade($name); $data{rooms}{$roomid}{RoomName}=$name; $data{rooms}{$roomid}{RFAddress}=$rfaddr; } my $devcount=substr_ord(\$str,1); $data{meta}{DevCount}=$devcount; $data{meta}{'?3'}=substr_ord(\$str,1); # ergänzt: for(1..$devcount) { my ($rfaddr,$id,$name,$x4)=unpack('H6 a10 C/a H4',$str); substr($str,0,16+length($name),''); utf8::upgrade($name); $data{Devices}{$id}={ name => $name, RFAddress => $rfaddr, '?1' => $x4, }; } } if($v=~/^L:(.+)/g) { my %hilf; my $str=decode_base64($1); for(1..$data{meta}{DevCount}) { my $length=substr_ord(\$str,1); next if($length<6); my ($rfaddr,$x1,$data1,$data2)=unpack('H6 H2 B8 B8',substr($str,0,6,'')); $deviceconf{$rfaddr}={ Data1 => $data1, Data2 => $data2, '?1' => $x1, }; if($length == 11) { my ($x2,$temp,$date,$time)=unpack('C C B16 C',substr($str,0,5,'')); $deviceconf{$rfaddr}{'?2'}=$x2; $deviceconf{$rfaddr}{Temperatur}=$temp; $deviceconf{$rfaddr}{DateUntil}=$date; $deviceconf{$rfaddr}{TimeUntil}=$time; } my $sub=ord(pack('B2',substr($data2,6,2))); if($sub == 0) { $deviceconf{$rfaddr}{Mode} = 'auto' } elsif($sub == 1) { $deviceconf{$rfaddr}{Mode} = 'manu' } elsif($sub == 2) { $deviceconf{$rfaddr}{Mode} = 'vacation' } elsif($sub == 3) { $deviceconf{$rfaddr}{Mode} = 'boost' } } } } print Dumper(\%deviceconf,\%data); #if ($deviceconf{'005bfb'}{Mode} eq 'auto' && $deviceconf{'004bb8'}{Mode} eq 'auto' ) #{ print "0\n"; } #else #{ print "1\n"; } ######################################################################## sub substr_del { return substr( ${$_[0]}, 0, $_[1], '') } sub substr_ord { return unpack('C*', substr_del(@_) ); } sub substr_hex { return unpack('H*', substr_del(@_)); } sub substr_hex_fix { my $str=shift; my $length=shift; return unpack("H".($length*2), substr_del($str,$length)); } sub substr_bin { return unpack('B8', substr_del(@_)); } __DATA__ H:IEQ0111347,00b5b6,0102,00000000,3ed09189,01,32 M:00,01,VgICAQpXb2huemltbWVyAQhjAgZLw7xjaGUAjwIFAQEIY0lFUTAxOTI4MDcKV29obnppbW1lcgEEAFv7SUVRMDE1Njg3NwtXb2huZmVuc3RlcgEFAEu4SUVRMDE0NTQ4OQxFQ08tU2NoYWx0ZXIAAQCPAklFUTAxOTU0NzUGS8O8Y2hlAgQAX9ZJRVEwMTU3Nzc2DUZlbnN0ZXJrw7xjaGUCAQ== C:00b5b6,7QC1tgACAf9JRVEwMTExMzQ3AQsABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsABEAAAAAAAAAAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAGh0A6Ly9zcGFycGFrZXQtaGVpenVuZy5ld2UuZGU6ODAvY3ViZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENFVAAACgADEA4AAENFU1QAAwAAIBwAAA== C:005fd6,EQBf1gQAEw9JRVEwMTU3Nzc2 C:008f02,0gCPAgECFP9JRVEwMTk1NDc1Lh49CQcYA3AM/wA8dVycPNVc9j0gPSA9IEUgRSBFIEUgRSBFIDx1XJw8zFztPSA9ID0gRSBFIEUgRSBFIEUgPSA9ID0gPSA9ID0gPSBFIEUgRSBFIEUgRSA9ID0gPSA9ID0gPSA9IEUgRSBFIEUgRSBFID0gPSA9ID0gPSA9ID0gRSBFIEUgRSBFIEUgPSA9ID0gPSA9ID0gPSBFIEUgRSBFIEUgRSA9ID0gPSA9ID0gPSA9IEUgRSBFIEUgRSBFIA== C:004bb8,EQBLuAUAEg9JRVEwMTQ1NDg5 C:005bfb,EQBb+wQAEw9JRVEwMTU2ODc3 C:010863,0gEIYwEBFP9JRVEwMTkyODA3Lh49CQcYA3AM/wA8dVycPNVc9j0gPSA9IEUgRSBFIEUgRSBFIDxyXQg9ID0gPSA9ID0gRSBFIEUgRSBFIEUgPNhdCD0gPSA9ID0gPSBFIEUgRSBFIEUgRSA82F0IPSA9ID0gPSA9IEUgRSBFIEUgRSBFIDzYXQg9ID0gPSA9ID0gRSBFIEUgRSBFIEUgPNhdCD0gPSA9ID0gPSBFIEUgRSBFIEUgRSA82F0IPSA9ID0gPSA9IEUgRSBFIEUgRSBFIA== L:BgBf1gASEAsAjwIAEhkJHgCtAAYAS7gAEhAGAFv7ABIQCwEIYwASGRoeALAA