I got suckered into one of those hard-to-cancel Stamps.com trials. The upside is that they give you a $10 USB 5 lb. scale to use with their software. The downside is that they want you to only use it with their software, and the company that makes the scale has since taken down their free USB-scale program.
The good news, as Nicholas Piasecki and some Linux users figured out, is that the USB scale conforms to the USB HID specifications, which helpfully standardize how USB scales should work (no joke).
So, I hacked together a Perl script (what else?) to read from this scale by accessing the hidraw# interface that Linux provides. In my case, I have hidraw4 hard-coded into the script itself. Basically, it loops until it reads a good value from the scale, at which point it prints out the weight and exits.
#!/usr/bin/perl
# I hereby release this script into the public domain.
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, 1, 1));
my $status = ord(substr($data, 2, 1));
my $unit = ord(substr($data, 3, 1));
my $exp = ord(substr($data, 4, 1));
my $lsb = ord(substr($data, 5, 1));
my $msb = ord(substr($data, 6, 1));
my $weight = ($msb * 255 + $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";
}
}
Well done! Thanks!
Comment by Very Cool — June 10, 2010 @ 9:42 pm
Hi,
I am not a programmer. Can you share your knowledge of running this on Windows?
Thanks in advance!
Comment by John — June 12, 2010 @ 5:45 pm
This script will not run on Windows. Buy Elane’s official scale program instead: http://www.elane.net/index.php?go=USB_pcsoftware
Comment by Administrator — June 12, 2010 @ 6:12 pm