FHEM über MQTT an Grafana

Begonnen von Meister_Petz, 06 Juli 2023, 09:45:37

Vorheriges Thema - Nächstes Thema

Meister_Petz

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

Du darfst diesen Dateianhang nicht ansehen.

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
}

rudolfkoenig

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.

Meister_Petz

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.

DigiNecro

#3
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.