- 
      
 - 
        
Save erjiang/503896 to your computer and use it in GitHub Desktop.  
| #!/usr/bin/perl | |
| # | |
| # Eric Jiang | |
| # http://notes.ericjiang.com/posts/54 | |
| # This software is public domain. | |
| # | |
| # NOTE: This code is not maintained! | |
| # There is a newer version written in C: | |
| # https://github.com/erjiang/usbscale | |
| # | |
| use bytes; | |
| my $data; | |
| #prevents us from repeating messages | |
| my $waitingflag = 0; | |
| while (1) { | |
| $data = `cat /dev/hidraw4 | head -c 7`; | |
| my $report = ord(substr($data, 0, 1)); | |
| my $status = ord(substr($data, 1, 1)); | |
| my $unit = ord(substr($data, 2, 1)); | |
| my $exp = ord(substr($data, 3, 1)); | |
| my $lsb = ord(substr($data, 4, 1)); | |
| my $msb = ord(substr($data, 5, 1)); | |
| my $weight = ($msb * 256 + $lsb) / 10; | |
| if($exp != 255 && $exp != 0) { | |
| $weight ^= $exp; | |
| } | |
| #print "$report $status $unit $exp $weight\n"; | |
| if($report != 0x03) { | |
| die "Error reading scale data!\n"; | |
| } | |
| if($status == 0x01) { | |
| die "Scale reports FAULT!\n"; | |
| } elsif ($status == 0x02 || $weight == 0) { | |
| if($waitingflag != 0x02) { | |
| print "Zero'd...\n"; | |
| $waitingflag = 0x02; | |
| } | |
| } elsif ($status == 0x03) { | |
| if($waitingflag != 0x03) { | |
| print "Weighing...\n"; | |
| $waitingflag = 0x03; | |
| } | |
| } elsif ($status == 0x04) { | |
| my $unitName = "units"; | |
| if($unit == 11) { | |
| $unitName = "ounces"; | |
| } elsif ($unit == 12) { | |
| $unitName = "pounds"; | |
| } | |
| print "$weight $unitName\n"; | |
| last; | |
| } elsif ($status == 0x05) { | |
| if($waitingflag != 0x05) { | |
| print "Scale reports Under Zero...\n"; | |
| $waitingflag = 0x05; | |
| } | |
| } elsif ($status == 0x06) { | |
| if($waitingflag != 0x06) { | |
| print "Scale reports Over Weight!\n"; | |
| $waitingflag = 0x06; | |
| } | |
| } elsif ($status == 0x07) { | |
| if($waitingflag != 0x07) { | |
| print "Scale reports Calibration Needed!\n"; | |
| $waitingflag = 0x07; | |
| } | |
| } elsif ($status == 0x08) { | |
| if($waitingflag != 0x08) { | |
| print "Scale reports Re-zeroing Needed!\n"; | |
| $waitingflag = 0x08; | |
| } | |
| } else { | |
| die "Unknown status code: $status\n"; | |
| } | |
| } | 
The indices for the scale data have been shifted down, per mattismyname's investigation.
Thanks! I'll give this a try and get back with you.
I have just finished an early version of a C program that reads USB scales. Try it out and let me know how it goes. https://github.com/erjiang/usbscale
Consider using unpack() instead of ord(substr()). Example here.
Hello, I am trying to use this script with a Metler Toledo PS60. I am able to get the script to talk with the scale, but it is reading the weight incorrectly. For example, a 4lb item will read as 255lb, how in the script can I possibly correct this?
thanks
Just a note, this can be adapted for Fairbanks scales by removing the line $weight ^= $exp; and changing / 10 to /100
@bhartvigsen Interesting find. Can you open an issue on https://github.com/erjiang/usbscale/issues with details about your scale? It'd be nice to add support for it.
I can confirm the problem + solution for Fedora 13, 64-bit (not sure if that matters). Shifting the indices down by one made it report the weights again.