Ich habe nach einer einfachen Möglichkeit gesucht die Daten von einem Tasmota Gerät mit Grafana zu visualisieren. Einfach ist hier immer so eine Sache, denn hier muss man immer etwas dazwischen schalten, was die Daten mittels MQTT abgreift und dann in eine Datenbank schiebt. In der Regel wird immer zu einer fertigen Lösung wie Homeassistant, ioBroker, OpenHab oder NodeRED geraten. Ich hatte aber kein Bock auf die Lösungen und hab nach einem einfachen Skript gesucht welches genau diese Anforderungen erfüllt. Tadaaa… Python Skript steht unten.
Voraussetzungen für diese Skript Lösung
Da deine Tasmota Dose über das MQTT Protokoll spricht, brauchst du einen laufenden Mosquitto Server. Dieser wird für die Kommunikation zwischen Tasmota Dose und den Skript benötigt. Und natürlich muss eine Datenbank vorhanden sein, wo die Daten abgelegt werden. In meinem Falle habe ich mich für eine InfluxDB entschieden, da diese einfach in der Handhabung ist, aber auch mit großen Datenmengen super umgehen kann.
- Mosquitto Server – Port 1883
- InfluxDB – Port 8086
Im folgenden Bild könnt Ihr auch erkennen, dass ich bei mir das MQTT Topic auf „shellies“ umgestellt habe. Also alle Shellys sollen zukünftig in diesem Topic senden, damit auch alle in die Datenbank aufgenommen werden. Natürlich sollte sich der TopicNAME / Gerätename sich zwischen euren verschiedenen Dosen unterscheiden. Wenn Ihr ein anderes Full Topic wählt, müsst Ihr dies natürlich im Skript anpassen.
Das Skript muss natürlich auf einem System ausgeführt werden wo Python3 läuft. Also z.B. ein Raspberry Pi oder ein kleines Linux System, wie ein LXC Container unter Proxmox. Benötigt werden folgende Pakete.
apt install python3 python3-pip -y pip3 install paho-mqtt pip3 install influxdb
import re import json from typing import NamedTuple import paho.mqtt.client as mqtt from influxdb import InfluxDBClient INFLUXDB_ADDRESS = 'DEINE IP VON DER INFLUXDB' INFLUXDB_USER = '' INFLUXDB_PASSWORD = '' INFLUXDB_DATABASE = 'DB NAME' MQTT_ADDRESS = '192.168.10.20' MQTT_USER = '' MQTT_PASSWORD = '' MQTT_TOPIC = 'shellies/+/SENSOR' MQTT_REGEX = 'shellies/([^/]+)/([^/]+)' MQTT_CLIENT_ID = 'MQTT_InfluxDB_Bridge' MQTT_FIELDS = [ 'ApparentPower', 'Current', 'Voltage', 'Power', 'ReactivePower', 'Factor' # hier weitere relevante auflisten ] influxdb_client = InfluxDBClient(INFLUXDB_ADDRESS, 8086, INFLUXDB_USER, INFLUXDB_PASSWORD, None) class SensorData(NamedTuple): location: str measurement: str value: float def on_connect(client, userdata, flags, rc): """ The callback for when the client receives a CONNACK response from the server.""" print('Connected with result code ' + str(rc)) client.subscribe(MQTT_TOPIC) def _parse_mqtt_message(topic, payload): #print(payload) match = re.match(MQTT_REGEX, topic) if match: location = match.group(1) measurement = match.group(2) if measurement == 'status': return None #return SensorData(location, measurement, float(payload)) print(payload) payload = json.loads(payload) for field in MQTT_FIELDS: yield SensorData(location, field, float(payload["ENERGY"][field])) else: return None def _send_sensor_data_to_influxdb(sensor_data): json_body = [ { 'measurement': sensor_data.measurement, 'tags': { 'location': sensor_data.location }, 'fields': { 'value': sensor_data.value } } ] influxdb_client.write_points(json_body) def on_message(client, userdata, msg): """The callback for when a PUBLISH message is received from the server.""" print(msg.topic + ' ' + str(msg.payload)) sensor_data_sets = _parse_mqtt_message(msg.topic, msg.payload.decode('utf-8')) if sensor_data_sets is None: print("Couldn't parse sensor data!") return for sensor_data in sensor_data_sets: _send_sensor_data_to_influxdb(sensor_data) def _init_influxdb_database(): databases = influxdb_client.get_list_database() if len(list(filter(lambda x: x['name'] == INFLUXDB_DATABASE, databases))) == 0: influxdb_client.create_database(INFLUXDB_DATABASE) influxdb_client.switch_database(INFLUXDB_DATABASE) def main(): _init_influxdb_database() mqtt_client = mqtt.Client(MQTT_CLIENT_ID) mqtt_client.username_pw_set(MQTT_USER, MQTT_PASSWORD) mqtt_client.on_connect = on_connect mqtt_client.on_message = on_message mqtt_client.connect(MQTT_ADDRESS, 1883) mqtt_client.loop_forever() if __name__ == '__main__': print('MQTT to InfluxDB bridge') main()
6. Mai 2022 um 14:55 Uhr
pip3 install paho-mqtt
nicht
pip3 install maho-mqtt
Beste Grüße
7. Mai 2022 um 09:21 Uhr
Hab ich angepasst, vielen Dank!
7. Mai 2022 um 11:12 Uhr
Ich nutze zwar ioB dafür (war für mich einfacher), aber ist Interessant auch andere Wege zu sehen um ans Ziel zu kommen.
25. September 2022 um 16:26 Uhr
Que es ioB? no encuentro información, puedes ser más especifico ?
27. September 2024 um 10:03 Uhr
ioB se llama ioBroker. aplicación smarthome.
17. Juli 2022 um 16:29 Uhr
Hallo,
Danke für den sehr interessanten Beitrag. Ich möchte dies auch aufbauen.
Beim Bestellen der Sensoren bin ich etwas stutzig geworden.
In der Beschrebung dieses A1t Nous steht „Tosmata nicht mehr unterstützt“.
https://amzn.to/3BQZ76i
Können sie mir sagen ob dies das richtige Produkt ist was ich bestellen sollte?
Danke,
Gruß
Robert
2. August 2022 um 22:17 Uhr
Hier gibts den auch pre-flashed: https://amzn.to/3w4JEMD
5. August 2022 um 08:22 Uhr
Ja das ist es!
1. Oktober 2022 um 17:09 Uhr
WIe funktioniert das bei einer Docker Installation?
https://schroederdennis.de/tutorial-howto/shelly-tasmota-mqtt-node-red-influxdb-ins-grafana-dashboard-anleitung/
Danke LG Alex
1. Oktober 2022 um 19:24 Uhr
ok man braucht kein Script mehr , nur eine Erweiterung und dann gehts
https://github.com/DaveMDS/node-red-contrib-tasmota
5. Oktober 2022 um 17:40 Uhr
Wie führe ich das Python-script auf dem Raspberry aus?
Hab keinen LXC Container unter Proxmox.
Gibt es da einen Befehl?
Danke Gruß Steffen
5. Oktober 2022 um 20:25 Uhr
Du kannst es mit „sudo chmod +x dateiname“ ausführbar machen und dann mit „python dateiname“ ausführen.
Soweit mein gefährliches Halbwissen
LG
Sebastian
5. Oktober 2022 um 20:24 Uhr
Hallöle,
ich hab versucht das Script für meine influxdb die mit Buckets arbeitet zu adaptieren bin aber erst einmal schöner gescheitert. Naja.
Wie muss denn das Script angepasst werden damit anstelle der „alten“ Datenbanken die neuen Eimer verwendet werden?
Bitte um Hilfe!
LG und Danke
Sebastian
27. Januar 2023 um 14:34 Uhr
Hallo,
also die Anleitung ist natürlich toll. Aber ich habe jetzt sehr lange Grafana am Laufen. Dann habe ich mir 2 A1T besorgt und wollte diese dann ins Grafana schreiben lassen. Schon mein erster ESP8266 mit den Temparatursensoren habe ich direkt in die InfluxDB schreiben lassen. Aber schön ist das wirklich nicht. Nun wollte ich mit SimpleJson versuchen die Daten direkt von den A1T abzugreifen.
Die A1T gibt sogar eine Json mit den korrekten Daten aus……. aber es scheitert mal wieder an Grafana! Scheinbar benötigt das SimpleJson eine spezielle Formatierung. Und wie immer findet man im Grafana Wiki nur eine sehr allgemeine Erklärung. Ich will einfach keine 5 Container verwenden um Daten einfach in ein Programm schreiben zu lassen – wenn ich dann schon lese ESP-> mqtt-> nodered -> influxdb -> grafana frage ich mich wirklich, was man sich dabei denkt.
Und nun habe ich mal den Home-Assistant ausprobiert. Home-Assistant Container gestartet. Den Shelly hat er gleich erkannt. Für die beiden A1T noch den MQTT Client aktiviert und den mosquito Container gestartet als MQTT-Broker, IP hinterlegt und schon war alles im Home-Assistant. Und lokal. Wenn ich nun denke, dass ich selber ewig an der ersten ESP8266 Konfiguration gesessen bin und mir die Finger wund programmiert habe, bis es gut geklappt hat…..
Programmieren ist ja was schönes, aber ich will das Geräte möglichst einfach und am besten direkt kommunizieren. Dennoch schön zu sehen, dass man die Daten doch in die InfluxDB bekommt. Da die DB sowieso bei mir rennt, werde ich mir das auch noch ansehen. Danke für die Mühe und aufzeigen deiner Lösung.
Lg
Riddik
10. Februar 2024 um 14:22 Uhr
TOLL!
Schön erklärt. Etwas schnell gesprochen dabei, aber Wiedergabegeschwindigkeit runter und auch ICH komme mit.
Jetzt kommts::: Wie sieht denn das Script aus, das ich in Tasmota > Console > Edit Script eintragen muß, damit das der Tasmot selbst macht??
UND weiter:::
Wie bekomme ich die Grafana-Kacheln auf eine „Normale Webseite“, die ich auch nach außen zeigen kann?