MQTT Array verarbeiten

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • elextricmax
    Dumb Home'r
    • 02.08.2023
    • 16

    #1

    MQTT Array verarbeiten

    Hallo,

    Ich verzweifle gerade dabei Daten welche der Loxberry über MQTT bekommt in den Miniserver zu bringen. Konkret geht es hierbei um Daten, welche als Array am MQTT Gateway aufschlagen.

    Der go-e Charger gibt Daten (Spannung, Strom, ..., Leistung) der unterschiedlichen Phasen wie folgt per MQTT aus - lt. MQTT Finder:

    go-eCharger/xy/nrg [232.81,232.19,232.5,1.55,0,0,0,0,0,0,0,0,0,0,0,0]​

    Mit der Subscription "go-eCharger/xy/nrg" wird das in einzelne Items "zerlegt":

    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 2023-10-11 23_38_59-MQTT Gateway – Mozilla Firefox.png
Ansichten: 389
Größe: 45,8 KB
ID: 406598

    Das heißt mit jeder zB Spannungänderung entsteht ein neues Item. Das ist natürlich für die Weiterleitung an den Miniserver nicht zielführend.

    Meine Fragen daher:
    • Ist es möglich Daten aus dem Array einzeln in einer Subscription zu adressieren?
      • zB go-eCharger/xy/nrg[0] würde ein Item mit dem Wert 232.81 liefern
    • Oder gibt es einen anderen Konfigurationsparameter der das Array richtig in 15 Items strukturiert?
      • zB Item "go-eCharger/xy/nrg_0, go-eCharger/xy/nrg_1, ....
    • Oder kann das das MQTT Gateway schlichtweg nicht bzw. müsste hier hersteller-seitig eine anderes Struktur per MQTT geliefert werden?
    Bin über jede/n Ratschlag/Hilfestellung dankbar.

    Freundliche Grüße
    Markus







  • svethi
    Lebende Foren Legende
    • 25.08.2015
    • 6320

    #2
    Moin Markus,

    viele verstehen MQTT völlig falsch. MQTT ist nichts anderes als ein Nachrichtendienst. Eintreffende Nachrichten werden einfach nur weiter verteilt. Verarbeitet wird da rein gar nichts. Alles was an „Änderungen“ an den Daten passiert, wird außerhalb von MQTT gemacht. Der einfachste Weg wird sein dem Gateway zu sagen, dass es die Daten per UDP senden soll. Und dann nur bis nrg zu subscriben. Dann bekommst Du das Array als String komplett geliefert und kann über die Befehlserkennung die einzelnen Werte rausfiltern. Ich könnte mir vorstellen, dass Christian Fenzl s Funktion JSON‘s zu zerlegen hier mir eingreift. So musst Du wahrscheinlich noch diese Option abschalten.
    Anderenfalls müsste das wahrscheinlich explizit im Gateway programmiert werden.

    Gruß Sven
    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

    Kommentar

    • Labmaster
      Lox Guru
      • 20.01.2017
      • 2592

      #3
      Soweit ich mich erinnern kann gab es im Loxberry Wiki mal einen Hinweis auf die Zerlegung von Arrays über eigene MQTT Plugin "Transformer Scripte"
      Ich finde das aber im neuen Wiki nicht :-(

      EDIT:

      Hab noch was gefunden:
      https://wiki.loxberry.de/konfigurati...sformers/start

      Mitgelieferte Transformer
      ...
      ​Shipped (V1.2.0) php_jsonin_jsonarrayout Beispiel für Entwickler Erklärung siehe unten
      ...
      Zuletzt geändert von Labmaster; 12.10.2023, 06:20.

      Kommentar

      • elextricmax
        Dumb Home'r
        • 02.08.2023
        • 16

        #4
        Danke svethi - der Hinweis mit der Einstellung "Expand JSON Data" trifft grundsätzlich die Problematik:
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2023-10-12 08_00_29-MQTT Gateway.png Ansichten: 0 Größe: 10,9 KB ID: 406616

        Leider hilft das in meinem Fall nur bedingt, weil Arrays div. Daten unterschiedlich strukturiert sind. Mal sind es Arrays mit Key/Value Pairs - dafür funktioniert die Funktion super, mal sind es einfach nur Values - da gibt´s dann für jeden Value ein Item aber eben ohne eigentlichen Value...

        Beispiele:
        go-eCharger/xy/dns {"dns0":"1.1.1.1", "dns1":"2.2.2.2","dns3":"3.3.3.3"} - damit klappt das wunderbar

        go-eCharger/xy/nrg [232.81,232.19,232.5,1.55,0,0,0,0,0,0,0,0,0,0,0,0]​ - bei diesen Daten funktionierts dann eben genau nicht

        Somit bleiben eigentlich nur 2 Optionen:
        • denn Hersteller ersuchen sämtliche Daten mit mehreren Werte in ein Array mit Value/Key Pairs zu bringen
        • oder den Entwickler des loxberry ersuchen, ob hier eventuell im MQTT Gateway eine Konfigurationsmöglichkeit je subscription implementiert werden könnte
        • und natürlich auch noch die 3. Option - Expand JSON deaktivieren und im Miniserver mit der Befehlserkennung mühsam alle Arrays zu zerpflücken. Das bedeutet natürlich massiv mehr Aufwand.
        Zuletzt geändert von elextricmax; 12.10.2023, 09:51.

        Kommentar

        • elextricmax
          Dumb Home'r
          • 02.08.2023
          • 16

          #5
          Vielleicht ist mir die Frage an die Entwickler erlaubt.

          Würde es das MQTT Gateway nicht verbessern wenn die Funktion "Expand JSON data" diese zwei "Eingangs-Typen" unterschiedlich behandeln würde?

          MQTT Inputs:
          10:59:04.576 OK: MQTT IN: go-eCharger/xy/dns: {"dns0":"192.168.20.5","dns1":"0.0.0.0","dns2":"0. 0.0.0"}
          10:59:04.672 OK: MQTT IN: go-eCharger/xy/nrg: [228.47,228.47,227.85,1.55,0,0,0,0,0,0,0,0,0,0,0,0]

          Zum Beispiel wenn Value Key/Paris dann normal "expanden" - wenn nur Values, dann in der Form expanden:
          go-eCharger_xy_nrg_0 : 228.47
          go-eCharger_xy_nrg_1 : 228.47
          go-eCharger_xy_nrg_2 : 227.85
          go-eCharger_xy_nrg_3 : 1.55
          usw.









          Zuletzt geändert von elextricmax; 12.10.2023, 10:42.

          Kommentar

          • Christian Fenzl
            Lebende Foren Legende
            • 31.08.2015
            • 11238

            #6
            Erstmal Klugscheißen: Key-Value-Paare sind keine Arrays. Arrays sind die Dinger ohne Key.

            Das Ding mit den Arrays: Die sind bei der Verarbeitung/Aufbereitung für Loxone problematisch, weil Loxone diesen Datentyp nicht kennt.

            Die jetzige Umsetzung, dass jedes Array-Element als 1 weitergeleitet wird, kommt von einem Featurewunsch, wo es darum ging, feststellen zu können, ob eine gewisse Stelle des Arrays gesetzt ist oder nicht.

            Dieser Datensatz mit den Werten im Array ist eigentlich ein Designfehler des Go-E Chargers, der spezifische Daten liefert, aber den Schlüssel (das ist das Spezifikum) nicht mitliefert. Wenn ich als Entwickler weiß, dass 228.47 die Spannung an Phase 1 ist, dann definiere ich auch einen Key Vphase1: 228.47, statt es luftleer in den Datenraum zu schmeißen. Es ist ein Designfehler des Datenmodells des Go-E Chargers.

            Nichts desto Trotz weiß ich nicht, wie ich das lösen soll. Arrays haben keine definierte Länge. Wenn ein Element array[7] mit Wert 100 kommt, und bei der nächsten Übertragung gibt es kein Element array[7], was soll ich dann tun?

            Wenn ich die Werte sende, dann funktioniert das nicht mehr, was ich damals aufgrund einer Anforderung umgesetzt hatte.

            Irgendeine Idee?
            Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

            Kommentar

            • svethi
              Lebende Foren Legende
              • 25.08.2015
              • 6320

              #7
              Wie gesagt. Das ganze Array als String an UDP schicken. Die Position im Array muss ja immer gleich sein, sonst könnte man es nicht auswerten. Also kann man dann auch mit der Befehlserkennung arbeiten.
              Christian Fenzl Du könntest allerhöchstens das Array [ ] erkennen und dann mit Schleife nrg1; nrg2 … anhand der Pos übergeben. Hier muss die Nummer ja dann auch immer passen
              Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

              Kommentar

              • elextricmax
                Dumb Home'r
                • 02.08.2023
                • 16

                #8
                Zunächst mal danke, dass hier so rege an aktuellen Topics diskutiert und teilgenommen wird.

                Christian Fenzl: Bezügl. Klugscheißen ;-) keine Thema - ich bin nicht so programmier-affin und greife dann offensichtlich nicht ganz auf die richtige Nomenklatur zurück.
                Dass das ein Feature-Wunsch war, wusste ich natürlich nicht und spießt sich dann vermutlich mit dem Vorschlag von svethi.
                Wobei ich den Feature-Wunsch auch nicht ganz verstehe. Denn wenn sich der eigentliche Wert ändert - dann kann hat das ja keine Aussage ob der Wert gesetzt ist oder nicht - weil eben durch die Logik dann ein neues Item mit Value 1 über MQTT an den Miniserver gesandt wird.
                Im konkreten Fall des go-e Chargers entstehen aufgrund der laufend minimalen Änderungen der Spannungen dadurch ja unzählige Items...

                svethi: Diesen Vorschlag hätte ich auch im Kopf gehabt - weil quasi das Array anhand der eckigen Klammer erkannt werden könnte und dann bei der "Splittung" in einzelne Werte entsprechend behandelt werden hätte können. Ob man sich dabei um das Problem der Länge von Arrays (wie von Chrisian erwähnt) annehmen muss, weiß ich nicht. In diesem Fall wird das Array immer gleich lang sein, außer der Hersteller packt da mal zusätzliche Werte rein.
                Dann wiederum ist der Endanwender in der Pflicht die richtige Zuordnung in der Loxone anzupassen...

                Anyway - ich werde mal versuchen das Thema beim Hersteller zu positionieren - vielleicht sieht dieser ein, dass hier die Aussgabe von Key/Value Pairs eine sinnvolle Verbesserung wäre.

                Kommentar

                Lädt...