[vz-users] Daten auf MQTT Topics verteilen
Frank Richter
frank.richter83 at gmail.com
Mon Sep 24 23:26:36 CEST 2018
Für welchen Zählertyp liefert Push denn überhaupt mehr als 1 Tupel?
Grüße
Frank
Christian Wulff <christianwulff at gmx.de> schrieb am Mo., 24. Sep. 2018,
23:19:
> Moin,
>
>
>
> also wenn ich behilflich sein kann beim Testen, dann immer gerne.
>
> Das Problem ist nur, dass ich kein JavaScript kann, von MQTT keine Ahnung
> habe, von Linux sicher keine Ahnung habe, usw.
>
> Dennoch habe ich hier einiges zum Laufen bekommen mit Eurer Hilfe und
> Hilfe von Foren, wenn ich denn mal Zeit habe.
>
> Und von der Zeit habe ich leider auch nicht so viel. Deswegen dauert es
> meistens eine Weile.
>
>
>
> Ich hatte es ja zuerst ohne JSON node. Da hab ich gar nichts hinbekommen.
> Fehlermeldung: "SyntaxError: Unexpected token o in JSON at position 1"
>
> Dann habe ich den JSON node eingefügt und schon ging es fast.
> Fehlermeldung: "TypeError: Cannot read property '0' of undefined"
>
> Ich habe mit meinem Displayprojekt ja schon JSONs mit der ArduinoJSON
> Library geparst.
>
> Zu der Library gibt’s einen JSON Assistent:
> https://arduinojson.org/v5/assistant/
>
> Da habe ich die JSONs vom Push Server und vom VZLOGGER reingehauen und
> habe dann erkannt, dass es beim VZLogger ein kleines bisschen anders
> aufgebaut ist.
>
>
>
> Anstatt:
>
> var myUuid = myJsonObj.data.uuid;
>
> var myTimestamp = myJsonObj.data.tuples[0][0];
>
> var myValue = myJsonObj.data.tuples[0][1];
>
>
>
> habe ich dann:
>
> var myUuid = myJsonObj.data[0].uuid;
>
> var myTimestamp = myJsonObj.data[0].tuples[0][0];
>
> var myValue = myJsonObj.data[0].tuples[0][1];
>
> In den Funktion node geschrieben. Und schon läuft es ohne Fehler durch.
>
>
>
> Wenn ich das jetzt richtig durchblicke, wird so allerdings immer nur der
> erste Tuple des JSONs eingelesen, alle anderen nicht.
>
> Die anderen würden wohl mit
>
> var myUuid = myJsonObj.data[1].uuid;
>
> var myTimestamp = myJsonObj.data[1].tuples[0][0];
>
> var myValue = myJsonObj.data[1].tuples[0][1];
>
> usw. eingelesen werden.
>
>
>
> Jetzt müsste man irgendwie eine Schleife programmieren, die immer alle
> Tuples aus einem JSON ausgibt.
>
> Aber da hab ich leider wieder keinen Plan wie das geht L
>
>
>
> Ich wollte ja auch nur meine drei Stromzähler über den VZLOGGER an MQTT
> pushen. Die Stromzählerwerte kommen einzeln raus, daher funktioniert das
> jetzt provisorisch bei mir.
>
> Schöner wäre es natürlich wenn ich alle Werte aus den JSON rauskriegen
> würde, und nicht nur den ersten Wert.
>
>
>
> Liebe Grüße,
>
> Chris
>
>
>
>
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Montag, 24. September 2018 21:30
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] Daten auf MQTT Topics verteilen
>
>
>
> Hi Christian,
>
>
>
> der Vorschlag von Matthias macht durchaus Sinn, das wäre der direkte Weg.
> Ich hab allerdings noch keine eigene Erfahrung mit MQTT via vzlogger,
> deswegen kann ich da nicht helfen. Aber Matthias freut sich sicher über
> Tester :-)
>
> Den vzlogger kannst du wahrscheinlich auch auf dem alten Image neu
> compilieren. Aber irgendwann musst du halt auch mal upgraden, wenn du neue
> Features willst.
>
>
>
> Ansonsten: lass den JSON-Node weg, das ist kontraproduktiv. Der Function
> Node erwartet ein Objekt, keinen String.
>
>
>
> Grüße
>
> Frank
>
>
>
> Am 24.09.2018 9:07 nachm. schrieb "Christian Wulff" <christianwulff at gmx.de
> >:
>
> Hallo Matthias,
>
>
>
> ich habe mir deine verlinkte Seite mal angesehen.
>
> Verstanden habe ich davon aber nix, oder nur minimal rudimentär.
>
> Weitergebracht hat mich das jetzt leider nicht.
>
> Da die Posts vom August diesen Jahren kommen, vermute ich dass es mir auch
> nichts hilft.
>
> Meine VZ Installation ist aus ~Oktober 2016.
>
>
>
> @Frank:
>
>
>
> Ich habe jetzt mal testweise in Node-RED hinter den [post] /vzpush node
> einen json node drangehängt.
>
> Nun wird schon mal aus dem JavaScript Object ein JSON String (ich vermute
> das hilft)
>
> Dann habe ich einen Funktionsknoten mit dem gleichen Code dahintergehängt,
> der bei dem VZ Push Server funktioniert:
>
>
>
> var uuidMap = {
>
>
> 'xxxxxxxx-1111-xxxx-xxxx-xxxxxxxxxxxx':{topic:'Haus/Strom/Haus'},
>
> ' xxxxxxxx-2222-xxxx-xxxx-xxxxxxxxxxxx
> ':{topic:'Haus/Strom/WärmepumpeHaupttarif'},
>
> ' xxxxxxxx-3333-xxxx-xxxx-xxxxxxxxxxxx
> ':{topic:'Haus/Strom/WärmepumpeNebentarif'},
>
> ' xxxxxxxx-4444-xxxx-xxxx-xxxxxxxxxxxx
> ':{topic:'Haus/Temperatur/T01Aussen'},
>
> };
>
>
>
> // Parse JSON
>
> var myJsonObj = [];
>
> var myJsonObj = JSON.parse(msg.payload);
>
>
>
> // Get UUID, timestamp and value
>
> var myUuid = myJsonObj.data.uuid;
>
> var myTimestamp = myJsonObj.data.tuples[0][0];
>
> var myValue = myJsonObj.data.tuples[0][1];
>
>
>
> if (uuidMap[myUuid] !== undefined) {
>
> // Create output payload
>
> var myOutput = {};
>
> myOutput.topic = uuidMap[myUuid]['topic'];
>
> myOutput.payload = myValue;
>
> return myOutput;
>
> }
>
>
>
> Dann bekomme ich allerdings die Fehlermeldung:
>
> "TypeError: Cannot read property '0' of undefined"
>
> Und nun verlassen sie mich, ich finde nicht heraus wo der Fehler liegt.
>
> Kann da jemand weiterhelfen?
>
>
>
> Danke und liebe Grüße,
>
> Chris
>
>
>
> P.S.: Die JSON Strings sehen z.B. so aus:
>
> {
>
> "data": [
>
> {
>
> "uuid": "xxxxxxxx-1111-xxxx-xxxx-xxxxxxxxxxxx",
>
> "tuples": [
>
> [
>
> 1537815350021,
>
> 13875.6
>
> ]
>
> ]
>
> }
>
> ]
>
> }
>
>
>
> Oder so:
>
> {
>
> "data": [
>
> {
>
> "uuid": "xxxxxxxx-2222-xxxx-xxxx-xxxxxxxxxxxx",
>
> "tuples": [
>
> [
>
> 1537815406656,
>
> 12309.5
>
> ]
>
> ]
>
> },
>
> {
>
> "uuid": "xxxxxxxx-3333-xxxx-xxxx-xxxxxxxxxxxx",
>
> "tuples": [
>
> [
>
> 1537815405848,
>
> 13683.8
>
> ]
>
> ]
>
> }
>
> ]
>
> }
>
> Oder auch so:
>
> {
>
> "data": [
>
> {
>
> "uuid": "xxxxxxxx-6666-xxxx-xxxx-xxxxxxxxxxxx",
>
> "tuples": [
>
> [
>
> 1537815433104,
>
> 21.562
>
> ]
>
> ]
>
> },
>
> {
>
> "uuid": "xxxxxxxx-7777-xxxx-xxxxx-xxxxxxxxxxxx",
>
> "tuples": [
>
> [
>
> 1537815433972,
>
> 20.937
>
> ]
>
> ]
>
> },
>
> {
>
> "uuid": " xxxxxxxx-8888-xxxx-xxxxx-xxxxxxxxxxxx ",
>
> "tuples": [
>
> [
>
> 1537815420583,
>
> 21.75
>
> ]
>
> ]
>
> },
>
> {
>
> "uuid": " xxxxxxxx-9999-xxxx-xxxxx-xxxxxxxxxxxx ",
>
> "tuples": [
>
> [
>
> 1537815427434,
>
> 22.187
>
> ]
>
> ]
>
> },
>
> {
>
> "uuid": " xxxxxxxx-0000-xxxx-xxxxx-xxxxxxxxxxxx ",
>
> "tuples": [
>
> [
>
> ...
>
>
>
> *Von:* Matthias Behr [mailto:mbehr at mcbehr.de]
> *Gesendet:* Sonntag, 23. September 2018 22:41
>
>
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] Daten auf MQTT Topics verteilen
>
>
>
> Hallo,
>
>
>
> schon mal https://github.com/volkszaehler/vzlogger/pull/357 angeschaut?
>
>
>
> Gruß
>
> Matthias
>
>
>
> Am 23.09.2018 um 21:47 schrieb Frank Richter <frank.richter83 at gmail.com>:
>
>
>
> Hi Christian,
>
>
>
> was gibt's da groß zu "entschlüsseln", das ist doch auch nur JSON? Geht im
> Prinzip genauso wie bei den Websockets-Messages vom Push-Server.
>
>
>
> Gruß
>
> Frank
>
>
>
> Christian Wulff <christianwulff at gmx.de> schrieb am So., 23. Sep. 2018
> 20:11:
>
> Hallo Frank,
>
>
>
> also so?:
>
>
>
> "push": [
>
> {
>
> "url": "http://127.0.0.1:5582"},
>
> { "url": "http://127.0.0.1:1880/vzpush"
>
> }
>
> ],
>
>
>
> Das scheint zu funktionieren.
>
> Auf jeden Fall kommt dann msg: Objects im debug Fenster von Node-RED raus.
>
> Im debug Fenster habe ich diese Objects mal aufgeklappt und durchgesehen,
> und tatsächlich einen Zählerstand eines Stromzählers gefunden **happy**
>
>
>
> Jetzt müssen diese Objects „nur“ noch entschlüsselt und auf den MQTT
> Broker gepublished werden.
>
> Das sieht mir jetzt aber sehr komplex aus.
>
> Hat da jemand ein Beispiel, wie man das hinkriegt? Da blicke ich so
> erstmal gar nicht durch L
>
>
>
> Liebe Grüße,
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Samstag, 22. September 2018 18:47
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] Daten auf MQTT Topics verteilen
>
>
>
> Hi Christian,
>
>
>
> "push": [] ist doch ein Array, sollte also auch mit mehreren Zielen
> klarkommen.
>
>
>
> Grüße
>
> Frank
>
>
>
> Christian Wulff <christianwulff at gmx.de> schrieb am Sa., 22. Sep. 2018,
> 17:00:
>
> Hallo Frank,
>
>
>
> ich möchte also zusätzlich zu den Werten, die über den Push Server an MQTT
> gesendet werden, auch noch die Zählerstände vom vzlogger direkt an Node-RED
> pushen.
>
> Dazu steht im Wiki, dass man folgende Zeilen in /ect/vzlogger.conf
> editieren soll:
>
> "push": [
>
> {
>
> "url": "http://127.0.0.1:1880/vzpush"
>
> }
>
> ],
>
>
>
>
>
> Nun habe ich in meiner /ect/vzlogger.conf allerdings schon drin stehen:
>
> "push": [
>
> {
>
> "url": "http://127.0.0.1:5582"
>
> }
>
> ],
>
>
>
> Was ist denn richtig?
>
> Beides geht ja vermutlich nicht?!
>
>
>
> Lieben Gruß,
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Donnerstag, 20. September 2018 18:29
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] Daten auf MQTT Topics verteilen
>
>
>
> Hi Christian,
>
>
>
> richtig verstanden.
>
>
>
> Für MQTT ist die Payload einfach ein String, ob da nur der Wert, JSON oder
> sonstwas drin steht, ist dem Broker egal.
>
>
>
> Zählerstände gibt's über den Push-Server nicht. Entweder von vzlogger
> direkt an Node-RED pushen lassen (siehe Wiki) oder von Node-RED bei der
> Middleware abholen.
>
>
>
> Grüße
>
> Frank
>
>
>
> Christian Wulff <christianwulff at gmx.de> schrieb am Do., 20. Sep. 2018,
> 14:11:
>
> Moin Frank,
>
>
>
> wenn ich dich richtig verstanden habe, wäre bei dem Design nicht
> sichergestellt, dass der timestamp auch wirklich zu dem value gehört,
> richtig?
>
> Okay, das verstehe ich, und hatte auch schon an diese potentielle
> Fehlermöglichkeit gedacht.
>
>
>
> Ich dachte ich hätte MQTT so verstanden, dass in den MQTT-Messages nur
> Werte, aber keine komplexeren Strukturen (z.B. Timestamp und Wert) richtig
> wären.
>
> Aber das scheint dann wohl egal zu sein?!
>
>
>
> Wenn ich jetzt den Wasserzähler einmal auf einen Topic mit timestamp und
> value und einmal nur den value publishe, dann habe ich halt einen Topic
> mehr. Ich denke das funktioniert auch.
>
> Bis jetzt fällt mir von meinen ganzen Sensoren auch eigentlich nur der
> Wasserzähler ein, bei dem ich den timestamp brauche, weil ich aus dem
> letzten timestamp und dem aktuellem timestamp die Durchflussrate berechne,
> und wenn der nächste timestamp ausbleibt will ich die Durchflussrate auch
> noch gen Null trimmen, je mehr Zeit verrinnt. (Ansonsten würde die
> Durchflussrate immer zwischem einem Wert und Null toggeln, wenn man den
> Wasserhahn langsam zudreht. Aber soweit bin ich noch nicht.
>
> Die Sache mit dem „Send_zero = true“ habe ich übrigends relativ schnell
> wieder gelassen, weil jede Sekunde eine „0“ gesendet wird, und so die
> Durchflussrate zwangsweise jede Sekunde zwischen einem Wert und Null
> toggelt.
>
>
>
> Wenn wir schon beim Thema MQTT sind:
>
> Wie kriege ich denn die Stromzählerstände und Wasserzählerstand auf MQTT?
>
> (bis jetzt kriege ich dort nur Momentanleistung raus)
>
>
>
> Lieben Gruß,
>
> Chris
>
>
>
> *Von:* Frank Richter [mailto:frank.richter83 at gmail.com]
> *Gesendet:* Donnerstag, 20. September 2018 00:26
> *An:* volkszaehler.org - users
> *Betreff:* Re: [vz-users] Daten auf MQTT Topics verteilen
>
>
>
> Hi Christian,
>
>
>
> value und timestamp auf unterschiedliche Topics zu verteilen ist IMHO kein
> gutes Design, weil damit die Korrelation des Tupels verloren geht. Wenn du
> MQTT-Topics mit und ohne timestamp brauchst, solltest du eben beide
> generieren und beim subscribe die jeweils passende wählen.
>
>
>
> Grüße
>
> Frank
>
>
>
> Christian Wulff <christianwulff at gmx.de> schrieb am Mi., 19. Sep. 2018,
> 23:39:
>
> Moin,
>
>
>
> ich habe jetzt schon ein paar Wochen MQTT am Laufen und bin begeistert.
>
> Der Push Server liefert Daten via websockets an Node-RED
>
> In Node-RED habe ich einen Flow, der die Daten konvertiert und an den MQTT
> Broker published.
>
> Und dann habe ich mir ein ESP8266 und ein Display genommen und subscribe
> den MQTT Broker, parse die MQTT Message und stelle sie auf dem Display dar.
>
> Das Funktioniert soweit.
>
> Zugegebenerweise ist der Flow im Node-RED nur zusammenkopiert und ich
> könnte den nicht selber schreiben. Egal, solange es funktioniert ist es ja
> schön und gut.
>
>
>
> Nun habe ich entdeckt, dass es auch MQTT Client Apps gibt, und da kommt
> dann schnell der Wunsch auf, auch dieses zu nutzen.
>
> Diese Apps brauchen die MQTT Nachrichten, allerdings in einem etwas
> anderem Format.
>
>
>
> Bisher hat die MQTT Message folgenden Inhalt: „timestamp=1537392772928
> value=2.5819666840232“
>
> Da wird in den Apps dann auch genau so dargestellt
> „timestamp=1537392772928 value=2.5819666840232“
>
> Das ist natürlich Quatsch, denn es soll dort ja nur „2.5819666840232“ zu
> sehen sein.
>
>
>
> Beispiel Stromzähler:
>
> Der Push Server liefert via websockets
> "{"version":"0.3","data":{"uuid":"xxxxxxxx-1111-xxxx-xxxx-xxxxxxxxxxxx","tuples":[[1537387482345,479.24790029688,1]]}}"
>
> Da hätte ich jetzt gerne folgendes Format:
>
> Gesendet werden soll an den Topic
> „Haus/Strom/WärmepumpeHaupttarif/Timestamp“
>
> Der Inhalt der Nachricht soll „1537387482345“ sein.
>
> Gesendet werden soll an den Topic „Haus/Strom/WärmepumpeHaupttarif/Value“
>
> Der Inhalt der Nachricht soll „479.24790029688“ sein.
>
>
>
> Beispiel Temperatur:
>
> Der Push Server liefert via websockets
> "{"version":"0.3","data":{"uuid":"xxxxxxxx-2222-xxxx-xxxx-xxxxxxxxxxxx","tuples":[[1537387448162,22.187,1]]}}"
>
> Da hätte ich jetzt gerne folgendes Format:
>
> Gesendet werden soll an den Topic „Haus/Temperatur/T01Aussen/Timestamp“
>
> Der Inhalt der Nachricht soll „1537387448162“ sein.
>
> Gesendet werden soll an den Topic „Haus/Temperatur/T01Aussen/Value“
>
> Der Inhalt der Nachricht soll „22.187“ sein.
>
>
>
> Beispiel Wasser:
>
> Der Push Server liefert via websockets
> "{"version":"0.3","data":{"uuid":"xxxxxxxx-3333-xxxx-xxxx-xxxxxxxxxxxx","tuples":[[1537387660470,585.1755526658,1]]}}"
>
> Da hätte ich jetzt gerne folgendes Format:
>
> Gesendet werden soll an den Topic „Haus/Wasser/Timestamp“
>
> Der Inhalt der Nachricht soll „1537387660470“ sein.
>
> Gesendet werden soll an den Topic „Haus/Wasserverbrauch/Value“
>
> Der Inhalt der Nachricht soll „585.1755526658“ sein.
>
>
>
> Wie kriege ich jetzt den Node-RED Flow so zusammengebaut, dass er die
> Daten der einzelnen UUIDs auf die entsprechenden MQTT Topics verteilt?
>
>
>
> Lieben Dank und liebe Grüße,
>
> Chris
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> Gruß
>
>
>
> Matthias
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20180924/5b44e064/attachment-0001.html>
More information about the volkszaehler-users
mailing list