From: Bill Y. <bil...@co...> - 2008-06-17 01:16:42
|
Declan, It looks like you need something like this: $value = ord(pack("B8", unpack("b*", $bytes[0]))) * 256 + ord(pack("B8", unpack("b*", $bytes[1]))); $address = $bytes[2] * 256 + $bytes[3]; Bill declan wrote on 06/10/2008 06:48 AM: > Hi folks, > I abandoned this a long time back but now want to sort it out. > I have the older RFXPower unit, and the W800 is getting 4 bytes from it. > >>From looking at the X10_W800 and X10_RF libs, I think I have a handle on how > to do it, but I;m stuck with some perl > > With the 4 bytes I get from the W800, I need to do the following: > > Bytes 1 & 2: Reverse the order of the bits, The 2 bytes gives the recorded > kwh counter value > > Bytes 3 & 4: verify the address of the Transmitter (does not change ?? ) > > Probably best explained by example: > raw data from W800 : 10011000 10010110 0000000 00001111 > > So: > byte1 = 11000100 : reverse bits, gives 00011001 = 25 decimal > byte2 = 10111001 : reverse bits, gives 01101001 = 105 decimal > > so, (25 * 256) + 105 = 6505 = counter value > > > Byte 3&4 = 00000000 00001111 = 15 = Address. > > Now, how do I do that in perl ? > > I know I should use pack & unpack, but I'm lost on how to do that ! > > Is it similar to the way the X10_RF_digimax210.pm does it ? > > ================================================== > sub rf_process_digimax210 { > my($module, @bytes) = @_; > > my @rbytes; > for (my $i = 0; $i < 4; $i++) { > $rbytes[$i] = ord(pack("b8", unpack("b*", $bytes[$i]))); > } > > $device_id = $rbytes[0] * 256 + $rbytes[1]; > } > ===================================================== > > or am I on the wrong track ? > > > Thanks, > Declan |