changeset 1177:025ad7fef554

pms5003 -> ttyUSB -> influxdb Ignore-this: d0c8851b557a88361a1755b93af4fc58 darcs-hash:e94133a9ca5c05d2fd73c3da3c94818f0b8be5b2
author drewp <drewp@bigasterisk.com>
date Wed, 21 Nov 2018 22:44:08 -0800
parents b3041caa2dc7
children e3991af5bd39
files service/air_particles/Dockerfile service/air_particles/Dockerfile.pi service/air_particles/air_particles.py service/air_particles/makefile service/air_particles/requirements.txt
diffstat 4 files changed, 92 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/air_particles/Dockerfile	Wed Nov 21 22:44:08 2018 -0800
@@ -0,0 +1,10 @@
+FROM bang6:5000/base_x86
+
+WORKDIR /opt
+
+COPY requirements.txt ./
+RUN pip install -r requirements.txt
+
+COPY *.py ./
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/air_particles/air_particles.py	Wed Nov 21 22:44:08 2018 -0800
@@ -0,0 +1,66 @@
+from __future__ import print_function
+import sys
+import logging
+import serial
+import time
+from influxdb import InfluxDBClient
+
+logging.basicConfig(level=logging.INFO)
+log = logging.getLogger()
+
+location, = sys.argv[1:]
+min_period = 5
+
+ser_port = "/dev/ttyUSB0"
+ser = serial.Serial(ser_port, baudrate=9600, stopbits=1, parity="N",  timeout=2)
+
+influx = InfluxDBClient('bang6', 9060, 'root', 'root', 'main')
+
+last_write = 0
+while True:     
+    ser.flushInput()
+    s = map(ord, ser.read(32))
+    if s[:2] != [0x42, 0x4d]:
+        log.warn('unknown packet header: %s' % s)
+        continue
+        
+    cs = (s[30] * 256 + s[31])   # check sum
+    check = 0
+    for i in range(30):
+        check += s[i]
+    if check != cs:
+        log.warn('checksum mismatch: %s' % s)
+        continue
+
+    sample = {
+        # PM1, PM2.5 and PM10 values for standard particle in ug/m^3
+        'pm1_0_std': s[4] * 256 + s[5],
+        'pm2_5_std': s[6] * 256 + s[7],
+        'pm10_0_std': s[8] * 256 + s[9],
+
+        # PM1, PM2.5 and PM10 values for atmospheric conditions in ug/m^3
+        'pm1_0_atm': s[10] * 256 + s[11],
+        'pm2_5_atm': s[12] * 256 + s[13],
+        'pm10_0_atm': s[14] * 256 + s[15],
+
+        # Number of particles bigger than 0.3 um, 0.5 um, etc. in #/cm^3
+        'part_0_3': s[16] * 256 + s[17],
+        'part_0_5': s[18] * 256 + s[19],
+        'part_1_0': s[20] * 256 + s[21],
+        'part_2_5': s[22] * 256 + s[23],
+        'part_5_0': s[24] * 256 + s[25],
+        'part_10_0': s[26] * 256 + s[27],
+    }
+
+    now = int(time.time())
+    if now < last_write + min_period:
+        continue
+    if last_write == 0:
+        log.info('sending first sample: %s', sample)
+    last_write = now
+    influx.write_points([{'measurement': 'air_particles',
+                          "fields": sample,
+                          "time": now,
+                          }],
+                          tags=dict(location=location),
+                        time_precision='s')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/air_particles/makefile	Wed Nov 21 22:44:08 2018 -0800
@@ -0,0 +1,14 @@
+build_image:
+	docker build --network=host -t bang6:5000/air_particles_x86:latest .
+	docker push bang6:5000/air_particles_x86:latest
+
+build_image_pi:
+	docker build --file Dockerfile.pi --network=host -t bang6:5000/air_particles_pi:latest .
+	docker push bang6:5000/air_particles_pi:latest
+
+
+shell:
+	docker run --rm -it --cap-add SYS_PTRACE --device=/dev/ttyUSB0 --net=host bang6:5000/air_particles_x86:latest  /bin/sh
+
+local_run:
+	docker run --rm -it --cap-add SYS_PTRACE --device=/dev/ttyUSB0 --net=host bang6:5000/air_particles_x86:latest python air_particles.py local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/air_particles/requirements.txt	Wed Nov 21 22:44:08 2018 -0800
@@ -0,0 +1,2 @@
+influxdb==3.0.0
+pyserial==3.4