Archiv des Autors: hermann

Temperatur und Luftfeuchtigkeit mit WEMOS D1 Mini messen

Kollegen haben mir den Floh ins Ohr gesetzt, man könnte die Temperatur und Luftfeuchtigkeit mit Hilfe eines WEMOS D1 Mini messen und in eine Datenbank schreiben. Die gesammelten Informationen dann mit Hilfe von Grafana ausgeben.

Zunächst die einzelnen Elemente bestellt und zusammengelötet, auf dem Rechner die benötigte Arduino IDE installiert.

In der Arduino IDE unter den Einstellungen / Preferences muss bei Additional boards manager URLs die URL http://arduino.esp8266.com/stable/package_esp8266com_index.json hinterlegt werden.

Zusätzlich das Board unter Tools => Board => Boards manager das Board ESP8266 installieren.

Neben dem Board wird die Bibliothek für „DHT sensor library“ benötigt.

Der Quellcode der benötigt wird um ihn auf den Wemos zu übertragen, findet ihr auf der Seite https://znil.net/index.php/ESP8266_Wemos_D1_Mini_mit_DHT22_Sensor_Beispiel . An den leicht zu findenden Stellen müssen die heimischen WLAN Zugangsdaten hinterlegt werden.

Bevor de Quellcoce übertragen werden kann, müssen folgende Einstellungen gesetzt werden. Die Uploadgeschwindigkeit auf 921600 und unter Tools Board => esp8266 das Board LOLIN (WEMOS) D1 R2 & Mini auswählen.

API Zugriff auf den Google Kalender

Neulich dachte ich mir, es könnte doch interessant sein den privaten Google Kalender per Ruby auszulesen und auf dem Dashboard auszugeben.

Für den API Zugriff muss zunächst ein Projekt in der google cloud unter https://console.cloud.google.com/projectcreate?hl=de ein Projekt erstellt werden. Nachdem das Projekt angelegt wurde kann unter dem Menüpunkt IAM ein Dienstkonto erstellt werden. Bei dem Erstellen des Dienstkontos sollte gleich der Schlüssel generiert werden als json Datei, diese wird später noch benötigt(dienstbenutzer.json).

Um die Daten abrufen zu können, muss das Dienstkonto auf den Google Kalender berechtigt werden.

Folgende gems wurden installiert: google-api-client, google-apis-calendar_v3, googleauth, json

Das Script selbst ist wie folgt aufgebaut:

require 'google/apis/calendar_v3'
require 'googleauth'
require 'json'

t = Time.now
zeit =  t.strftime("%Y-%d-%mT%H:%M:%Sz")
content = Google::Apis::CalendarV3::CalendarService.new
scope = 'https://www.googleapis.com/auth/calendar.readonly'

content.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open('./dienstbenutzer.json'),
  scope: scope)
content.authorization.fetch_access_token!
termine = content.list_events(calenderid='<EmailAdresse des Kalenders>' )
events = termine.items.map do |e|
  {
     title: e.summary,
     start: e.start.date || e.start.date_time.strftime('%d.%m.%y %H:%M')}

end
puts events

Als weiteren Parameter kann neben der calenderid auch time_min und time_max verwendet werden, um die Ausgabe der Termine zu begrenzen.

Mit Hilfe von prometheus Daten sammeln

Neben dem zuvor erstellen collectd lassen sich mit Hilfe von Prometheus weitere Daten aus der Fritzbox sammeln, die über Grafana ausgegeben werden können. Zunächst Prometheus installieren.

apt-get install prometheus

Prometheus dient dazu die Daten abzurufen, jedoch werden für die verschiedenen Systeme Exporter benötigt.

Für den hier verwendeten Exporter wird docker und go benötigt, beides wurde nach den folgenden Anleitungen installiert.

Docker: https://docs.docker.com/engine/install/debian/

Go: https://phoenixnap.com/kb/debian-install-go

Für den Export der Daten kommt der Fritzbox_Exporter zum Einsatz, der nach der Anleitung von https://github.com/sberk42/fritzbox_exporter installiert wurde.

Bei der Installation das Exporters mit go install github.com/sberk42/fritzbox_exporter@latest  docker build --tag fritzbox-prometheus-exporter:latest . kam es zu einem Fehler. Die Installation konnte mit docker build --tag fritzbox-prometheus-exporter:latest go/pkg/mod/github.com/sberk42/fritzbox_exporter@v0.0.0-20230106183717-d39a1d30d4cf fortgesetzt werden.

Zugriff auf die Fritzbox

Für den Zugriff auf die Fritzbox über den Exporter, muss zunächst ein Benutzer angelegt werden. Die Einrichtung erfolgt unter System => Fritzbox Benutzer, der Benutzer benötigt das Recht das Einstellungen eingesehen werden können.

Nach der Einrichtung kann der Exporter gestartet werden.

docker run -e 'USERNAME=Benutzername' \
    -e 'PASSWORD=Kennwort' \
    -e 'GATEWAY_URL="http://192.168.178.1:49000"' \
    -e 'LISTEN_ADDRESS="0.0.0.0:9042"' \
    -p 9042:9042 \
    fritzbox-prometheus-exporter:latest

Exporter in prometheus hinterlegen

In der Datei  /etc/prometheus/prometheus.yml wird der Exporter wie folgt hinterlegt:

- job_name: fritzbox

    static_configs:

      - targets: ['ipadresse:9042']

Ob der Exporter erfolgreich im prometheus eingerichtet wurde, kann innerhalb des prometheus unter Status => Targes geprüft werden.

Jetzt muss nur noch im Grafana das Dashboard https://grafana.com/grafana/dashboards/12579-fritz-box-status/ importiert werden und als Datenquelle prometheus auswählen.

Erste Daten in Grafana

Nachdem wie im vorherigen Artikel beschrieben Grafana installiert wurde, kam die Frage auf „und jetzt?“ Welche Datenquellen gibt es im Haus die man dort einbinden könnte. Die erste Wahl viel auf die Fritzbox.

Für die Abfrage der Daten und das Speichern der Informationen in der influxdb habe ich mich für collectd entschieden. Die benötigten Pakte wurden mit folgenden Befehlen als root installiert:

apt-get install -y python3-pip
apt-get install -y libxml2-dev libxslt1-dev
apt-get install -y collectd
pip install fritzcollectd

Für die Speicherung der Daten wurde in der influxdb eine Datenbank angelegt.

CREATE DATABASE "fritzbox"
user create -n fritzbox -p <password>
grant all on "fritzbox" to "fritzbox"

Die Konfigurationsdatei für die Influxdb (/etc/influxdb/influxdb.conf) wurde wie folgt angepasst bzw. ergänzt.

[[collectd]]
   enabled = true
   bind-address = ":25826"
   database = "fritzbox"
   retention-policy = ""

Die Datei um die Daten aus der Fritzbox zu holen wurden unter /etc/collectd/collectd.conf.d/fritzcollectd.conf  erstellt.

LoadPlugin python
LoadPlugin network
<Plugin network>
        Server "127.0.0.1" "25826"
</Plugin>
<Plugin python>
        Import "fritzcollectd"
        <Module fritzcollectd>
                Address "192.168.178.1"
                Port 49000
                User "benutzer"
                Password "kennwort"
                Hostname "fritzbox"
                Instance "1"
                Verbose "False"
        </Module>
</Plugin>

Der in der Datei hinterlegte Benutzer wurde zuvor in der Fritzbox angelegt.

Dienste neu starten

systemctl restart influxdb
systemctl restart collectd 

Im Grafana wurde zum Abschluss das Dashboard https://grafana.com/grafana/dashboards/713 hinzugefügt, bei dem hinzufügen wurden die bereits erstellten Zugangsdaten für die influxdb verwendet.

Dann schauen wir uns mal grafana an

Wer sich sich die alten Artikel auf meinem Blog angeschaut hat, der weiß das meine favorisierte Dashboardlösung das dashing.io ist. Für dashing.io habe ich mittlerweile diverse Abfragen erstellt unter anderem auslesen eines Ticketsystems, Telefonanlage, Patchsysteme.

Der ein oder andere Kollege meinte jedoch, das ich mit auch mal grafana anschauen sollte. Also kleine debian VM aufgesetzt und mit den folgenden Schritten grafana und influxdb installiert.

Folgendes als root Benutzer ausführen um influxdb zu installieren:

wget -q https://repos.influxdata.com/influxdb.key
echo '23a1c8836f0afc5ed24e0486339d7cc8f6790b83886c4c96995b88a061c5bb5d influxdb.key' | sha256sum -c && cat influxdb.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdb.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
apt-get update && sudo apt-get install influxdb
systemctl unmask influxdb.service
systemctl start influxdb

Ebenfalls als root Benutzer ausführen um grafana zu installieren:

sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/enterprise/deb stable main" | tee -a /etc/apt/sources.list.d/grafana.list
apt-get update
apt-get install grafana-enterprise
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server.service

Im Anschluss was über http://serverip:3000 ein Zugriff auf grafana möglich