[vz-users] Daten auf MQTT Topics verteilen

Christian Wulff christianwulff at gmx.de
Mon Sep 24 23:19:22 CEST 2018


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 <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 <http://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 <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 <http://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 <http://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/54a5d165/attachment-0001.html>


More information about the volkszaehler-users mailing list