Datenerfassung mittels Telegraf & InfluxDB

vom Mittwoch, 22.September 2021

Motivation

Nachdem immer mehr Geräte im häuslichen Umfeld Daten sammeln, diese jedoch selbst nicht (ausreichend) aufbereiten und für andere Geräte zum konsumieren bereitstellen war ich auf der Suche nach einer (oder mehrerer) Lösungen um diese Daten abzugreifen und selbst mittels Scripte, Grafana, … auszuwerten und auf spezielle Betriebsbedingungen zu reagiern. Einige Geräte sind heute schon soweit, dass sie eine entsprechende Schnittstelle anbieten auf welcher die entsprechenden Betreibsdaten abgefragt werden können. Dies ist meist eine Modbus-Schnittstelle (TCP und/oder RTU) oder eine REST-API.

Unterstützte Geräte

Zunächst wurde identifiziert, welche Geräte ohne großen Aufwand nur durch anlegen der richtigen Konfiguration und ggf. Verwendung von exterenen Schnitstellen (z.B. für Modbus RTU) mit Telegraf angesprochen werden können:

Und wo sollen die Daten jetzt hin?

Diese Frage habe ich für mich zweigleisig beantwortet. Zum einen verwende ich das InfluxDB Output Plugin für Telegraf um die Daten wie eigentlich vorgesehen in eine InflusDB zu speichern. Von dieser aus versorge ich auch eine Grafana-Instanz mit ihren Daten. Als zweiten Weg habe ich das MQTT-Output-Plugin eingebunden, um die entsprechenden Betriebsdaten auch anderen Geräten oder Logiken zur Verfügung zu stellen. So läuft bei mir z.B. ein NodeRED welches anhand der PV-Leistungsdaten vom Plenticore entscheidet, in welcher der “Leistungsstufen” die Wärmepumpe laufen darf bzw. ob genügend Überschuss vorhanden ist den Heizungspufferspeicher durchzuladen.

Die Konfiguration

Die Konfiguration von Telegraf ist weitgehend selbsterklärend. Der Übersichtlichkeitshalber habe ich die Konfigurationsdaten (als Template) in einem git-Repository abgelegt, welches ihr unter https://github.com/oldies/telegraf-config findet. Anzupassen sind i.d.R. folgende Zeilen:

  1. Slave-ID des Modbus-Slave (Standardwerte Kostal: 71, SC3: 101)
  ## Slave ID - addresses a MODBUS device on the bus
  ## Range: 0 - 255 [0 = broadcast; 248 - 255 = reserved]
  slave_id = 71
  1. IP-Adresse und Port des Modbus-TCP Gerätes
  # TCP - connect via Modbus/TCP
  controller = "tcp://<<device-ip>>:502"

oder Modbus RTU Kommunikations-Parameter

  ## Serial (RS485; RS232)
  # controller = "file:///dev/ttyUSB0"
  # baud_rate = 9600
  # data_bits = 8
  # parity = "N"
  # stop_bits = 1
  # transmission_mode = "RTU"

Falls MQTT als Output verwendet werden soll, so sind folgende Zeilen anzupassen:

  1. IP-Adresse und Port des MQTT-Brokers
  ## MQTT Brokers
  ## The list of brokers should only include the hostname or IP address and the
  ## port to the broker. This should follow the format '{host}:{port}'. For
  ## example, "localhost:1883" or "127.0.0.1:8883".
  servers = ["<<mqtt-server>>:1883"]
  1. Benutzerdaten für die Anmeldung am MQTT-Broker
  ## username and password to connect MQTT server.
  username = "telegraf"
  password = "<<supergeheimesmqttpasswort>>"
  1. ClientID für die Anmeldung am MQTT-Broker
  ## client ID
  ## The unique client id to connect MQTT server. If this parameter is not set
  ## then a random ID is generated.
  client_id = "telegrafnas"

Ausblick

Ich wünsche viel Spaß beim adaptieren der Konfiguration auf die eigenen Bedürfnisse.