Moin,
nachdem ich einen Weg gesucht habe, die Daten von FHEM in eine Cloud zu übergeben. Hab ich mir diesen Weg zusammengebaut:
Hinweis: Ich bin kein gelernter Programmierer und ich erhebe nicht den Anspruch, dass das eine optimale Lösung ist. Konstruktive Kritik nehme ich gerne entgegen!
FHEM -> Mosquitto MQTT <- Telegraf -> influxDB <- Grafana
Grafana.png
Der Docker sieht aus wie folgt: (beim ersten Start aber ohne Telegraf anfangen, damit man in der influxdb2 gleich den Token für Telegraf erstellen kann)
version: "3.8"
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
depends_on:
- influxdb
restart: unless-stopped
environment:
- GF_SERVER_ROOT_URL=https://<grafana>/
- GF_INSTALL_PLUGINS=grafana-clock-panel
ports:
- '3000:3000'
volumes:
- './grafana:/var/lib/grafana'
networks:
- influxdb
mosquitto:
image: eclipse-mosquitto:latest
container_name: mosquitto
depends_on:
- influxdb
restart: unless-stopped
ports:
- '1883:1883'
- '9001:9001'
volumes:
- './mosquitto:/mosquitto'
- './mosquitto/data:/mosquitto/data'
- './mosquitto/log:/mosquitto/log'
networks:
- influxdb
influxdb:
image: influxdb:2.7
container_name: influxdb
restart: unless-stopped
ports:
- '8086:8086'
volumes:
- './influxdb/data:/var/lib/influxdb2'
- './influxdb/config:/etc/influxdb2'
environment:
- DOCKER_INFLUXDB_INIT_MODE=${INFLUXDB_INIT_MODE}
- DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_INIT_USERNAME}
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_INIT_PASSWORD}
- DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_INIT_ORG}
- DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_INIT_BUCKET}
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_INIT_ADMIN_TOKEN}
- INFLUXD_LOG_LEVEL=${INFLUXD_LOG_LEVEL}
- TZ=${TZ}
networks:
- influxdb
telegraf:
image: telegraf
container_name: telegraf
depends_on:
- influxdb
restart: unless-stopped
volumes:
- './telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro'
networks:
- influxdb
ports:
- '8125:8125'
networks:
influxdb:
external: no
Environment Datei: .env
# InfluxDB Configuration
INFLUXDB_INIT_MODE=setup
INFLUXDB_INIT_USERNAME=<username>
INFLUXDB_INIT_PASSWORD=<password>
INFLUXDB_INIT_ORG=<organisation>
INFLUXDB_INIT_BUCKET=<bucketname>
INFLUXDB_INIT_ADMIN_TOKEN=<token>
# Timezone
TZ=Europe/Berlin
mosquitto.conf
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
## Authentication ##
#allow_anonymous true
allow_anonymous false
password_file /mosquitto/config/password.txt
# um die mosquitto passwort datei zu erstellen:
# docker compose exec mosquitto mosquitto_passwd -b /mosquitto/config/password.txt <user> <password>
#make restart
telegraf.conf
[agent]
hostname = "<"hier einen hostname setzen>"
[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
token = "<der influxToken für Telegraf>"
organization = "<organisation>"
bucket = "<bucketname>"
[[inputs.mqtt_consumer]]
servers = ["tcp://mosquitto:1883"]
username = "<mqtt username>"
password = "<mqtt passwort>"
topics = [
"mqttTOPIC/#"
]
data_format = "json"
name_override = "mqttTOPIC"
Das ist das Device, das die Daten an den MQTT Broker schickt:
define meinMQTT2Client MQTT2_CLIENT <mosquitto>:1883
attr meinMQTT2Client username <mqtt-username>
mit einem AT schicke ich die Daten über "meinMQTT2Client". Hier wird etwas umgebaut, damit ich eine JSON Nachricht an den MQTT Broker übergebe.
define mqttSend at +*00:00:30 {
my $var1=ReadingsVal("<Datenquelldevice>","var1,0);
my $var2=ReadingsVal("<Datenquelldevice>","var2,0);
my $var3=ReadingsVal("<Datenquelldevice>","var3,0);
my $MQTTTopic = "mqttTOPIC/Device";
$var1 ="\"var1\":".$var1."\,\n";
$var2 ="\"var2\":".$var2."\,\n";
$var3 ="\"var3\":".$var3."\n";
my $value = $var1.$var2.$var3;
my $left_bracket = chr(123);
my $right_bracket = chr(125);
my $message = $left_bracket."\n".$value.$right_bracket;
fhem("set meinMQTT2Client publish $MQTTTopic $message");
}
Die MQTT Nachricht sieht dann aus wie folgt:
MQTT Topix: mqttTOPIC/Device
MQTT Text:
{
"var1":123,
"var2":234,
"var3":456
}
Es waere nett die Begruendung fuer diese Loesung zu wissen: warum InfluxDB, warum schreibt FHEM nicht direkt in die Cloud-DB, bzw. warum Cloud ueberhaupt.
"FHEM mit Grafana" ist auch einfacher moeglich: es gibt ein FHEM InfluxDB Modul, und man kann in Grafana die Daten auch aus einem SQL-Datenbank ziehen, was ueber DbLog befuellt wird.
Zitat von: rudolfkoenig am 06 Juli 2023, 10:16:52Es waere nett die Begruendung fuer diese Loesung zu wissen: warum InfluxDB, warum schreibt FHEM nicht direkt in die Cloud-DB, bzw. warum Cloud ueberhaupt.
"FHEM mit Grafana" ist auch einfacher moeglich: es gibt ein FHEM InfluxDB Modul, und man kann in Grafana die Daten auch aus einem SQL-Datenbank ziehen, was ueber DbLog befuellt wird.
Nachdem ich die Daten über eine nicht zu tolle Internetleitung schicke, wollte ich keine direkte Datenbankverbindung. Könnte man natürlich auch testen. Zusätzlich gibt es mir aber die Möglichkeit auch andere Devices direkt an den MQTT Server Daten schicken zu lassen,l die ich nicht in FHEM brauche.
Zitatmosquitto:
depends_on:
- influxdb
Finde ich nicht besonders sinnvoll, da fhem von mosquitto abhängig ist, aber fhem komplett unabhängig von InfluxDB ist. Dadurch aber plötzlich schon.
Wobei es natürlich sein kann, dass die der Weg nach InfluxDB wichtiger ist, als der Weg zu FHEM.
In der Zeichnung ist es auch nicht so dargestellt.