Grundlage

Schon seit längerem wollte ich einen Alkoholsensor am Essigfermentor betreiben, um zu erkennen, wann die Alkoholfermentation beendet ist. Vor ca. 2 Jahren wurde ich auf die Blog-Beiträge von Davide Gironi aufmerksam gemacht, der durch Korrelation der Daten des mq-3-Sensor-Datenblatts einen Algorithmus ableitet, der eine recht genaue Bestimmung des Alkoholgehaltes in der Luft zulässt. Ich habe mich nun entschieden den Sensor direkt an die Essigmaschine zu hängen und die Sensordaten aufzuzeichnen, um den Fermentationsprozess grafisch darzustellen und dann entscheiden zu können, welchen Weg man bei der Analyse beschreiten kann. Folgendes lässt sich sagen:

  • Nicht der Ist-Alkoholwert ist wichtig, sondern die Abnahme des Alkohols im Zeitablauf
  • Der 0-Wert des Alkohols ist entscheidend. Wenn der gesamte Alkohol in Essigsäure umgewandelt wurde, ist der Essig fertig.
  • Der Sensor arbeitet analog und ist nicht sehr genau
  • Die Sensorwerte schwanken in Abhängigkeit von Temperatur und Luftfeuchtigkeit

Im ersten Teil haben die ersten zwei Punkte Priorität und die Erfassung der Daten, bzw. deren Darstellung.

Erfassung der Daten

Die einzelnen Komponenten sind wie folgt:

  • Prometheus Monitoring System
  • Arduino mit angeschlossendem mq-3 Alkoholsensor
  • Applikation zum abgreifen der Daten an der seriellen Schnittstelle und Bereitstellung im Prometheus Exporter. Der Prometheus Server holt sich die Daten vom Prometheus Exporter (definiert in der Applikation

Eigentlich ist es sehr einfach. Das wichtigste an der Applikation ist die Bereitstellung der an der seriellen Schnittstelle abgefangenen Daten für den Prometheus:

func NewMetrics() *alcMetrics {
	m := &alcMetrics{
		alc: prometheus.NewGauge(prometheus.GaugeOpts{
			Name: "alcohol_raw_value",
			Help: "Value of the sensor directly read on the pin",
		}),
	}
	prometheus.MustRegister(m.alc)
	return m
}
func main() {
...
	m := NewMetrics()
	// Set values for the new created metrics.
	m.alc.Set(0)
...
	go connectSerial(env, m)
...
	http.Handle("/metrics", promhttp.Handler())
	http.ListenAndServe(":2112", nil)
...
}

Man sieht, dass der Exporter auf dem Port 2112 gestartet wurde. Der Prometheus Server muss so konfiguriert werden, dass er die Werte von dort holt:

- job_name: 'arduino'
    scrape_interval: 10s
    static_configs:
      - targets: ['172.18.0.1:2112']

Alle 10 Sekunden holt nun der Prometheus Server die Daten vom Exporter.

Darstellung der Daten

Der Prometheus Server bringt ein einfaches und funktionales Webinterface mit. Die nachfolgenden Daten zeigen einen reellen Produktionsverlauf der Essigmaschine:

Die Bereiche zeigen folgendes:

  1. Bei einem Wert von 130 ist die Steigung der Kurve 0 und der Alkohol wurde vollständig zu Essig umgewandelt.
  2. Nach (1) wurde ein Teil des Essigs abgelassen und wieder mit Bier befüllt. Nun geht die Maschine in den Heizvorgang über.
  3. Wie (1)