don't send 0 values master
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 10 Mar 2024 13:14:51 +0000 (14:14 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 10 Mar 2024 13:14:51 +0000 (14:14 +0100)
13 files changed:
ble-mijia.sh [new file with mode: 0755]
dsm501.pl
dust.sh [new file with mode: 0755]
iio2mqtt.pl [new file with mode: 0755]
mh-z19b.pl
pms3003.pl
system/air-mh-z19b.service
system/air-mq7.service
system/air-pms3003.service [new file with mode: 0644]
system/ble-mijia@.service [new file with mode: 0644]
system/dust.service [new file with mode: 0644]
system/iio2mqtt.service [new file with mode: 0644]
zph02.pl

diff --git a/ble-mijia.sh b/ble-mijia.sh
new file mode 100755 (executable)
index 0000000..908d63f
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh -e
+mac=A4:C1:38:90:DC:63
+test ! -z "$1" && mac=$1
+
+# based on https://ndimension.design.blog/2021/12/16/reading-data-from-xiaomi-mi-temperature-and-humidity-monitor-2-lywsd03mmc/
+# find sensor with: sudo hcitool lescan
+# A4:C1:38:D8:3F:9C LYWSD03MMC
+
+gatttool -b $mac --char-write-req --handle='0x0038' --value="0100" --listen | \
+       awk 'BEGIN { OFS=","; ORS="\n" } /value:/ { print "temperature=" strtonum("0x"$7$6) / 100, "humidity=" strtonum("0x"$8), "battery=" strtonum("0x"$10$9) / 1000 ; fflush() }' | \
+       xargs -i curl --silent -XPOST 'http://10.60.0.92:8086/write?consistency=any&db=rot13' --data-binary "mijia,dc=trnjanska,mac=$mac {}"
+
index e61e2be..0a237a7 100755 (executable)
--- a/dsm501.pl
+++ b/dsm501.pl
@@ -6,8 +6,8 @@ use Device::SerialPort;
 use Time::HiRes;
 use Data::Dump qw(dump);
 
-my $port = shift @ARGV || '/dev/serial/by-path/pci-0000:00:1a.7-usb-0:5.1.3:1.0-port0';
-my $influx_url = shift @ARGV || 'http://10.13.37.92:8086/write?consistency=any&db=rot13';
+my $port = shift @ARGV || '/dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0';
+my $influx_url = shift @ARGV || 'http://192.168.3.40:8086/write?consistency=any&db=rot13';
 my $measurement = $ENV{MEASUREMENT} || 'dsm501';
 
 my $s = new Device::SerialPort( $port ) || die $!;
@@ -31,7 +31,7 @@ while (1) {
                        $string =~ s/[\r\n]+$//;
                        $string =~ s/\s/,/g;
                        my $influx = "$measurement,dc=trnjanska $string $t";
-                       print "$influx\n";
+                       print "$influx\n" if -e '/dev/shm/air-debug';
                        system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
                } else {
                        warn "SKIP: $string\n";
diff --git a/dust.sh b/dust.sh
new file mode 100755 (executable)
index 0000000..47c9b28
--- /dev/null
+++ b/dust.sh
@@ -0,0 +1,4 @@
+#!/bin/sh -xe
+
+cd /nuc/air-quality/
+MEASUREMENT=dust ./dsm501.pl /dev/ttyACM0
diff --git a/iio2mqtt.pl b/iio2mqtt.pl
new file mode 100755 (executable)
index 0000000..50668f0
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+use Time::HiRes;
+
+# sudo apt install libiio-utils mosquitto-clients
+
+my $influx_url = shift @ARGV || 'http://192.168.3.40:8086/write?consistency=any&db=rot13';
+
+my $delay = $ENV{DELAY} || 1;
+
+my $hostname = `hostname -s`;
+chomp($hostname);
+
+while(1) {
+
+       my $t = Time::HiRes::time;
+       my $t_influx = int( $t * 1_000_000_000 );
+
+       my $iio = `iio_info`;
+
+       my $device;
+       my $name;
+
+       my $influx = '';
+
+       foreach ( split(/\n/, $iio) ) {
+               if ( m/iio:device\d+:\s+(\S+)/ ) {
+                       $device = $1;
+
+                       if ( $influx =~ m/,$/ ) {
+                               $influx =~ s/,$/ $t_influx\n/;
+                       } elsif ( $influx =~ m/ $/ ) { # only device
+                               $influx =~ s/\S+\s$//;
+                       }
+                       $influx .= "iio,dc=trnjanska,host=$hostname,device=$device ";
+
+               } elsif ( m/(\S+):\s+\(input\)/ ) {
+                       $name = $1;
+               } elsif ( m/attr\s+0:\s+input\svalue: (\d+[\.\d]+)/ ) {
+                       my $val = $1;
+                       if ( $val !~ m/\d+\.\d+/ ) {
+                               $val = $val / 1000;
+                       }
+                       my $topic = "iio/$hostname/$device/$name";
+                       #print "$topic $val\n";
+                       system "mosquitto_pub -h rpi2 -t $topic -m $val";
+
+                       $influx .= "$name=$val,";
+               } else {
+                       #warn "# $_\n";
+               }
+       }
+
+       $influx =~ s/,$/ $t_influx/;
+       system "curl --silent -XPOST '$influx_url' --data-binary '$influx'";
+       warn "$influx\n";
+
+       my $dt = Time::HiRes::time + $delay - $t - 0.01;
+       if ( $dt > 0 ) {
+               sleep $dt;
+       }
+}
index 1d7b894..52e3812 100755 (executable)
@@ -7,7 +7,7 @@ use Time::HiRes;
 use Data::Dump qw(dump);
 
 my $port = shift @ARGV || '/dev/serial/by-path/platform-3f980000.usb-usb-0:1.5:1.2';
-my $influx_url = shift @ARGV || 'http://10.13.37.92:8086/write?consistency=any&db=rot13';
+my $influx_url = shift @ARGV || 'http://192.168.3.40:8086/write?consistency=any&db=rot13';
 
 my $s = new Device::SerialPort( $port ) || die $!;
 $s->baudrate(9600);
@@ -43,8 +43,8 @@ while (1) {
                my $co2 = $v[2] * 255 + $v[3];
                if ( $v[0] == 0xff && $sum == $checksum ) {
                        my $influx = "mh-z19b,dc=trnjanska co2=$co2 $t";
-                       print "$influx\n";
-                       system "curl --silent -XPOST '$influx_url' --data-binary '$influx'";
+                       print "$influx\n" if -e '/dev/shm/air-debug';
+                       system "curl --max-time 2 --silent -XPOST '$influx_url' --data-binary '$influx'";
                        system "mosquitto_pub -h rpi2 -t 'air/mh-z19b/co2' -m $co2";
                } else {
                        die "checksum error";
index 72771f5..e90d1c0 100755 (executable)
@@ -7,7 +7,7 @@ use Time::HiRes;
 use Data::Dump qw(dump);
 
 my $port = shift @ARGV || '/dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0';
-my $influx_url = shift @ARGV || 'http://10.13.37.92:8086/write?consistency=any&db=rot13';
+my $influx_url = shift @ARGV || 'http://192.168.3.40:8086/write?consistency=any&db=rot13';
 
 my $debug = $ENV{DEBUG} || 0;
 
@@ -59,8 +59,8 @@ while (1) {
                        };
                        $influx =~ s/,$//;
                        $influx .= " $t";
-                       print "$influx\n";
-                       system "curl --silent -XPOST '$influx_url' --data-binary '$influx'"
+                       print "$influx\n" if -e '/dev/shm/air-debug';
+                       system "curl --max-time 2 --silent -XPOST '$influx_url' --data-binary '$influx'"
                }
        }
 
index 3a351ea..fd6e52e 100644 (file)
@@ -5,7 +5,7 @@ Description=Air
 User=pi
 ExecStart=/home/pi/air-quality/mh-z19b.pl
 Restart=always
-RestartSec=3s
+RestartSec=1s
 
 [Install]
 WantedBy=multi-user.target
index fb20c10..2175f9c 100644 (file)
@@ -5,6 +5,7 @@ Description=Air
 User=pi
 ExecStart=/home/pi/air-quality/mq7.sh
 Restart=on-failure
+RestartSec=2s
 
 [Install]
-WantedBy=multi-user.target
+WantedBy=network-online.target
diff --git a/system/air-pms3003.service b/system/air-pms3003.service
new file mode 100644 (file)
index 0000000..a26ce98
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=Air
+
+[Service]
+User=pi
+ExecStart=/home/pi/air-quality/pms3003.pl
+Restart=on-failure
+RestartSec=2s
+
+[Install]
+WantedBy=network-online.target
diff --git a/system/ble-mijia@.service b/system/ble-mijia@.service
new file mode 100644 (file)
index 0000000..b12201c
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=Xiomi Mijia %i
+
+[Service]
+User=pi
+ExecStart=/home/pi/air-quality/ble-mijia.sh %i
+Restart=always
+RestartSec=3s
+
+[Install]
+WantedBy=network-online.target
diff --git a/system/dust.service b/system/dust.service
new file mode 100644 (file)
index 0000000..2744a77
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=dust sensor
+
+[Service]
+User=dpavlin
+ExecStart=/nuc/air-quality/dust.sh
+Restart=always
+RestartSec=2s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/system/iio2mqtt.service b/system/iio2mqtt.service
new file mode 100644 (file)
index 0000000..95ebc8a
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=iio2mqtt
+
+[Service]
+User=dpavlin
+ExecStart=/home/dpavlin/air-quality/iio2mqtt.pl
+Restart=always
+RestartSec=2s
+
+[Install]
+WantedBy=multi-user.target
index 44d35ef..10f961e 100755 (executable)
--- a/zph02.pl
+++ b/zph02.pl
@@ -7,7 +7,7 @@ use Time::HiRes;
 use Data::Dump qw(dump);
 
 my $port = shift @ARGV || '/dev/serial/by-path/platform-3f980000.usb-usb-0:1.5:1.0';
-my $influx_url = shift @ARGV || 'http://10.13.37.92:8086/write?consistency=any&db=rot13';
+my $influx_url = shift @ARGV || 'http://192.168.3.40:8086/write?consistency=any&db=rot13';
 
 my $s = new Device::SerialPort( $port ) || die $!;
 $s->baudrate(9600);
@@ -43,10 +43,10 @@ while (1) {
 
                my $checksum = $v[8];
                my $pcnt = $v[3] + ( $v[4] / 100 );
-               if ( $v[0] == 0xff && $sum == $checksum ) {
+               if ( $v[0] == 0xff && $sum == $checksum && $pcnt > 0) {
                        my $influx = "zph02,dc=trnjanska pm25_pcnt=$pcnt $t";
-                       print "$influx\n";
-                       system "curl --silent -XPOST '$influx_url' --data-binary '$influx'";
+                       print "$influx\n" if -e '/dev/shm/air-debug';
+                       system "curl --max-time 2 --silent -XPOST '$influx_url' --data-binary '$influx'";
                        system "mosquitto_pub -h rpi2 -t 'air/zph02/pm25' -m $pcnt";
                }
        }