Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Switch-Node und JSON

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Switch-Node und JSON

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

      Schönen guten Morgen,

      wie kann ich mehrere Werte mit JSON in einem Switch-Node vergleichen?

      Ich hoffe ihr könnt mir helfen.

      17327_schaltung.png

      17327_candumb.png

      17327_switch-node.png

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

        Was konkret, soll denn mit was verglichen werden?

        Poste mal einen Export des Eingangs-Objects.

        Kopierst du so: viewtopic.php?f=32&t=20258#p212471

        Dann formuliere es so;

        wenn msg.payload.xxx gleich yyy -> Ausgang 1

        usw.

        Vielleicht kann dir dann schnell geholfen werden.

        1 Reply Last reply Reply Quote 0
        • Schlippi
          Schlippi last edited by

          {"canid":289,"dlc":3,"data":[1,2,1],"payload":"289#\u0001\u0002\u0001","_msgid":"44a517cd.bfd338"}

          Ich würde gerne die canid und die Daten vergleichen. Also wenn die id==289 und data[2]==1 dann Ausgabe.

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

            So kannst du es machen:
            3999_jsonata.png

            So sieht dann dein JSONata Ausdruck aus:

            payload.canid = 289 and payload.data[2] = 1
            

            Hier kommt nur eine Ausgabe wenn id==289 und data[2]==1

            Wenn du einen oder mehrere wenn Bedingungen hast, musst du sie einfach im switch-node als separate Ausgänge zufügen.

            Allerdings sind deine Bedingungen hier 'hardcodiert'.

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

              Irgend was falsch abgeschrieben?

              Bei mir geht es:

              ! ````
              [{"id":"86c2e068.ff494","type":"debug","z":"8ba3e952.5c0868","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":610,"y":180,"wires":[]},{"id":"e105a427.a5ccd8","type":"inject","z":"8ba3e952.5c0868","name":"","topic":"","payload":"{"canid":289,"dlc":3,"data":[1,2,2],"payload":"289#\u0001\u0002\u0001","_msgid":"44a517cd.bfd338"}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":90,"y":180,"wires":[["a4c35bda.d1a118"]]},{"id":"a4c35bda.d1a118","type":"switch","z":"8ba3e952.5c0868","name":"wenn id==289 und data[2]==1 dann Ausg.1","property":"payload","propertyType":"msg","rules":[{"t":"jsonata_exp","v":"payload.canid = 289 and payload.data[2] = 1","vt":"jsonata"}],"checkall":"true","repair":false,"outputs":1,"x":350,"y":180,"wires":[["86c2e068.ff494"]]}]

              
              Poste mal deinen flow-export
              1 Reply Last reply Reply Quote 0
              • R
                rewenode last edited by

                Kann es sein, dass dein Objekt Export nicht korrekt ist?

                Auf deinem ersten Bild ist data ein buffer. Im export ein einfaches array.

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

                  Ok ich seh schon, der Export war das komplette Object. Ich schau mal..

                  1 Reply Last reply Reply Quote 0
                  • Schlippi
                    Schlippi last edited by

                    Das ist eins meiner Probleme.

                    Die Daten aus dem CanDumb-Node ist:

                    {"canid":1,"dlc":3,"data":[0,0,1],"payload":"1#\u0000\u0000\u0001","_msgid":"cd3218ea.e75a78"}
                    17327_1.png
                    Die Daten werden als Buffer angezeigt.

                    Leider reichen meine Java- und JSON-Kenntnisse dafür noch nicht aus.

                    Wie kann ich das nutzen bzw. vergleichen. Ich werde noch öffters auf das Buffer-Problem stoßen.

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

                      Alles klar wart mal kurz.

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

                        Fällt mir auf die Schnelle nur ein function-node ein.

                        Problem ist, dass du mit JSONata nicht auf ein Javascript Buffer-Object zugreifen kannst (gilt übrigens auch für data-objects).

                        ! ````
                        [{"id":"77dd4923.67a078","type":"function","z":"8ba3e952.5c0868","name":"wenn id==289 und data[2]==1 dann Ausg.1","func":"let data = Array.prototype.slice.call(msg.data, 0);\n\nif (msg.canid == 289 && data[2] == 1 ) {\n node.send(msg);\n node.status({fill:"green",shape:"dot"});\n} else {\n node.status({fill:"red",shape:"dot"});\n}\n\n","outputs":1,"noerr":0,"x":630,"y":260,"wires":[["caaa9b3e.024f48"]]}]

                        
                        Das kannst du anstatt des switch nehmen.
                        
                        Funktioniert genauso. Die KOMPLETTE Eingangs-msg wird nur weitergeleitet, wenn die Bedingung erfüllt ist:
                        
                        ****function-node****
                        

                        //buffer to array
                        let data = Array.prototype.slice.call(msg.data, 0);

                        if (msg.canid == 289 && data[2] == 1 ) {
                        node.send(msg);
                        node.status({fill:"green",shape:"dot"});
                        } else {
                        node.status({fill:"red",shape:"dot"});
                        }

                        
                        Natürlich kannst du hier den auszugebenden payload noch nach deinen Wünschen anpassen.
                        
                        Mir fällt auf, dass sowohl die canid als auch die bufferdaten noch in Stringform im payload stehen. In diesem Fall könnte man auch im switch-node mit den JSONata String-functions arbeiten.
                        1 Reply Last reply Reply Quote 0
                        • R
                          rewenode last edited by

                          Übrigens, falls du den buffer nicht für andere Zwecke als array brauchst, kannst du natürlich ohne Array-Konvertierung direkt abfragen

                          if (msg.canid == 289 && msg.data[2] == 1 ) ...
                          
                          1 Reply Last reply Reply Quote 0
                          • Schlippi
                            Schlippi last edited by

                            So,

                            bin jetzt erst dazu gekommen es zu testen.

                            Funktioniert gut. Es ist aber mit der Switch-Funktion schon angenehmer. Deshalb habe ich hinter das CanDumb-Node die Funktion mit deinem Code gehängt und habe msg.data = data zugefügt.

                            let data = Array.prototype.slice.call(msg.data, 0);
                            
                            msg.data = data;
                            
                            if (msg.canid == 1 && data[2] == 1 ) {
                               node.send(msg);
                               node.status({fill:"green",shape:"dot"});
                            } else {
                               node.status({fill:"red",shape:"dot"});
                            }
                            return msg;
                            

                            Jetzt müsste ich das Switch-Node nutzen können. Ist mir für die weitere nutzung ziemlich egal, ob es ein Buffer oder ein Array ist.

                            Vielen Dank. Das bringt mich meiner Hausdigitalisierung sehr weiter. Ich kann nur C++ auf Microkontrollern programmieren. Der Wechsel auf Java und Node-Red fällt mir doch schwerer als gedacht.

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

                              @Schlippi:

                              Der Wechsel auf Java und Node-Red fällt mir doch schwerer als gedacht. `
                              Willkommen im Club :lol:
                              @Schlippi:

                              Deshalb habe ich hinter das CanDumb-Node die Funktion mit deinem Code gehängt und habe msg.data = data zugefügt. `
                              Ja, das sollte klappen.

                              msg.data = Array.prototype.slice.call(msg.data, 0);
                              

                              Viel Spaß noch

                              1 Reply Last reply Reply Quote 0
                              • Schlippi
                                Schlippi last edited by

                                Ha, jetzt hab ich ein ähnliches Problem mit dem ui_Switch für das Dashboard.

                                Ich kann mit dem Switch Nachrichten versenden mit z.B.:

                                When click, send

                                On payload````
                                {"canid":11,"dlc":3,"data":[1,0,21]}

                                Off payload````
                                {"canid":11,"dlc":3,"data":[1,0,22]}
                                

                                Ich hätte natürlich auch gerne, dass sich der Switch-Zustand ändert, wenn Nachrichten ankommen.

                                Problem ist, dass der ui_switch wohl nur auf den payload reagiert, aber nicht auf ein Object?

                                Der Payload ist aber nutzlos, sobald Hex-Zahlen aus dem CAN-Bus ankommen.

                                Es muss auch nicht unbedingt der ui_switch im Dashboard benutzt werden. Gerne auch ein anderes Node. Ich würde halt nur gerne im Dashboar sehen, ob eine Lampe aus bzw. an ist. Der Lampenstatus wird per CAN-Bus gesendet.

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

                                  Setz halt einen function-/change-node vor den Eingang des ui-switch, der dir den payload so aufbereitet, dass nur true/false drinsteht.

                                  Mach ich immer so

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  489
                                  Online

                                  31.7k
                                  Users

                                  79.8k
                                  Topics

                                  1.3m
                                  Posts

                                  2
                                  15
                                  2056
                                  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