Grafana/Influxdb/Telegraf/Chronograf

Installation auf einem Armbian, 21.02.3 Focal

Installation Influxdb

Installation wird auch hier beschrieben: https://docs.influxdata.com/influxdb/v1.8/introduction/install/

sudo wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc) 
sudo echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" > sudo /etc/apt/sources.list.d/influxdb.list

Influxdb installieren

sudo apt-get update && sudo apt-get install influxdb 
sudo service influxdb start

Version auf „hold“ setzen

Bei Influx scheint die Qualität nicht sehr hoch. Nach einem Update von Version 1.8.6 auf 1.8.9 lief die Influxdb nur noch sehr langsam und es hagelte „connection refused“ Fehler. Ich habe deswegen einen downgrade auf die Version 1.8.6 (Ressource) durchgeführt und diese Version nun „fixiert“

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.6_armhf.deb
sudo dpkg -i influxdb_1.8.6_armhf.deb
sudo apt-mark hold influxdb

Mit Installation fortfahren

Nun kann auf die Influx-Shell zugegriffen werden

influx

Benutzer anlegen

CREATE USER "admin" WITH PASSWORD '<adminpassword>' WITH ALL PRIVILEGES
CREATE USER "spacelynk" WITH PASSWORD '<userpassword>'

Datenbank anlegen und Berechtigung erteilen

CREATE DATABASE "knxdb"
GRANT ALL ON "knxdb" TO "user"

Influxdb konfigurieren

Das Konfig-File der Influx-DB liegt unter /etc/influxdb/…

sudo vi /etc/influxdb/influxdb.conf

Sicherstellen, dass folgende Punkte gesetzt sind:

[http] 
enabled = true 
bind-address = ":8086" 
auth-enabled = true
log-enabled = true 
write-tracing = false 
pprof-enabled = true 
https-enabled = false 
https-certificate = "/etc/ssl/influxdb.pem"
flux-enabled = true

Service restarten

sudo service influxdb restart

Nachtrag: Installation Influxdb auf armbian 32Bit (cannot allocate memory)

Die Influxdb lief nun x Monate. Nach einiger Zeit viel auf, dass das System heiss lief (>80°C) und im /var/log/syslog folgende Fehlermeldung erschien:

Jun 1 10:40:42 odroidxu4 influxd[24423]: ts=2022-06-01T08:40:42.988192Z lvl=info msg="Error replacing new TSM files" log_id=xxxx engine=tsm1 tsm1_level=1 tsm1_strategy=level trace_id=0aobcfkW000 op_name=tsm1_compact_group db_shard_id=654 error="cannot allocate memory"

Hier handelt es sich um ein InfluxDB-ARM-32-Bit-Fehler. Influx besteht darauf, die gesamte Datenbank in den Speicher abzubilden ist, was fehlschlägt, wenn die Datenbankgröße größer als die adressierbare Speichergröße ist (2 GB auf 32-Bit-Kerneln, ~ 3,6 GB auf 64-Bit-Kerneln, mit 32-Bit-OS).

Da ich ein 32Bit OS auf einem 32Bit-Kernel betreibe, stosse ich auf diesen Fehler, der das gesamte System instabil macht. Teilweise enstanden OS-Freezes daraus.

Fix

Wie hier beschreiben, existiert ein Fix. Ablauf:

Installation go

Als erstes muss auf dem armbian go installiert werden:

mkdir ~/src && cd ~/src 
wget https://dl.google.com/go/<version>.tar.gz
  • Entpacken
sudo tar -C /usr/local -xzf <version>.tar.gz 
rm <version>.tar.gz
  • Go konfigurieren
vi ~/.profile

folgenes hinzufügen:

PATH=$PATH:/usr/local/go/bin
GOPATH=$HOME/go
  • Update shell:
source ~/.profile
  • Test ob alles ok ist
go version

Influxdb aus github ziehen und compilieren

Folgende Instruktionen ausführen => Achtung! Beim checkout die korrekte influx-version ziehen, also jene, die aktuell über die Packet-Installation installiert und dann auf hold gesetzt wurde. Bei mir ist das Version 1.8.6.

git clone https://github.com/simonvetter/influxdb.git
cd influxdb
git checkout origin/1.8.6+big_db_32bit
mkdir build
# target 32-bit ARM architectures, use GOARCH=386 for 32-bit Intel/AMD
export GOARCH=arm
go build -o build/influx_stress cmd/influx_stress/*.go
go build -o build/influx_tools cmd/influx_tools/*.go
go build -o build/influx_inspect cmd/influx_inspect/*.go
go build -o build/influxd cmd/influxd/main.go
go build -o build/influx cmd/influx/main.go

Nun befinden sich die 32-bit binaries im build-verzeichnis:

cd ~/influxdb/build

Als nächstes die „alten“ binaries backupen (sicher ist sicher)

mkdir ~/influxbackup-binaries
sudo cp /usr/bin/influx* ~/influxbackup-binaries/

Nun die neuen binaries über die alten kopieren

sudo service influxdb stop
cd ~/influxdb/build
sudo mv * /usr/bin/
sudo chown root:root /usr/bin/influx*

Jetzt die Konfig so anpassen, dass die DB nicht mehr ins Memory gezwungen wird:

sudo vi /etc/influxdb/influxdb.conf
[data]
    tsm-use-seek = true # use the seek accessor (what this whole PR is about)
    index-version = "tsi1" # use on-disk index files instead of keeping them in-memory
    max-concurrent-compactions = 1 # avoid running multiple compactions at once

[coordinator]
  query-timeout = "60s" # kill runaway queries (you may want to adjust the value depending on your hardware and query set)

Jetzt System restarten

sudo shutdown -r now

Ab sofort sollte die Influx-DB nicht mehr so Speicherhungrig sein und die Systemtemperatur hat sich bei mir auch bei rund 48° eingependelt. Der „cannot allocate memory“ Fehler ist seit dem nicht mehr aufgetaucht => check 🙂

Grafana installieren (OSS Release)

Installation

Installation wird auch hier beschrieben: https://grafana.com/docs/grafana/latest/installation/debian/

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/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

sudo apt-get update 

sudo apt-get install grafana

 

Konfiguration

Die Configuration von Grafana findet man hier

Ich hatte nach einem Upgrade von Version 7.5 auf Version 8 das Problem (If you’re seeing this Grafana has failed to load its application files), dass gewisse „Embedded-Browser“ nicht mehr funktionierten. Deswegen verwende ich fix Version 7.5.10. Mit dieser gings noch…Dafür musste ich aber ein Downgrade durchführen und anschliessend das Paket auf „halten“ setzen:

sudo apt-get install grafana=7.5.10
sudo apt-mark hold grafana
sudo vi /etc/grafana/grafana.ini
# Grafana soll als eingebettetes Frame angezeigt werden können:
allow_embedding = true
[auth.anonymous]
# enable anonymous access
enabled = true

# specify organization name that should be used for unauthenticated users
org_name = Home

# specify role for unauthenticated users
org_role = Viewer

# mask the Grafana version number for unauthenticated users
hide_version = false
[date_formats]
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/

# Default system date format used in time range picker and other places where full time is displayed
full_date = DD-MM-YYYY HH:mm:ss

# Used by graph and other places where we only show small intervals
interval_second = HH:mm:ss
interval_minute = HH:mm
interval_hour = DD/MM HH:mm
interval_day = DD/MM
interval_month = MM-YYYY
interval_year = YYYY
default_timezone = Europe/Zurich

Telegraf installieren

Telegraf wird benutzt um die Modbus-Daten abzufragen und nach influxdb zu senden.

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -

source /etc/lsb-release  / ODER source /etc/armbian-release

echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
sudo service telegraf start

Damit läuft telegraf zum aktuellen Zeitpunkt mit Version 1.20.0. Diese Version scheint mit den Versionen von Grafana und Influxdb sehr gut zu funktionieren (nach rund 2 Monaten Test). Ich halte deswegen auch hier an dieser Version fest:

sudo apt-mark hold telegraf

Influxdb als output plugin konfigurieren

DB und User auf influxdb erstellen

influx -username 'admin' -password '<password>'
CREATE DATABASE "telegraf"
CREATE USER "telegraf" WITH PASSWORD "<userpassword>"
GRANT ALL ON "telegraf" TO "telegraf"

Konfig anpassen

sudo vi /etc/telegraf/telegraf.conf
[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"] #influxdb und telegraf laufen auf dem selben server
database = "telegraf"
## HTTP Basic Auth
username = "telegraf"
password = "<password>"

Modbus als input plugin konfigurieren

sudo vi /etc/telegraf/telegraf.conf

Alle input Plugins (CPU, etc.) deaktivieren. Anschliessend Modubs konfigrieren:

[[inputs.modbus]]
name = "SE_PowerTagLink_F21"
slave_id = 150
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Garage - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]}
]
[[inputs.modbus]]
name = "SE_PowerTagLink_Hauszuleitung"
slave_id = 154
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Hauszuleitung - Current A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [2999,3000]},
{ name = "PowerTag_Hauszuleitung - Current B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3001,3002]},
{ name = "PowerTag_Hauszuleitung - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]},
{ name = "PowerTag_Hauszuleitung - Voltage A-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3027,3028]},
{ name = "PowerTag_Hauszuleitung - Voltage B-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3029,3030]},
{ name = "PowerTag_Hauszuleitung - Voltage C-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3031,3032]},
{ name = "PowerTag_Hauszuleitung - Voltage A-B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3019,3020]},
{ name = "PowerTag_Hauszuleitung - Voltage B-C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3021,3022]},
{ name = "PowerTag_Hauszuleitung - Voltage C-A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3023,3024]},
{ name = "PowerTag_Hauszuleitung - Active Power", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3059,3060]},
{ name = "PowerTag_Hauszuleitung - Power Factor", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3083,3084]},
{ name = "PowerTag_Hauszuleitung - Active Energy No reset", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3203,3204,3205,3206]},
{ name = "PowerTag_Hauszuleitung - Active Energy Resetable", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3255,3256,3257,3258]},
{ name = "PowerTag_Hauszuleitung - Active Energy Write Value", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3259,3260,3261,3262]}
]

Chronograf installieren

Chronograf eignet sich als Query-GUI auf die Influxdb und bietet GUI Unterstützung beim erstellen von InfluxQL und Flux Queries

sudo apt-get install chronograf

Anschliessend Browser URL von chronograf öffnen

http://grafana.home.arpa:8888/

Commands

Zeige influxdb version

influxd version

Login

influx -username <username> -password <password>

Benutzer anzeigen

show users

Zeige alle DBs

show databases

Zeitserie löschen (Beispiel)

DROP SERIES FROM "rawdata" WHERE "name" = 'XTH_U01-01 humidity'

 

Links

 

Raspberry Pi – Reboot wenn kein Netz / Linux Watchdog

Ich verwende diverse Raspberry PIs als IOT Gerät. In seltenen Fällen kommt es vor, dass der Raspberry PI die Netzwerk-Verbindung verliert. Dies nicht nur bem wlan0- sondern auch beim eth0-interface. Ich konnte bis jetzt nicht herausfinden, wieso das passiert. Es kommt aber alle 4-6 Monate mal vor. Da die Ursachenforschung zu aufwändig ist, löse ich dieses Problem mit dem Linux-Watchdog.

Watchdog ist ein Linux-Demon, der das OS geordnet neu startet, wenn ein Test fehlschlägt.

Installation Watchdog

sudo apt-get install watchdog

Backup watchdog Config

sudo cp /etc/watchdog.conf /etc/watchdog.conf.backup

Konfiguration Watchdog:

sudo vi /etc/watchdog.conf 

ping = 192.168.1.1  # Ziel-IP-Adresse des Ping-Tests (z.B. Router) 
interface = wlan0   # Schnittstelle wlan0 verwenden
retry-timeout = 180  # Startet neu, wenn ein Test länger als 180 Sekunden fehlschlägt
interval = 5        # Teste alle 5s

Nach einem restart wird watchdog die IP über das entsprechende interface regelmässig testen. Wenn die Ziel-IP nicht antwortet, wird der Raspberry Pi neu gestartet.

Reminder bei Login

Um nicht zu vergessen, dass diese Logik implementiert ist, gebe ich bei jeder Anmeldung an das System (mit dem User pi) eine Info-Meldung aus:

sudo vi /home/pi/.profile
echo " "
echo "************************************************"
echo "Warnung: Wenn das Netzwerk ausgefallen ist, wird dieses System neu gestartet."
echo "Kommentieren Sie die Zeile ping = 192.168.1.1 aus /etc/watchdog.conf aus, um Neustarts zu vermeiden."
echo "************************************************"
echo " "

Status von Watchdog

sudo service watchdog status

 

 

 

Grafana TV-Mode: Einblenden „Variablen Dropdown Box“

Ich habe für meine Energie-Verwaltung ein Grafana-Dashboard gebaut (Grafana Version 7.5.10). Dabei lässt sich über ein Variablen-Dropdown die Sicherung auswählen (Sehr cooles Grafana-Feature). Das Dashboard binde ich so als iFrame in einer anderen Visualisierung ein. Dafür bietet Grafana verschiedene View-Modi an. Ich vernde den TV-Modus. Dabei werden die Grafana-Menu Icons ausgeblendet.

Leider blendet Grafana im TV-Modus auch diese Dropdown Liste der Variablen mit aus:

Eine Lösung dafür habe ich hier gefunden:

Unter dem Folder

/usr/share/grafana/public/build/

findet man zwei css-Dateien

grafana.dark.<nummer>.css 
grafana.light.<nummer>.css

Bei diesen beiden Files folgendes anhängen

.view-mode--tv .submenu-controls{display: flex !important}

Nun wird die Variablen Drobdown Liste auch im TV-Mode angezeigt:

=> ACHTUNG: Ctrl+F5 nicht vergessen. Sonst wird womöglich noch das alte CSS geladen 😉

DNS Leak – Test

Ich betreibe eine eigene OpnSense Firewall. Auf der OpnSense werkelt ein VPN-Client, der den ganzen Internet-Traffic verschlüsselt über einen VPN-Anbieter routet. Bei einer solchen Konfiguration ist es wichtig, den DNS-Server mit zu berücksichtigen.  Dies, weil die Anfragen an den DNS-Server natürlich auch von den ISPs überprüft werden können. Es ist also in diesem Falle empfehlenswert einen DNS-Server zu wählen, dem man auch (genaus wie dem VPN-Anbieter) vertraut. Welcher DNS-Server verwendet wird ist jedem selber überlassen (DNS-Sammlung). Beispiele:

Sobald der DNS-Server konfiguriert ist, kann über folgenden Dienst überprüft werden, ob wirklich nur noch der gewünschte DNS-Server getriggert wird bzw. keine DNS-Leaks bestehen.

https://www.dnsleaktest.com

Was ein DNS-Leak genau ist, wird hier schön beschrieben.

OPNsense Blacklist mit Spamhaus Droplists

Mittels OPNsense ist es auf einfache Art und Weise möglich, „bösartige“ IPs (z.B. basierend auf Spamhaus) zu blockieren.

Blacklists mit OPNsense

  1. Alias mit den Blacklisten erstellen
  2. Firewall Regel erstellen
    Alle Rule-Tabs mit Ausnahme von „Floating“ sind nur für den eingehenden Datenverkehr vorgesehen. Wir wollen aber sowohl eine ausgehende als auch eingehende Filterung erreichen. Dies kann über eine „Floating-Regel“ erreicht werden:

 

Links

Fusion360 Grafik nach sweethome3d

  • Wenn Materialien in Sweethome3d verändert werden sollen, müssen die zu verändernden Bereiche als Komponente in Fusion360 vorhanden sein.
  • Anschliessend in Funsion360 > Export > als STEP exportieren
  • Dann das File in FREECAD importieren
  • Ctrl – A (alles markieren)
  • Nun FreeCAD > Exportieren > als Collada (dae) File
  • Das File nun in Sweethome 3d importieren. Nun können die Farben der Komponenten angepasst werden.

Octopi über Spacelynk (lua) ausschalten

Ich betreibe meinen 3D Drucker über einen Octopi. Die ganze Printlandschaft kann ich über einen Shelly-Switch einschalten. Das ausschalten ist aber etwas kniffliger, weil Octopi zuerst sauber ausgeschaltet (shutdown) werden muss, bevor der Shelly-Switch den Strom komplett ausschalten kann.

 

Dazu verwende ich die API, welche von Octopi zu verfügung gestellt wird:

  • API CORS muss aktiviert sein
  • User muss über System rechte verfügen
  • API-Key muss unter dem User erstellt werden. Dieser kann dann für den Post-Request verwendet werden

Folgender Postrequest restartet den server:

curl --location --request POST 'http://octopi.home.arpa/api/system/commands/core/reboot?Host=spacelynk.home.arpa' \

--header 'X-Api-Key: xxxxxxxxxx'

 

Opnsense: VPN Client wechseln

Ich betreibe auf der Opnsense einen OpnVPN Client, der sich mit einem VPN-Anbieter verbindet. Der VPN-Anbieter bietet mehrere Server an, auf welche man connecten kann. Diese können hier definiert werden:

Der VPN-Anbieter ist als Gateway konfiguriert. Um sicherzustellen, dass das Gateway den korrekten Client verwendet, muss dieser in den Assignments zugewiesen werden. Wobei das System pro konfigurierten Client automatisch ein „Network-Port“ erstellt. In diesem Beispiel ist mit „ovpnc3“ die „ExpressVPNClient Switzerland1“ gemeit. Das muss man leider wissen:

  • „ovpn“ = es handelt sich um openvpn
  • c = es handelt sich um einen client (s wäre server)
  • 3 = fortlaufende Nummer.