Benachrichtigungen
Alles löschen

Iskra MT175 Daten in Grafana visualisieren

15 Beiträge
2 Benutzer
0 Reactions
1,598 Ansichten
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Hallo zusammen,

mein Projekt schreitet voran, aber an einem Punkt komme ich nicht weiter und benötige eure Hilfe.
Kurz zum Setup:
Aufm Raspi habe ich ioBroker / MQTT-Server, Grafana, InfluxDB usw. installiert, alles läuft soweit.
Ich bekomme über diverse Adapter im ioBroker die Daten von einigen ESP8266 mit Tasmota per MQTT eingebunden und auch
mit Grafana visualisiert. Die Daten des Growatt hole ich mir auch aus der Cloud, speichere sie in InfluxDB usw....

Ich möchte zwecks Steuerung und Diagnose den Stromzähler ebenfalls auslesen, die Daten in InfluxDB speichern und mittels Grafana visualisieren.
Auf dem Stromzähler (Iskra MT175) sitzt ein selbsgebauter Optokopf, der an einen ESP8266 angeschlossen ist, auf dem läuft Tasmota.
Tasmota hab ich mit der SML-Erweiterung kompiliert, funktioniert soweit prima.

Der ESP8266 sendet die Daten per MQTT an den ioBroker, von dort werden die Daten in die InfuxDB geschrieben.
Das scheint soweit zu funktionieren. Das einzige ist, ich bekomme die Daten aus der DB nicht visualisiert.
Es kommt immer die Fehlermeledung "no data", obwohl die Daten definitiv in die Datenbank geschrieben werden.

Der einzige auffällige Unterschied ist, dass die einzelnen Werte für P, L1, L2, L3 usw von Tasmota in einem "String" geliefert werden.
Es gibt nur einen einzigen Objekt "Sensor" und nicht wie bei anderen MQTT-Geräten für jeden Wert ein eigenes Objekt.

Wenn ich mir im ioBroker die Verlaufsdaten im Datenexport in InfluxDB anschaue, dann sehen die einzelnen Werte OK aus.

Ich weiß nicht wie ich es erklären soll, was Software anbetrifft bin ich absoluter Laie.
Wie muß ich Grafana konfigurieren, damit die die Daten eingelesen bekomme?
Anbei ein paar Screenshots zur Veranschaulichung.
Ich habe schon einige Tutorials durch, aber eine Lösung für mein Problem konnte ich bis jetzt nicht finden.
Ich hoffe auf Eure Unterstützung.
Mein Dank im Voraus


   
Zitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Ohne Gewähr: Das sind JSON-Strings. Die bekam ich von einer liefernden Instanz auch. Wurden 1:1 so weggeschrieben. Aber sind so nicht 1:1 zur Auswertung verfügbar.

Meine Lösung war, ein Skript aufzusetzen, was diese Strings parst, und dann erst diese geparsten Werte wegzuschreiben. Sprich: Die JSON-Strings werden erst interpretiert und nur das interpretierte Ergebnis weggeschrieben.


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

So was hab ich mir schon gedacht, aber wie und womit kann ich das Problem lösen? Gibt es für so was irgend eine Anleitung?
Danke dir


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Ich habe aktuell leider grad keinen Zugriff auf besagten ioBroker und aus dem Kopf nicht mehr alle Details zur Hand. Leg mir aber für morgen nen Termin an, um nachzuschauen.


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Du benötigst:
1. Adapter "Skriptausführung"
2. Deinen Datenpunkt aus "Objekte", der den JSON-String enthält (im Beispielbild mqtt.0.tele.tasmota.SENSOR)
3. einen eigenen Datenpunkt (im Beispielbild 0_userdata.0.LK13BE.CurrentConsumption)

Mit eingerichtetem Adapter Skriptausführung unter Menü Skripte ein neues Skript anlegen. Das Beispielskript agiert bei jeder Änderung des Quelldatenpunkts, parst dessen JSON-Daten und schreibt jene geparsten Informationen auf entsprechende Zieldatenpunkte.

Unter Objekte die Zeile des Zieldatenpunkts suchen und über das Zahnrad die Protokollierung in die Datensenke (History, InfluxDB, ...) aktivieren.

Ab dem Zeitpunkt werden in der Datensenke direkt auswertbare Informationen abgelegt.


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Hallo Kolja,

danke für die schnelle Antwort. Ich bin schonen einen Schrit weiter, scheitere aber mal wieder an mir selbst. LoL
Adapter ist installiert, möchte ich ein neues Script erstellen, kommt erstmal eine Abfrage nach Art des Scriptes:

Wähle ich z.B. Blockly aus, weil inhaltlich am naheliegensten, so komme ich zum grafischen Editor:

Alle andren Varianten sind auch grafische Editoren, daher komme ich irgendwie nicht weiter.
An sich wäre es nicht verkehrt mit einem grafischen Editor, da es für mich einfacher umsetzbar wäre.
Aber ohne Schritt für Schritt Anleitung bin ich aufgeschmissen 😕

Das ganze scheint doch nicht so einfach zu sein, wie es so oft behauptet wird....
Könntest du mir deinen Script als Text zusenden und nicht als Screenshot? So komme ich viel schneller zum Ziel.
EDit: Unter Javascript komme ich zum Scripteditor, aber ich scheitere daan erneut.......
Danke dir


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Schick ich Dir nachher.


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Variante JS für JavaScript-Code


on({id: 'mqtt.0.tele.tasmota.SENSOR', change: "any"}, function (obj) {

var CurrentConsumption;
var Time;

//der try ist wichtig das der adapter nicht abschmiert bei einem fehler, hiermit pasen wird die json in ein object
try {
obj = JSON.parse(getState('mqtt.0.tele.tasmota.SENSOR').val);

CurrentConsumption = (obj['LK13BE']['current']) ? obj['LK13BE']['current'] : undefined;
//Time = (obj['Time']) ? obj['Time'] : undefined;

if (CurrentConsumption) {
setState('0_userdata.0.LK13BE.CurrentConsumption', (CurrentConsumption));
}
} catch (e) {
console.error('Cannot parse: ' + getState('mqtt.0.tele.tasmota.SENSOR').val);
return;
}
});

Solltest Du damit nicht zurechtkommen,
- leg in Objekte Deine gewünschten Zieldatenpunkte an
- stell hier die Namen Deiner Zieldatenpunkte + einen kompletten JSON-String (wie Du ihn vom ISKRA erhältst) ein

Ich kann später schauen, daß ich Dir obigen Code anpasse, falls es bei Dir nicht klappt.


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Ich habe alles probiert, ich glaube, ich bin zu blöd dafür 😕
Ich poste hier mir alle bekannten Daten, vielleicht kannst du mir vielleicht exemplarisch für eine der 5 bekannten Größen ein Scrip zusammenbauen.
So sehen die MQTT-Telegramme aus:
18:54:22.680 MQT: MT175/SENSOR = {"Time":"2022-11-20T18:54:22","MT175":{"P":114.00}}
18:54:22.697 MQT: MT175/SENSOR = {"Time":"2022-11-20T18:54:22","MT175":{"L1":26.00}}
18:54:22.718 MQT: MT175/SENSOR = {"Time":"2022-11-20T18:54:22","MT175":{"L2":80.00}}
18:54:22.738 MQT: MT175/SENSOR = {"Time":"2022-11-20T18:54:22","MT175":{"L3":8.00}}

Die werden zyklisch alle 3 Sekunden erzeugt. Es ist die momentane Leistung saldiert (P) und für jede Phase einzeln.
Positive Werte sind Netzbezug, negative Einspeisung.
Immer wenn sich der Zählerstand ändert ( für Netzbetzug oder Einspeisung) sieht das Telegramm so aus:
{"Time":"2022-11-20T19:01:08","MT175":{"E_in":5329.1,"E_out":402.3,"P":137.00,"L1":50.00,"L2":79.00,"L3":7.00}}
E_in ist Netzbezug, E_out ist der Einspeisezähler.

Ich nehme an, dass ich für jeden der 5 Größen einen Script anlegen muss. Wenn ich ein Beispiel habe, sollte der Rest auh für mich machbar sein.
Soweit wie im Screenshot bin ich schon gekommen:

Ich weiß aber nicht, wo welche Variable ich einsetzen soll.

Du bist mein Held, vielen Dank für deine Hilfe Grin


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Kommen die MQTT-Nachrichten bzgl. der einzelnen Kriterien alle einzeln (P, L1, ...) an oder kommt eine Nachricht an, die dann alle Werte gleichzeitig enthält?

Respektive: Wenn Du unter Objekte Dich zu dem Datenpunkt hinhangelst, hast Du dann einen Datenpunkt, der
a) alle Werte zeitgleich in einem JSON-String enthält? Oder
b) kommt mal der eine, mal der andere Wert im JSON-String an?

Dort kannst Du Dir auch den Namen des Datenpunkts kopieren -> ich gehe jetzt mal von folgendem aus:

Quelle: Die JSON-Daten kommen über den Datenpunkt mqtt.0.MT175.SENSOR
Ziel: Du hast Dir in den Objekten einen eigenen Ober-Datenpunkt mit mehreren Unterpunkten angelegt. Bsp.

0_userdata
0
MT175
P
L1
L2
L3

Wenn es nur einen Quell-Datenpunkt gibt, benötigst Du ein Skript

on({id: 'mqtt.0.MT175.SENSOR', change: "any"}, function (obj) {

var P;
var L1;
var L2;
var L3;

try {
obj = JSON.parse(getState('mqtt.0.MT175.SENSOR').val);

P = (obj['MT175']['P']) ? obj['MT175']['P'] : undefined;
L1 = (obj['MT175']['L1']) ? obj['MT175']['L1'] : undefined;
L2 = (obj['MT175']['L2']) ? obj['MT175']['L2'] : undefined;
L3 = (obj['MT175']['L3']) ? obj['MT175']['L3'] : undefined;

if (P) {
setState('0_userdata.0.MT175.P', P);
}
if (L1) {
setState('0_userdata.0.MT175.L1', L1);
}
if (L2) {
setState('0_userdata.0.MT175.L2', L2);
}
if (L3) {
setState('0_userdata.0.MT175.L3', L3);
}
} catch (e) {
console.error('Cannot parse: ' + getState('mqtt.0.MT175.SENSOR').val);
}
});

Gesetzt den Fall, obiges Skript würde funktionieren, solltest Du in obiger Struktur (0_userdata.0.MT175) unter Objekte im Takt der reinkommenden MQTT-Nachrichten aktualisierte Werte vorfinden.

Wasser marsch...


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Sorry für die späte Antwort, bin gestern sehr früh eingeschlafen.
Habe es so umgesetzt und was soll ich sagen es funktioniert Grin

Die Daten von P und Lx werden geschrieben.
Um auf deine Frage zu kommen:
Die Telegramme sehen so aus wie gepostet und es trifft beides zu.
Wenn der Zählerstand sich nicht ändert, dann kommen 4 Telegramme hintereinander, je eins für P und Lx
Wenn sich der Zählerstand ändert, dann kommt ein langes Telegramm mit allen 6 Werten.
Im Sinne deiner Frage also sowohl als auch.
Ich habe jetzt nur ein Script für alle 4 Werte und es funktioniert dennoch, klingt auch logisch.
Es wird ja jedes Telegramm geparst und wenn der entsprechende String nicht kommt, wird es verworfen.
So verstehe ich es.

Jetzt nur noch ergänzen für die Werte E_in und E_out.
Ich probiere es selbst und werde berichten.

DANKE DANKE DANKE


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Es funktioniert Grin Grin Grin

So wie du es gelöst hast, habe ich noch keine Anleitung finden können.
Aber es erscheint mir sinnvoll, da so oder so ähnlich auch für andere Daten anwendbar.
Ich habe z.B. noch eine 25 Jahre alte Gasheizung, die Regelung ist einfach grottenschlecht,
da möchte ich in Zukunft raumtemperaturgesteuert die Therme regeln.
Ich denke, das sollte auch auf diese Art und Weise klappen.
Ich danke dir vielmals für die Unterstützung.
Möge immer die Sonne auf deine Module scheinen Mr. Green


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Das einizig auffällige ist, dass das Log sehr schnell anwächst, da andauernd was geschrieben wird.
Hier mal ein Screenshot:

Ist das was dabei, was behoben werden sollte?
Sonst ändere ich das logging auf "Error", damit das Log nicht vollgeschrieben wird.


   
AntwortZitat
(@kolja)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 29
 

Mein Code ist extra so gebaut, daß er tolerant gegenüber entweder alle oder einzelne Werte agiert.

Der Code selbst ist pures JavaScript ohne jedwede Typisierung. Könnte es sein, daß Du die Datenpunkte unter Objekte mit Typ string angelegt hast (ich weiß aus Stand nicht, ob man dort typisieren kann)? Falls ja, müßtest Du dort auf irgendwas Richtung number, int oder so ähnlich wechseln.

PS: Gern geschehen und war mir eine Freude ;).


   
AntwortZitat
(@hoschiking)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 81
Themenstarter  

Das hatte ich mir schon gedacht und den Typ auf Number geändert, der Log ist jetzt ruhig 😀
Danke


   
AntwortZitat
Teilen: