don't die without checksum
[air-quality] / pms3003.pl
index 1c5067b..7c0205e 100755 (executable)
@@ -3,12 +3,15 @@ use warnings;
 use strict;
 # sudo apt install libdevice-serialport-perl libdata-dump-perl
 use Device::SerialPort;
+use Time::HiRes;
 use Data::Dump qw(dump);
 
-my $port = shift @ARGV || '/dev/ttyUSB1';
+my $port = shift @ARGV || '/dev/ttyUSB0';
 my $influx_url = shift @ARGV || 'http://10.13.37.229:8186/write?db=telegraf';
 $influx_url = 'http://10.13.37.92:8086/write?db=rot13';
 
+my $debug = $ENV{DEBUG} || 0;
+
 my $s = new Device::SerialPort( $port ) || die $!;
 $s->baudrate(9600);
 $s->databits(8);
@@ -34,18 +37,29 @@ pm10_r
 while (1) {
 
        my ($len, $string) = $s->read(24);
+       my $t = int( Time::HiRes::time() * 1_000_000_000 );
+       die $! if ! defined($len);
        if ( $len > 0 ) {
                my @v = unpack('n*', $string);
-               warn "# $len ",dump($string), dump( @v ), $/;
+               warn "# $len ",dump($string), dump( @v ), $/ if $debug;
                my $header = shift @v; 
-               if ( $header == 0x424d ) {
+               my $checksum = pop @v;    # remove checksum
+       
+               my $sum = 0;
+               foreach my $b ( unpack('C*', substr($string,0,-2) ) ) {
+                       $sum += $b;
+               }
+               $sum = $sum & 0xffff;
+
+               if ( $header == 0x424d && $sum == $checksum ) {
                        shift @v; # skip len
-                       pop @v;   # remove checksum
+
                        my $influx = "pms3003,dc=trnjanska ";
                        foreach my $i ( 0 .. $#v ) {
                                $influx .= "$names[$i]=$v[$i],";
                        };
                        $influx =~ s/,$//;
+                       $influx .= " $t";
                        print "$influx\n";
                        system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
                }