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 unserem 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 werden -oder man importiert sich direkt mein fixfertiges Dashboard:

Download Dashboard

Vegane Ryzkost

Darf ich vorstellen?
Mein neues AMD-System:

Hardware

  • Gehäuse
    • Silverstone GD07B
    • 2x 80mm Lüfter Noctua NF-A8 FLX
    • 2x 120mm Lüfter Noctua NF-S12A ULN
    • 4x HD-Einschübe FANTEC MR-35SATA-A
  • Netzteil
    • Seasonic FOCUS Plus 750 Platinum
  • Mainboard
    • Asus Prime X370-Pro
  • CPU
    • AMD Ryzen 1600X
  • CPU-Kühler
    • Noctua NH-L9x65 SE-AM4
  • Arbeitsspeicher
    • 16GB Corsair Vengeance LPX Red DDR4-4000 @3200Mhz
  • Storage
    • 512GB PCIe-SSD Plextor PX-512M8PeG
  • Grafik
    • XFX Radeon RX Vega 64, 8GB HBM2
  • Bildschirm
    • Dell U3415H [34″ | 21:9 | 3440×1400 | Onboard KVM-Switch]

Betriebssystem

  • Microsoft Windows 10 Pro

Energiebedarf [Idle]

  • ~60 Watt

HPE Microserver Gen.10 X3216

Bei dem unverschämt günstigen Preis konnte ich nicht widerstehen. In Kombination mit Proxmox steht mir an meinem Backupstandort nun ein deutlich flexibleres System als die zuvor verwendete Synology DS416j zur Verfügung.

Hardware

  • Gehäuse
    • HPE Microserver Gen.10 X3216
  • Arbeitsspeicher
    • 8GB DDR4
  • Storage
    • 256GB PCIe-SSD Toshiba XG3
    • 4TB HDD WD Red @Port1
    • 4TB HDD WD Red @Port2
    • 4TB HDD WD Red @Port3

Betriebssystem

  • Proxmox Virtual Environment 5.0

Weitere Details: Topologie, VMs…

Jeder mag fancy Dashboards…

Wer wie ich schon lange auf der Suche nach einer Möglichkeit ist, Zeitreihen möglichst einfach, schnell und vorallem schön darstellen zu können, der sollte sich unbedingt mal Grafana, bzw. die Kombination aus InfluxDB und Grafana näher anschauen. Mithilfe der offiziellen Docker-Images erstellt man sich innert Minuten seine eigene lauffähige Umgebung. Wurde die InfluxDB mit ersten Daten gefüttert, steht dem ersten Dashboard schon nichts mehr im Wege.

Hier nun meine ersten beiden Dashboards:

Smappee Dashboard (V3)

Wetter Dashboard


Schick, oder? 😉