connect pill_serial directly to rpi usb port
[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 Time::HiRes;
7 use Data::Dump qw(dump);
8
9 my $port = shift @ARGV || '/dev/ttyUSB0';
10 my $influx_url = shift @ARGV || 'http://10.13.37.92:8086/write?consistency=any&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         my $t = int( Time::HiRes::time() * 1_000_000_000 );
40         die $! if ! defined($len);
41         if ( $len > 0 ) {
42                 my @v = unpack('n*', $string);
43                 warn "# $len ",dump($string), dump( @v ), $/ if $debug;
44                 my $header = shift @v; 
45                 my $checksum = pop @v;    # remove checksum
46         
47                 my $sum = 0;
48                 foreach my $b ( unpack('C*', substr($string,0,-2) ) ) {
49                         $sum += $b;
50                 }
51                 $sum = $sum & 0xffff;
52
53                 if ( $header == 0x424d && $sum == $checksum ) {
54                         shift @v; # skip len
55
56                         my $influx = "pms3003,dc=trnjanska ";
57                         foreach my $i ( 0 .. $#v ) {
58                                 $influx .= "$names[$i]=$v[$i],";
59                         };
60                         $influx =~ s/,$//;
61                         $influx .= " $t";
62                         print "$influx\n";
63                         system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
64                 }
65         }
66
67 };
68
69
70 $s->close;