--- /dev/null
+#!/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 {}"
+
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 $!;
$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";
--- /dev/null
+#!/bin/sh -xe
+
+cd /nuc/air-quality/
+MEASUREMENT=dust ./dsm501.pl /dev/ttyACM0
--- /dev/null
+#!/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;
+ }
+}
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);
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";
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;
};
$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'"
}
}
User=pi
ExecStart=/home/pi/air-quality/mh-z19b.pl
Restart=always
-RestartSec=3s
+RestartSec=1s
[Install]
WantedBy=multi-user.target
User=pi
ExecStart=/home/pi/air-quality/mq7.sh
Restart=on-failure
+RestartSec=2s
[Install]
-WantedBy=multi-user.target
+WantedBy=network-online.target
--- /dev/null
+[Unit]
+Description=Air
+
+[Service]
+User=pi
+ExecStart=/home/pi/air-quality/pms3003.pl
+Restart=on-failure
+RestartSec=2s
+
+[Install]
+WantedBy=network-online.target
--- /dev/null
+[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
--- /dev/null
+[Unit]
+Description=dust sensor
+
+[Service]
+User=dpavlin
+ExecStart=/nuc/air-quality/dust.sh
+Restart=always
+RestartSec=2s
+
+[Install]
+WantedBy=multi-user.target
--- /dev/null
+[Unit]
+Description=iio2mqtt
+
+[Service]
+User=dpavlin
+ExecStart=/home/dpavlin/air-quality/iio2mqtt.pl
+Restart=always
+RestartSec=2s
+
+[Install]
+WantedBy=multi-user.target
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);
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";
}
}