added datasheets for sensors
[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.229:8186/write?db=telegraf';
11 $influx_url = 'http://10.13.37.92:8086/write?db=rot13';
12
13 my $debug = $ENV{DEBUG} || 0;
14
15 my $s = new Device::SerialPort( $port ) || die $!;
16 $s->baudrate(9600);
17 $s->databits(8);
18 $s->parity('none');
19 $s->stopbits(1);
20 $s->handshake('none');
21 $s->read_char_time(5);
22 $s->read_const_time(100);
23
24 my @names = qw(
25 pm1_0_s
26 pm2_5_s
27 pm10_s
28 pm1_0
29 pm2_5
30 pm10
31 pm1_0_r
32 pm2_5_r
33 pm10_r
34 );
35
36
37 while (1) {
38
39         my ($len, $string) = $s->read(24);
40         my $t = int( Time::HiRes::time() * 1_000_000_000 );
41         die $! if ! defined($len);
42         if ( $len > 0 ) {
43                 my @v = unpack('n*', $string);
44                 warn "# $len ",dump($string), dump( @v ), $/ if $debug;
45                 my $header = shift @v; 
46                 my $checksum = pop @v;    # remove checksum
47         
48                 my $sum = 0;
49                 foreach my $b ( unpack('C*', substr($string,0,-2) ) ) {
50                         $sum += $b;
51                 }
52                 $sum = $sum & 0xffff;
53
54                 if ( $header == 0x424d && $sum == $checksum ) {
55                         shift @v; # skip len
56
57                         my $influx = "pms3003,dc=trnjanska ";
58                         foreach my $i ( 0 .. $#v ) {
59                                 $influx .= "$names[$i]=$v[$i],";
60                         };
61                         $influx =~ s/,$//;
62                         $influx .= " $t";
63                         print "$influx\n";
64                         system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
65                 }
66         }
67
68 };
69
70
71 $s->close;