Firewall 2019

Hardware

  • Gehäuse
  • Mainboard
  • Arbeitsspeicher
    • 32GB Kingston DDR4-2133Mhz ECC-Registered [KVR21R15D4/16]
    • 16GB ECC DDR4-2400 [Kingston KTD-PE424S8/8G]
  • Storage
    • 512GB PCIe-SSD [PLEXTOR PX-512M8PeG]
    • 120GB M.2-SSD [WD Green 3D NAND]

Software

  • OPNsense 22.1

Updates

  • 05.01.22 Austausch Board, SSD, RAM, Lüfter, OS
  • 05.09.19 Initiales Setup

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 😉

Visualisierung für Smappee und myStrom mit InfluxDB/Grafana

Wie bereits in meinem Beitrag „Jeder mag fancy Dashboards“ angetönt, hat es mir die Kombination aus InfluxDB und Grafana extremst angetan. Seit Januar erfolgte die Fütterung der InfluxDB mit den Strommessdaten von meinem Smappee in Form eines Bash-Scripts zwar äusserst zuverlässig, dies jedoch leider im Scriptstil à la „quick and dirty“. Gute 11 Monate später konnte ich mich nun aber endlich dazu motivieren, das Script nach Python(3) zu migrieren. Da zwischenzeitlich auch mehrere myStrom-Smartplugs in unseren Haushalt Einzug hielten, wurde der Abruf  der Strommessung desjenigen, welcher in die Stromzuleitung des Racks eingeschlauft ist, auch gleich mit in das neue Script integriert.

Voraussetzungen

  • Lauffähige InfluxDB-Installation
    Am schnellsten erreicht man dies in Form eines Docker-Containers:
root@docker:~# docker run -p 8083:8083 -p 8086:8086 --restart=always --name=influxdb -v influxdb:/var/lib/influxdb influxdb:latest
  • Erstellen einer Datenbank
root@docker:~# docker exec -ti influxdb bash
root@420bb9285990:/# influx
> create database power
  • Lauffähige Grafana-Installation
    Auch hier sei der Einsatz eines Docker Containers angeraten:
root@docker:~# docker run -d -p 3000:3000 --restart=always --name=grafana -v grafana-data:/var/lib/grafana -v grafana-log:/var/log/grafana -v grafana-etc:/etc/grafana grafana/grafana:latest
  • Alle benötigten Python3-Module installiert
root@docker:~# pip3 install python-mystrom influxdb pycurl

Funktionsweise Script

Anmeldung an Smappee mittels HTTP POST Request
Abruf der Strommessdaten
Formatierung des Outputs
Erstellen eines leeren Dictionarys (rd)
Durchsuchen des Strommessdaten-Outputs mit Regex nach Name/Wert-Paaren
Vermeintlich doppelte Paare (Da 3 Phasen) werden mit einem Index versehen
Speicherung der gefundenen Name/Wert-Paaren in das Dictionary
Berechnung und Speicherung der Gesamtleistung
Abruf und Speicherung des myStrom-Messwerts und Speicherung im Dictionary
Schreiben des Dictionarys in die InfluxDB-Datenbank
Konfigurierte Zeit schlafen
Zurück zu Punkt 2

Script

#!/usr/bin/python3
# Python Modules
import re, time, urllib.request, pycurl, pymystrom
from influxdb import InfluxDBClient
# Configuration Smappee
ip_smappee = '10.11.3.43'
pollcycle = 30
c = pycurl.Curl()
c.setopt(c.URL, 'http://'+ip_smappee+'/gateway/apipublic/logon')
c.setopt(c.HTTPHEADER, ['Content-Type: application/json'])
c.setopt(c.POSTFIELDS, 'admin')
c.setopt(c.VERBOSE, False)
# Configuration Influx_DB
db = InfluxDBClient(host='10.11.1.104', port=8086, database='power')
measurement = 'Messungen'
# Configuration MyStrom
rack = pymystrom.MyStromPlug('10.11.3.40')
# Log in to Smappee
c.perform()
# Main Loop
while True:
    try:
        poll = urllib.request.urlopen('http://'+ip_smappee+'/gateway/apipublic/reportInstantaneousValues')
        data = poll.read().decode('utf-8').replace('<BR>','\n').replace('\\t','')
        rd = {}
        for match in re.findall("([^=,\r\n]+)=([^' ',\r\n]+)",data):
            if match[0].strip() in rd:
                if match[0].strip()+'2' in rd:
                    rd[str(match[0].strip()+'3')] = float(match[1].strip())
                else:
                    rd[str(match[0].strip()+'2')] = float(match[1].strip())
            else:
                rd[str(match[0].strip())] = float(match[1].strip())
            try:
                rd['activePowertotal'] = rd.get('activePower') + rd.get('activePower2') + rd.get('activePower3')
            except:
                pass
            try:
                rd['rackPower'] = float(rack.get_consumption())
            except:
                pass

        # Write Dictionary to InfluxDB
        json_body = [
            {
            'measurement': measurement,
            'fields': rd
            }
        ]
        db.write_points(json_body)
    except:
        c.perform()
#   print(rd)
    time.sleep(pollcycle)

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 direkt mein fixfertiges Dashboard:

Download Dashboard

Veganes Ryzmenü mit viel Her(t)z

Darf ich vorstellen?
Mein neues AMD-System:

Hardware

  • Gehäuse
    • Silverstone SST-CS350B
    • Silverstone GD07B
    • 4x HD-Einschübe FANTEC MR-35SATA-A
  • Lüfter
    • 1x 120nn Noctua NF-S12A FLX
    • 2x 80mm Noctua NF-A8 FLX
    • 2x 120mm Noctua NF-S12A ULN
  • Netzteil
    • Seasonic FOCUS PX-750 Platinum
    • Seasonic FOCUS Plus 750 Platinum
  • Mainboard
    • ASRock X470 Taichi Ultimate
    • Asus Prime X370-Pro
  • CPU
    • AMD Ryzen 7 5800X3D
    • AMD Ryzen 7 3700X
    • AMD Ryzen 7 2700X
    • Ryzen 5 1600X
  • CPU-Kühler
    • Noctua NH-L12S
    • AMD Wraith Prism
    • Noctua NH-L9x65 SE-AM4
  • Arbeitsspeicher
    • 2x16GB Corsair  Vengeance LPX Black 3600 MHz
      • CMK32GX4M2D3600C16
    • 2x8GB Corsair Vengeance LPX Red DDR4-4000
      • @3600Mhz @3200Mhz @3000Mhz
  • Storage
    • 1 TB Corsair MP600 Pro XT
    • 500GB PCIe-SSD Samsung 960 Evo
    • Plextor PX-512M8PeG
  • Grafik
    • Sapphire AMD Radeon RX 7900 XT 20GB
    • Asus Radeon VII, 16GB
    • XFX Radeon RX Vega 64, 8GB
  • Netzwerk
    • Intel X710-DA2 2xSFP+

Monitor

  • LG 34GK950F-B [34″, 3440 x 1440 Pixels, 144 Hz, FreeSync 2]

Betriebssystem

  • Microsoft Windows 10 11 Pro

Bilder/Änderungshistorie

  • Upgrade 15.11.23
    • Austausch CPU, Einbau SFP+-Karte
  • Upgrade 24.01.23
    • Austausch Netzteil
  • Upgrade 29.12.22
    • Austausch GPU, RAM
  • Upgrade 11.12.21
    • Austausch SSD, OS
  • Upgrade 31.08.19
    • Austausch CPU, CPU-Kühler, SSD und Gehäuse
  • Upgrade 20.02.19
    • Austausch GPU
  • Upgrade 05.01.19
    • Austausch Mainboard und CPU
  • Initiales Setup 11.09.2017