Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. NodeRed wie topic aus msg properties? gelöst

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    NodeRed wie topic aus msg properties? gelöst

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      maximinus last edited by maximinus

      Ich habe einen Fox² Server der mir 28 Temperaturwerte per UDP, TCIP oder HTTP übermitteln kann. Derzeit kann ich mittels UDP Datenpaare übermitteln die ich erfolgreich mit NodeRed node UDP in einlesen und mit node ioBroker out als Datenpunkt ausgeben kann. Das Format ist z.B. "Puffer oben,25,0". Es kommen also in einem Datenpunkt "UDP Message" der Reihe nach diese Datenpaare an. Ich hätte jetzt gerne dass Nodered die Datenpaare zerlegt und für jeden Fühler einen eigenen Datenpunkt anlegt In einem Beitrag wird so etwas mit einem Buffer Parser beschrieben den ich in meinem Nodered aber nicht finde. Ich habe das mit einem CSV parser versucht. Im debug kann ich erkennen dass das Parsen funktioniert. Dort steht im ioBroker out { Bezeichnung: "22 Heizung RL", Wert: 19 } (hier fehlt Dezimalstelle), aber auch "no key or topic set" weil ich den "Tip: Leave topic blank if you want to set them via msg properties" befolgt habe.
      Es stellen sich 2 Fragen:

      1. Wie bekomme ich die msg properties in den Topic
      2. Wie kann ich die Dezimalstelle hinter der Temperatur auslesen? Die Trennzeichen "," und das Dezimaltrennzeichen "," sind gleich und sind vom exportierenden Programm vorgegeben.

      LG Gerhard

      geschild 1 Reply Last reply Reply Quote 0
      • geschild
        geschild @maximinus last edited by

        @maximinus Vielleicht mit dem split node (https://flowfuse.com/node-red/core-nodes/split/) am Komma zerlegen.

        LG Gerhard

        M 1 Reply Last reply Reply Quote 0
        • M
          maximinus @geschild last edited by

          @geschild

          Danke, kannte ich noch nicht.
          Ich glaube das Zerlegen ist nicht das Problem sondern wie man aus der gesplitteten Nachricht einen Datenpunkt erzeugt mit dem Namen der Bezeichnung und dem Inhalt des übermittelten Wertes.

          LG Gerhard

          mickym 1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active @maximinus last edited by mickym

            @maximinus Das ist kein Problem - da Du das topic frei definieren kannst. Wenn Du weißt, dass Deezimalzahlen immer vorhanden sind, kannst Du ggf. mit RegEx vorher das ganze aufdröseln. Den Bufferparser kannst Du nutzen, wenn die Daten eine fixe Länge haben. Diese Node musst Du einfach nachinstallieren.

            d49d95e9-250a-4c6a-95ec-c2d8737d7cd8-image.png

            [{"id":"0da106c34cc125cf","type":"inject","z":"289f539dcc33814e","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Puffer oben,25,1,Puffer unten,26,3","payloadType":"str","x":210,"y":6680,"wires":[["5bd61d6bf907ae9f","f623c13912d2afed"]]},{"id":"5bd61d6bf907ae9f","type":"debug","z":"289f539dcc33814e","name":"Eingabe","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":380,"y":6640,"wires":[]},{"id":"f623c13912d2afed","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$match(payload,/(.*?),(\\d+,\\d)/).{\"topic\":groups[0],\"value\":$replace(groups[1],\",\",\".\")~>$number()}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":6680,"wires":[["bb3195e5f26bd2fb","5245e98ae72f6c6e"]]},{"id":"bb3195e5f26bd2fb","type":"debug","z":"289f539dcc33814e","name":"Analysiert","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":600,"y":6640,"wires":[]},{"id":"5245e98ae72f6c6e","type":"split","z":"289f539dcc33814e","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":590,"y":6680,"wires":[["8ef7b1db51dec044"]]},{"id":"8ef7b1db51dec044","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"payload.topic","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":770,"y":6680,"wires":[["f30327f180ac5604"]]},{"id":"f30327f180ac5604","type":"debug","z":"289f539dcc33814e","name":"Nachricht zum Erstellen der Datenpunkte","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1060,"y":6680,"wires":[]}]
            

            M 1 Reply Last reply Reply Quote 0
            • M
              maximinus @mickym last edited by

              @mickym

              Danke für das Beispiel, das hilft mir sehr. Ich versuche es für meinen Zweck anzupassen.

              Ich habe mich missverständlich ausgedrückt. Die payload besteht jeweils nur aus einer Kombiation von Bezeichnung und Wert. Der jeweilige Wert ist immer xx,x die Bezeichnungen sind aber unterschiedlich lang. Die Ausgabe vom Server kann ich umstellen, so dass immer die 4 Stellen vorne sind und anschließend die (unterschiedlich langen) Bezeichnungen (28 verschiedene)
              Trotz Suche finde ich nicht die Bedeutung der nachstehenden Zeichen mit denen das ganze bewerkstelligt wird.

              $match(payload,/(.*?),(\d+,\d)/).{"topic":groups[0],"value":$replace(groups[1],",",".")~>$number()}

              Hast du da einen link auf eine Erkärung?

              Wie müsste das aussehen wenn die Payload zB wie folgt aufgebaut ist: 26,3, Puffer oben

              LG Gerhard

              mickym 1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @maximinus last edited by mickym

                @maximinus Na dann musst Du das nur umdrehen - solange die Zahlen identisch sind - mit dem Text habe ich kein Problem. Ich dreh das ganze in dem Flow um und schick Dir nachher einen Link zum Test des regulären Ausdrucks. Das Einzige ist - ich muss im Moment noch ein Komma zum Schluss machen - ich steh mit dem lookbehind bissi auf Kriegsfuss.

                Wie gesagt - man muss noch ein Komma anhängen - habe ich aber nun automatisch gemacht.

                13137a1e-f307-45e2-ab36-bf9fa2abda28-image.png

                Hier der Flow:

                [{"id":"0da106c34cc125cf","type":"inject","z":"289f539dcc33814e","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"25,1,Puffer kurz,26,3,lange Beschreibung","payloadType":"str","x":170,"y":6820,"wires":[["5bd61d6bf907ae9f","f623c13912d2afed"]]},{"id":"5bd61d6bf907ae9f","type":"debug","z":"289f539dcc33814e","name":"Eingabe","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":340,"y":6780,"wires":[]},{"id":"f623c13912d2afed","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload & \",\"","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$match(payload,/(\\d+,\\d),(.*?),/).{\"topic\":groups[1],\"value\":$replace(groups[0],\",\",\".\")~>$number()}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":6820,"wires":[["bb3195e5f26bd2fb","5245e98ae72f6c6e"]]},{"id":"bb3195e5f26bd2fb","type":"debug","z":"289f539dcc33814e","name":"Analysiert","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":560,"y":6780,"wires":[]},{"id":"5245e98ae72f6c6e","type":"split","z":"289f539dcc33814e","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":550,"y":6820,"wires":[["8ef7b1db51dec044"]]},{"id":"8ef7b1db51dec044","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"payload.topic","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":6820,"wires":[["f30327f180ac5604"]]},{"id":"f30327f180ac5604","type":"debug","z":"289f539dcc33814e","name":"Nachricht zum Erstellen der Datenpunkte","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1020,"y":6820,"wires":[]}]
                

                Hier der reguläre Ausdruck zum Testen und spielen - Du musst schauen, dass jeder Match in die richtigen Gruppen kommt (die Beschreibung der regulären Ausdrücke und die Erklärung findest Du rechts oben bzw. unten):
                916cdc14-461b-48c2-898a-0ffd2bd7281d-image.png

                Hier der Link zum Testen der regulären Ausdrücke: https://regex101.com/r/2LMTDt/1

                Hier der entsprechende JSONATA Code:

                45466259-1d01-49eb-9fe8-d8dcbf8c4c4e-image.png

                und ebenfalls der Link zum Testen: https://try.jsonata.org/7M9gehmLH

                M 2 Replies Last reply Reply Quote 0
                • M
                  maximinus @mickym last edited by

                  @mickym

                  Vorerst vielen Dank. Ich muss das jetzt alles studieren und melde mich später

                  1 Reply Last reply Reply Quote 0
                  • M
                    maximinus @mickym last edited by

                    @mickym

                    Das hat jetzt etwas länger gedauert. Nachdem ich den Flow importiert und den inject durch UDP in ersetzt, sowie einen ioBroker out angefügt hatte sah ich im debug dass die Bearbeitung des payloads korrekt war - bis auf das führende blank und das dahinterliegende Komma - aber es kam auch die alte Fehlermeldung über das fehlende topic des ioBroker out. Ich habe dann versucht etwas zu ändern. Das ließ sich nicht mehr deployen. Da kommt immer die Meldung keine Antwort vom Server. In der Annahme dass die als Demo importierten Flows damit etwas zu tun haben, habe ich die alle gelöscht um von vorne zu beginnen. Jetzt sind alle weg. Wenn ich deinen Flow jetzt importiere ohne etwas daran zu ändern lässt er sich auch nicht mehr deployen. Ein kleiner selbst erstellter aus inject und debug aber schon. Den Adapter habe ich neu gestartet und den Import nochmals versucht, aber es geht nicht mehr.
                    Ich habe hier noch eine andere iobroker Installation. Auf der klappt das deplay. Soll ich den Adapter auf dem RasPi auf dem das laufen soll neu installieren? Könnte das helfen?

                    Ein große Bitte hätte ich noch. Könntest du deinen Flow um den ioBroker Out ergänzen so dass die Objekte mit Bezeichnung und Wert angelegt werden. Ich schaffe das nicht.

                    LG Gerhard

                    1 Reply Last reply Reply Quote 0
                    • mickym
                      mickym Most Active last edited by mickym

                      Na man sollte keine Leerzeichen in Datenpunktnamen haben - ich hab sie mal durch Unterstriche ersetzt.

                      77a246f1-c2ed-41da-847e-76f10c5387eb-image.png

                      a0b61011-b7aa-42b9-b617-632e3b1ef660-image.png

                      [{"id":"0da106c34cc125cf","type":"inject","z":"289f539dcc33814e","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"25,1,Puffer kurz,26,3,lange Beschreibung","payloadType":"str","x":170,"y":6820,"wires":[["f623c13912d2afed"]]},{"id":"f623c13912d2afed","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload & \",\"","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$match(payload,/(\\d+,\\d),(.*?),/).{\"topic\":groups[1],\"value\":$replace(groups[0],\",\",\".\")~>$number()}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":6820,"wires":[["5245e98ae72f6c6e"]]},{"id":"5245e98ae72f6c6e","type":"split","z":"289f539dcc33814e","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":550,"y":6820,"wires":[["8ef7b1db51dec044"]]},{"id":"8ef7b1db51dec044","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"payload.topic","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":6820,"wires":[["effa0a9ed1b6a8b0"]]},{"id":"effa0a9ed1b6a8b0","type":"change","z":"289f539dcc33814e","name":"topic anpassen","rules":[{"t":"change","p":"topic","pt":"msg","from":" ","fromt":"str","to":"_","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"\"0_userdata.0.Test.maximinus.\" & topic","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":940,"y":6820,"wires":[["e7c12bf23dcb8d44"]]},{"id":"e7c12bf23dcb8d44","type":"ioBroker out","z":"289f539dcc33814e","name":"","topic":"","ack":"true","autoCreate":"true","stateName":"","role":"","payloadType":"","readonly":"false","stateUnit":"","stateMin":"","stateMax":"","x":1140,"y":6820,"wires":[]}]
                      

                      Es geht aber auch mit Leerzeichen - hast dann halt vielleicht später Probleme aber Du kannst die Regel mit dem Ersetzen der Leerzeichen auch rausschmeissen.

                      5266441b-e9a9-433e-a37d-406a8c6ab1fa-image.png

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        maximinus @mickym last edited by maximinus

                        @mickym

                        Ich bin begeistert, vielen Dank. In der Testinstallation schreibt er die mit inject definierten Werte in die Datenpunkte. Mit den aktuellen über UDP kommenden Daten geht es aber noch nicht, es kommt hier jeweils nur ein Wertepaar an zB "18,5,22 Heizung RL,↵" Sobald ich in inject das 2. Wertepaar entferne zeigt debug sofort undefined an, obwohl in regex101 auch das eine Wertepaar korrekt interpretiert wird.
                        Auf der anderen Installation die gestern das Problem mit dem deploy hatte gibt es noch ein weiteres Problem da steht unterhalb des ioB out "Cannot set state"
                        Ich kann da aber keinen Unterschied zwischen den beiden erkennen.

                        LG Gerhard

                        edit:
                        Problem vorläufig gelöst. Ich sende mit jedem Datenpaar ein zweites Datenpaar "00,0,leer" als Dummy mit

                        Cannot set state war in der Instanzeinstellung nicht angehakt, jetzt geht es

                        Gerhard

                        mickym 1 Reply Last reply Reply Quote 0
                        • mickym
                          mickym Most Active @maximinus last edited by mickym

                          @maximinus Hier die Lösung - um auch einzelne Datenpunkte zu schreiben.

                          11d581b2-35da-46ab-b193-565e349f1470-image.png

                          Oben setzt Du den String in eine trim Funktion - damit Zeilenvorschübe und führende Leerzeichen zu entfernen.

                          Und ob auch einzelne Werte zu schreiben, einfach in der 2. Regel ein paar eckige Klammern hinten dran machen.

                          Ja das Fremdobjekte erstellt werden dürfen in der Instanzeinstellung habe ich vorausgesetzt.

                          Hier der Import:

                          [{"id":"0da106c34cc125cf","type":"inject","z":"289f539dcc33814e","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"25,1,Puffer kurz,25,2,Puffer lang","payloadType":"str","x":130,"y":7140,"wires":[["f623c13912d2afed"]]},{"id":"f623c13912d2afed","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$trim(payload & \",\")","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$match(payload,/(\\d+,\\d),(.*?),/).{\"topic\":groups[1],\"value\":$replace(groups[0],\",\",\".\")~>$number()}[]","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":7140,"wires":[["5245e98ae72f6c6e"]]},{"id":"5245e98ae72f6c6e","type":"split","z":"289f539dcc33814e","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":550,"y":7140,"wires":[["8ef7b1db51dec044"]]},{"id":"8ef7b1db51dec044","type":"change","z":"289f539dcc33814e","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"payload.topic","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":7140,"wires":[["effa0a9ed1b6a8b0"]]},{"id":"effa0a9ed1b6a8b0","type":"change","z":"289f539dcc33814e","name":"topic anpassen","rules":[{"t":"change","p":"topic","pt":"msg","from":" ","fromt":"str","to":"_","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"\"0_userdata.0.Test.maximinus.\" & topic","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":940,"y":7140,"wires":[["e7c12bf23dcb8d44"]]},{"id":"e7c12bf23dcb8d44","type":"ioBroker out","z":"289f539dcc33814e","name":"","topic":"","ack":"true","autoCreate":"true","stateName":"","role":"","payloadType":"","readonly":"false","stateUnit":"","stateMin":"","stateMax":"","x":1140,"y":7140,"wires":[]}]
                          

                          M 1 Reply Last reply Reply Quote 0
                          • M
                            maximinus @mickym last edited by

                            @mickym

                            Es läuft. Ohne deine Unterstützung hätte ich es nicht hingekriegt. Danke

                            Gerhard

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            655
                            Online

                            31.9k
                            Users

                            80.3k
                            Topics

                            1.3m
                            Posts

                            3
                            12
                            457
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo