check checksum before sending data to influx
[air-quality] / pms3003.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 # sudo apt install libdevice-serialport-perl libdata-dump-perl
5 use Device::SerialPort;
6 use Data::Dump qw(dump);
7
8 my $port = shift @ARGV || '/dev/ttyUSB0';
9 my $influx_url = shift @ARGV || 'http://10.13.37.229:8186/write?db=telegraf';
10 $influx_url = 'http://10.13.37.92:8086/write?db=rot13';
11
12 my $debug = $ENV{DEBUG} || 0;
13
14 my $s = new Device::SerialPort( $port ) || die $!;
15 $s->baudrate(9600);
16 $s->databits(8);
17 $s->parity('none');
18 $s->stopbits(1);
19 $s->handshake('none');
20 $s->read_char_time(5);
21 $s->read_const_time(100);
22
23 my @names = qw(
24 pm1_0_s
25 pm2_5_s
26 pm10_s
27 pm1_0
28 pm2_5
29 pm10
30 pm1_0_r
31 pm2_5_r
32 pm10_r
33 );
34
35
36 while (1) {
37
38         my ($len, $string) = $s->read(24);
39         if ( $len > 0 ) {
40                 my @v = unpack('n*', $string);
41                 warn "# $len ",dump($string), dump( @v ), $/ if $debug;
42                 my $header = shift @v; 
43                 my $checksum = pop @v;    # remove checksum
44         
45                 my $sum = 0;
46                 foreach my $b ( unpack('C*', substr($string,0,-2) ) ) {
47                         $sum += $b;
48                 }
49                 $sum = $sum & 0xffff;
50
51                 if ( $header == 0x424d && $sum == $checksum ) {
52                         shift @v; # skip len
53
54                         my $influx = "pms3003,dc=trnjanska ";
55                         foreach my $i ( 0 .. $#v ) {
56                                 $influx .= "$names[$i]=$v[$i],";
57                         };
58                         $influx =~ s/,$//;
59                         print "$influx\n";
60                         system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
61                 }
62         }
63
64 };
65
66
67 $s->close;