Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Change Node & JSONata

    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

    Change Node & JSONata

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

      Ach ja, wie man unter JSONata auf die node-red msg Properties zugreift findet du hier: https://github.com/node-red/cookbook.no … ta-Recipes

      Und eine genaue Beschreibung der JSONata Funktionen findet du hier: http://docs.jsonata.org/overview.html

      Häufig reicht auch die Funktionsreferenz des eingebauten JSONata Expression Editor. Im "Test"-Reiter kannst du solche Sachen auch ordentlich testen.

      3999_bild_2.png

      1 Reply Last reply Reply Quote 0
      • G
        Garf last edited by

        @rewenode:

        Häufig reicht auch die Funktionsreferenz des eingebauten JSONata Expression Editor. Im "Test"-Reiter kannst du solche Sachen auch ordentlich testen. `
        Die Möglichkeit konnte ich bisher noch nicht wirklich nutzen. Da kommt fast immer eine Fehlermeldung. Da mache ich wohl noch etwas falsch. Mit dem JSONata Exerciser bin ich ganz gut klar gekommen http://try.jsonata.org/ryYn78Q0m.

        Eigentlich wollte ich hier schon die nächste Frage posten. Ich habe es aber auch selber schon hinbekommen. Aus einem Stringwert mussten div. Zeichen entfernt werden, dann der String zu einer Fließpunktzahl umgewandelt und die Stellen hinter dem Komma definiert werden. Dies alles in einer Zeile und mit den ganzen Klammern wollte mir nicht wirklich gelingen. Daher habe ich es dann mal mit der funktionalen Programmierung versucht.

        Das Ergebnis sieht nun so aus und funktioniert tadellos.

        ! ````
        (
        $laenge := $length(msg.payload)-1;
        $ZW := $substring(msg.payload, -0, $laenge);
        $round($number($ZW)*10,0)
        )

        
        Ich werfe im Moment ein function-Node nach dem anderen raus und ersetzte diese durch ein change-Node. :o
        
        Erstaunlich und erfreulich zugleich.
        
        Im Netz findet man diese Möglichkeit sehr selten, dafür aber um so häufiger die Programmierung über das function-Node.
        
        Schade eigentlich.
        1 Reply Last reply Reply Quote 0
        • R
          rewenode last edited by

          @Garf:

          Da mache ich wohl noch etwas falsch. `
          Das liegt meist daran, dass ja kein Eingangs-payload zur Testzeit vorliegt. Deshalb muss man sich den Eingangspayload als "Example message", so wie in meinem letzen Post, im Test-Reiter anlegen.
          @Garf:

          Mit dem JSONata Exerciser bin ich ganz gut klar gekommen http://try.jsonata.org/ryYn78Q0m. `
          Ja, den nehme ich auch gerne her. Nur leider kann der natürlich nichts mit den node-red spezifischen Sachen anfangen.

          Sieht doch perfekt aus, deine Funktion. Hinweis: Solange du dich im root-context des Noldes bewegst, kannst du auf die msg-properties direkt zugreifen. Also payload statt msg.payload usw. https://github.com/node-red/cookbook.no … essing-msg

          @Garf:

          Ich werfe im Moment ein function-Node nach dem anderen raus und ersetzte diese durch ein change-Node. `

          Das ist zumindest eine gute Übung 😄

          @Garf:

          Im Netz findet man diese Möglichkeit sehr selten, dafür aber um so häufiger die Programmierung über das function-Node.

          Schade eigentlich. `

          Ja, die Mächtigkeit von JSONata ist nicht so richtig bekannt. Und es ist auch nicht jedermanns Sache, Neben Javascript sich zusätzlich mit ner weiteren Syntax rumzuquälen. Und, naja, es gibt letztlich nichts in JSONata, was man mit Javascript nicht auch machen könnte.

          Die node-red Entwickler haben JSONata zum Glück gerade in letzter Zeit in weiteren Nodes implementiert.

          Ideal wäre ein ioBroker-node was einfach nur ein komplettes object ausgeben/kopieren kann.

          z.B. zigbee.0 –> payload.zigbee.0

          Da könnte man dann ein change-node dranhängen und nach Herzenslust per JSONata abfragen.

          Allseits frohe Weihnachten

          1 Reply Last reply Reply Quote 0
          • G
            Garf last edited by

            Hi rewenode,

            bevor Du mir vor Langeweile noch das ganze Wochenende verschläfst, hier mal wieder eine Frage an den Experten. :lol:

            Ich wollte eine Uhrzeit mit JSONata in zwei Integerzahlen zerlegen, um diese dann per Modbus weitergeben zu können. Funktioniert auch teilweise, nur wenn die volle Stunde oder Minute mit einer 0 beginnt, dann kommt es zu einem Fehler. Mit Javascript im function Node und der parseInt Funktion geht es ohne Probleme. Wo liegt der Fehler?

            ! ````
            [{"id":"d39fe264.28fff","type":"inject","z":"342c6c5f.56269c","name":"","topic":"","payload":"08:04","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":2080,"wires":[["bc56ad.94ac715","4206f90e.204078"]]},{"id":"bc56ad.94ac715","type":"function","z":"342c6c5f.56269c","name":"msg","func":"var str=msg.payload;\nmsg.payload=parseInt(str.substring(0, 2));\nreturn msg;","outputs":1,"noerr":0,"x":420,"y":2020,"wires":[["be0857e0.29f52"]]},{"id":"be0857e0.29f52","type":"debug","z":"342c6c5f.56269c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":2080,"wires":[]},{"id":"4206f90e.204078","type":"change","z":"342c6c5f.56269c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number($substringBefore(payload, ":"))\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":2080,"wires":[["be0857e0.29f52"]]}]

            
             ![3639_sc11.jpg](/assets/uploads/files/3639_sc11.jpg) 
             ![3639_sc12.jpg](/assets/uploads/files/3639_sc12.jpg) 
            1 Reply Last reply Reply Quote 0
            • R
              rewenode last edited by

              Normalerweise macht das $parseInteger()

              $parseInteger($substringBefore(payload, ":"),'99')
              

              Aber das ist in der derzeitigen NR-JSONata Version noch nicht drin ;-(

              Da bleibt nur z.B. mit einer kleinen function die führende Null zu entfernen. In der Art:

              $n := "04";
              $substring($n,0,1) = "0" ? $substring($n,1,1) : $n
              
              

              Geht sicher einfacher, wenn ich drüber schlafe;-)

              Einen schönen Sonntag

              1 Reply Last reply Reply Quote 0
              • R
                rewenode last edited by

                oder, du trickst etwas:

                ("0." & $substringBefore(payload, ":") ~> $number()) * 100
                
                
                1 Reply Last reply Reply Quote 0
                • G
                  Garf last edited by

                  Da staune ich mal wieder Bauklötze.

                  Auf diesen Trick muss man erst einmal kommen.

                  Aber so 100% brauchbar ist es leider noch nicht. Mit parseInt() passiert so etwas nicht.

                  3639_sc13.jpg

                  Da ich mir eh einen anderen Weg überlegt habe, brauche ich es nicht mehr so wirklich. Es hatte mich halt mal interessiert wo das Problem liegt.

                  Wird $parseInteger() mit NodeRed v20.0 kommen?

                  1 Reply Last reply Reply Quote 0
                  • R
                    rewenode last edited by

                    @Garf:

                    Wird $parseInteger() mit NodeRed v20.0 kommen? `
                    Angeblich ja (v0.20). Aber wer weis schon wie da die Prioritäten liegen. Vielleicht wird's ja doch erst zur v20.0 :lol:

                    1 Reply Last reply Reply Quote 0
                    • R
                      rewenode last edited by

                      @Garf:

                      Auf diesen Trick muss man erst einmal kommen. `
                      Mit viel langer Weile geht auch so was :lol: :lol: :lol:

                      $reduce(payload.$split(":")[1].$split("").$number(),function($i, $j) {10*$i + $j})
                      
                      1 Reply Last reply Reply Quote 0
                      • G
                        Garf last edited by

                        @rewenode:

                        Angeblich ja (v0.20). Aber wer weis schon wie da die Prioritäten liegen. Vielleicht wird's ja doch erst zur v20.0 :lol: `
                        O.K. erwischt. :mrgreen:

                        Mit der Version kann es noch dauern.
                        @rewenode:

                        Mit viel langer Weile geht auch so was :lol: :lol: :lol: `
                        Funktioniert absolut fehlerfrei.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        891
                        Online

                        31.8k
                        Users

                        79.9k
                        Topics

                        1.3m
                        Posts

                        2
                        13
                        2383
                        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