Archiv der Kategorie: Netzwerk

Sensordaten ab USB-WDE1 mit InfluxDB/Grafana loggen und visualisieren

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
  • Ubuntu 16.04 LTS [VM@Proxmox]
    • Docker CE 17.09
      • InfluxDB
      • Grafana

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:

Download Dashboard

Weitere Bilder

Bei der weissen Box mit Fenster handelt es sich im Übrigen um unser temperaturüberwachtes „Katzenhotel“ mit zwei Gästezimmern 😉

IPSec-Throughput: ZBOX CI323 nano

Aufgrund des unbefriedigenden IPSec-Throughputs der APU2-Boards, suchte ich nach einer preisgünstigen Alternative welche mind. 100Mbps packt. Diese wurde mit der ZBOX CI323 nano gefunden. Unter Laborbedingungen konnten 110Mbps gemessen werden. Wie schaut es aber unter Praxisbedingungen, bzw. installiert an meinem Backupstandort aus?

ZBOX CI323 nano

  • Internetanbindung: Kabelinternet 150/10Mbps
  • Betriebssystem: pfSense 2.3.1_1
  • IPSec: IKEv2, AES256, SHA256
  • CPU-Type:
Intel(R) Celeron(R) CPU N3150 @ 1.60GHz
4 CPUs: 1 package(s) x 4 core(s)
  • Crypto-Support OpenVPN:
[2.3.1-RELEASE][admin@talweg18-router]/root: /usr/bin/openssl engine
(cryptodev) BSD cryptodev engine
(rsax) RSAX engine support
(rdrand) Intel RDRAND engine
(dynamic) Dynamic engine loading support
  • Hardware crypto:
AES-CBC,AES-XTS,AES-GCM,AES-ICM
  • IPerf-Messungen:

Wie man an der folgenden Messung sieht, hat die Latenz einen entscheidenden Einfluss auf den maximal möglichen Durchsatz einer Verbindung:

struband@struband-monitoring:~$ iperf3 -c talweg18-router -i 1 -V
iperf 3.0.7
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 28.0 MBytes 23.5 Mbits/sec 30 sender
[ 4] 0.00-10.00 sec 27.3 MBytes 22.9 Mbits/sec receiver
CPU Utilization: local/sender 0.5% (0.1%u/0.4%s), remote/receiver 0.5% (0.0%u/0.4%s)

Eine Messung der gleichen Verbindung mit 8 Streams:

struband@struband-monitoring:~$ iperf3 -c talweg18-router -i 1 -V -P 8
iperf 3.0.7
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval Transfer Bandwidth Retr
[SUM] 0.00-10.00 sec 110 MBytes 92.4 Mbits/sec 234 sender
[SUM] 0.00-10.00 sec 108 MBytes 90.5 Mbits/sec receiver
CPU Utilization: local/sender 1.6% (0.3%u/1.3%s), remote/receiver 18.0% (0.5%u/17.5%s)

In der Praxis sind mit der ZBOX CI323 nano somit ~90Mbps (>10MBps) erzielbar -ein für mich akzeptabler Wert.

IPSec-Throughput: APU1D vs APU2C

Nach dem Upgrade meiner Internetanbindung stach mir als Erstes sofort der eher bescheidene, maximale IPSec-Durchsatz der APU1-Boards ins Auge. Dies war aufgrund der fehlenden AES-Einheit eigentlich auch nicht anders zu erwarten. Um nun diesen Flaschenhals beseitigen zu können, beschloss ich kurzerhand die Anschaffung eines APU2-Boards. Mit einer, gegenüber einem APU1-Board, nun hardwarebeschleunigten AES-Verschlüsselung und erst noch doppelt so vielen (4 Stk.) CPU-Kernen sollte der IPSec-Durchsatz doch deutlich zu steigern sein, oder etwa nicht?

Erste Messungen waren leider ziemlich ernüchternd, der Durchsatz steigerte sich lediglich um ca. 10Mbps. Über die Gründe tappe ich aktuell noch im Dunkeln. Unter Umständen liegt hier aber auch nur ein klassisches Layer-8 Problem vor. Ich bleib jedenfalls am Ball.

APU1D2

  • Betriebssystem: pfSense 2.2.6
  • IPSec: IKEv2, AES256, SHA256
  • Crypto-Support:
(cryptodev) BSD cryptodev engine
 [RSA, DSA, DH]
     [ available ]
(rsax) RSAX engine support
 [RSA]
     [ available ]
(dynamic) Dynamic engine loading support
     [ unavailable ]
  • IPerf-Messungen:
root@STRUBAND-E7450:~# iperf3 -c monitoring -i 1 -R                 
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  42.7 MBytes  35.8 Mbits/sec   51          sender
[  4]   0.00-10.00  sec  42.7 MBytes  35.8 Mbits/sec               receiver

APU2C4

  • Betriebssystem: pfSense 2.2.6
  • IPSec: IKEv2, AES256, SHA256
  • Crypto-Support:
(cryptodev) BSD cryptodev engine
 [RSA, DSA, DH, AES-128-CBC, AES-192-CBC, AES-256-CBC]
     [ available ]
(rsax) RSAX engine support
 [RSA]
     [ available ]
(dynamic) Dynamic engine loading support
     [ unavailable ]

IPerf-Messungen:

root@STRUBAND-E7450:~# iperf3 -c monitoring -i 1 -R              
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  54.2 MBytes  45.4 Mbits/sec   25          sender
[  4]   0.00-10.00  sec  51.3 MBytes  43.0 Mbits/sec               receiver

3..2..1..FTTH

Dank glücklicher Umstände (In mein Mietshaus wird das TV-Signal mittels FTTH geliefert) und einem sehr flexiblen und kundenorientierten Kabelnetzbetreiber, welcher mir, obwohl ich nur ein Privatkunde und dazu noch Mieter bin, eine über 4km lange, exklusive Faser zum POP meines Providers spleisste, bin ich nun seit gestern Nutzer des wohl defintitiv einzigsten FTTH-Anschlusses in Frenkendorf BL. 🙂 🙂 🙂

FTTH