Schon seit längerer Zeit logge ich Sensordaten wie Temperatur, Luftfeuchtigkeit, Niederschlag und Wind – die Inspiration dazu lieferte mir damals Martin Kompf in Form dieses Beitrages – mittels drahtloser Sensoren von ELV und eines Python-Scripts in eine RRDtool-Datenbank. Mithilfe der aufgezeichneten Daten fütterte ich anschliessend mein Monitoring-System und meine Website. Dieses Konstrukt wurde nun auf eine modernere Basis, in Form einer Kombination aus InfluxDB und Grafana, umgestellt.
Altes Funktionsprinzip
Neues Funktionsprinzip
Hardwareaufbau
Das System besteht aktuell aus folgenden Komponenten:
- Wetterstation ELV KS300 (Temperatur, Luftfeuchtigkeit, Niederschlag und Wind)
- 2x Temperatursensor ELV S 300 IA
- PC-Engines APU1D2 Board
- Debian 10 [Buster]
- USB-Wetterdaten-Empfänger ELV USB-WDE1-2
- Ubuntu 16.04 LTS [VM@Proxmox]
- Docker CE 17.09
- InfluxDB
- Grafana
- Docker CE 17.09
Log-Script
#!/usr/bin/python3 # Python Modules import serial, sys, time from influxdb import InfluxDBClient # Configuration serialPort='/dev/ttyUSB0' db = InfluxDBClient(host='10.11.1.104', port=8086, database='weather') measurement = 'Messungen' # Open serial port try: ser = serial.Serial(serialPort,baudrate=9600,timeout=None) except: sys.exit(1) # Main loop while True: # Wait for data and try error recovery on disconnect try: serData = ser.readline() dataset = str(serData).split(';') # Parse meter readings into dictionary (abbr. to rd for typing laziness of yours truely) rd = {} for n in range(1,9): # Conversion from german decimal mark , to international . try: rd['temp'+str(n)]=float(dataset[2+n].replace(',','.')) except ValueError: pass try: rd['hum'+str(n)]=float(dataset[10+n].replace(',','.')) except ValueError: pass # Kombisensor is mapped to temp9/hum9 try: rd['temp9']=float(dataset[19].replace(',','.')) except ValueError: pass try: rd['hum9']=float(dataset[20].replace(',','.')) except ValueError: pass try: rd['windspeed']=float(dataset[21].replace(',','.')) except ValueError: pass try: rd['rainfall']=float(dataset[22].replace(',','.')) except ValueError: pass # Write Dictionary to InfluxDB json_body = [ { 'measurement': measurement, 'fields': rd } ] try: db.write_points(json_body) except: pass except serial.SerialException as e: try: ser.close() time.sleep(10) ser = serial.Serial(serialPort,baudrate=9600,timeout=None) except: pass
Grafana Dashboard
Ist der erste Scriptdurchlauf erfolgt, können die einzelnen Werte in einem Grafana-Dashboard verknüpft, bzw. visualisiert werden – alternativ importiert man sich einfach direkt mein fixfertiges Dashboard als Vorlage:
Weitere Bilder
Bei der weissen Box mit Fenster handelt es sich im Übrigen um unser temperaturüberwachtes „Katzenhotel“ mit zwei Gästezimmern 😉