OpenHAB InfluxDB aufräumen

Aus Laub-Home Wiki

Während man sich mit openHAB beschäftigt kommt es immer mal wieder dazu, das Items hinzu und aber auch gelöscht werden. Da ich bei mir alle Daten in die InfluxDB schreiben lasse, kommt es so zu einigen Leichen in der openHAB Influx Datenbank. Um diese aufzuräumen muss man die dementsprechenden Measurements in der InfluxDB löschen. Wie man dies manuell macht erkläre ich als erstes. Da ich nicht immer alle Schritte per hand machen möchte, habe ich untenstehendes Script geschrieben.

manuelles Aufräumen

Um das manuelle Aufräumen zu starten, sollten wir auf jeden Fall wissen welche Items wir aus der Datenbank löschen wollen. Dafür Verbinden wir uns als erstes an die Datenbank und lesen dann alle Measurements aus um diese dann ggf. mit der Liste in PaperUI zu vergleichen.

Hat man eine lokale installation laufen, oder nutz openHABian, dann kann man einfach mittels dieses Befehles sich an die InfluxDB verbinden:

influx

Nutz ihr Docker, wie ich, dann kann man dies so machen (ändert den Dockercontainer_Name ab):

docker exec -ti DOCKERCONTAINER_NAME influx

Nun ist man in der SQL Command line und sollte sich zunächst an die openHAB Datenbank verbinden. Bei mir heißt diese openhab_db:

# openhab Datenbank öffnen
use openhab_db

nun wollen wir uns eine Liste der verfügbaren Measurements ausgeben:

# verfügbare Measurements anzeigen
show measurements

nachdem wir nun verglichen haben und wissen welche Measurements wir aus der Datenbank löschen wollen, machen wir das mit diesen Befehlen:

# einzelnes Measurement löschen
drop measurement TEST
# oder 
drop series from TEST

# mehrere mittels REGEX loschen: löscht alles was TEST im Namen hat
drop series from /^*TEST*/

Item und Measurement Listen zum Vergleich erstellen

Item Liste aus openHAB auslesen:

curl -s -k -X GET --header "Accept: application/json" "https://localhost:8443/rest/items?recursive=false&fields=name" | sed 's/,/\n/g' | awk -F '"' '{ print $4}' | sort -n

Measurements Liste aus InfluxDB auslesen:

influx -host 'localhost' -port '8086' -database 'openhab_db' -execute 'show measurements' | tail +4 | sort -n

# Docker Variante
docker exec -ti DOCKERCONTAINER_NAME influx -host 'localhost' -port '8086' -database 'openhab_db' -execute 'show measurements' | tail +4 | sort -n

leitet man das Ganze nun in zwei Dateien um (items.txt measurements.txt), kann man diese mit dem folgenden diff Befehl vergleichen und bekommt nur die Measurements ausgegeben, zu denen es kein Item mehr gibt:

curl -s -k -X GET --header "Accept: application/json" "https://localhost:8443/rest/items?recursive=false&fields=name" | sed 's/,/\n/g' | awk -F '"' '{ print $4}' | sort -n > items.txt
influx -host 'localhost' -port '8086' -database 'openhab_db' -execute 'show measurements' | tail +4 | sort -n > measurements.txt

# prüft auf obsolete Measurements
diff -Zu items.txt measurements.txt | grep -i ^+[a-z,0-9] | cut -d '+' -f 2

Automatisches Aufräumen via Script

Will man wie ich sich nicht die Mühe machen, das Ganze ständig per hand zu machen, der kann das hier stehende Skript verwenden. Es macht alle Schritte, die auch oben beschrieben sind. Passt einfach die Variablen ggf, an eure Bedürfnisse an.

Den API Token für openHAB 3 bekommt ihr in der Main UI von openHAB. Hier eifach links unten auf euren User klicken und dann ganz nach unten zu den API Tokens scrollen. Generiert hier einen neuen und kopiert ihn hinter die Variable AUTH=

# InfluxDB Command
INFLUX="docker exec -ti openhab3_influxdb_1 influx"
# InfluxDB Host
INFLUXHOST=localhost
# openHAB Database
INFLUXDB=openhab_db
# openHAB API Authentification Token
AUTH="oh.yourtokenname.5dwffGdfeizb8P82bKQUh7epUXFnyRJ83pQJuzZlQVdj8BJdzwjTznZQkcK1sIysEWtrWQLf2RhTg"

Das Script ist hier bei githab verfügbar:

cd /usr/local/sbin/
wget https://github.com/alaub81/openHAB/raw/master/cleanup-openhab-influxdb.sh
chmod +x /usr/local/sbin/cleanup-openhab-influxdb.sh

hier das Script in Plain Text zum Copy and Pasten:


/usr/local/sbin/cleanup-openhab-influxdb.sh

#!/bin/bash
#########################################################################
#Name: cleanup-openhab-influxdb.sh
#Subscription: This Script deletes unused item entrys in the influxdb
#
#by A. Laub
#andreas[-at-]laub-home.de
#
#License:
#This program is free software: you can redistribute it and/or modify it
#under the terms of the GNU General Public License as published by the
#Free Software Foundation, either version 3 of the License, or (at your option)
#any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
#or FITNESS FOR A PARTICULAR PURPOSE.
#########################################################################
#Set the language
export LANG="en_US.UTF-8"
#Load the Pathes
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

#set the variables:

# Tempfolder
TMPDIR=/tmp/
# openHAB Server
OPENHABSERVER=localhost

# InfluxDB Command
INFLUX="docker exec -ti openhab_influxdb_1 influx"
# InfluxDB Host
INFLUXHOST=localhost
# openHAB Database
INFLUXDB=openhab_db
# openHAB API Authentification Token
AUTH="oh.yourtokenname.5dwffGdfeizb8P82bKQUh7epUXFnyRJ83pQJuzZlQVdj8BJdzwjTznZQkcK1sIysEWtrWQLf2RhTg"

# do the stuff
# generate Items list
curl -s -k -X GET --header "Accept: application/json" "https://$OPENHABSERVER:8443/rest/items?recursive=false&fields=name" -H "accept: application/json" -H "Authorization: Bearer $AUTH"  | sed 's/,/\n/g' | awk -F '"' '{ print $4$

# read Measurements from InfluxDB
$INFLUX -host $INFLUXHOST -port '8086' -database $INFLUXDB -execute 'show measurements' | tail +4 | sort -n > $TMPDIR/measurements.txt


for i in $(diff -Zu $TMPDIR/items.txt $TMPDIR/measurements.txt | grep -i ^+[a-z,0-9] | cut -d '+' -f 2); do
        $INFLUX -host $INFLUXHOST -port '8086' -database $INFLUXDB -execute "drop measurement $i"
        echo delete measurement: $i
done


rm $TMPDIR/items.txt
rm $TMPDIR/measurements.txt

zum Schluss nicht das Execute Recht vergessen:

chmod +x /usr/local/sbin/cleanup-openhab-influxdb.sh

gestartet wird es dann einfach via:

cleanup-openhab-influxdb.sh

InfluxDB 2 mit InfluxQL

Das ganze als Umbau für die InfluxDB v2 mit aktivierter InfluxQL findet ihr hier: