Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Switch-Node und JSON

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Switch-Node und JSON

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
15 Beiträge 2 Kommentatoren 2.2k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • SchlippiS Offline
    SchlippiS Offline
    Schlippi
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • R Offline
      R Offline
      rewenode
      schrieb am zuletzt editiert von
      #2

      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 Antwort Letzte Antwort
      0
      • SchlippiS Offline
        SchlippiS Offline
        Schlippi
        schrieb am zuletzt editiert von
        #3

        {"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 Antwort Letzte Antwort
        0
        • R Offline
          R Offline
          rewenode
          schrieb am zuletzt editiert von
          #4

          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 Antwort Letzte Antwort
          0
          • R Offline
            R Offline
            rewenode
            schrieb am zuletzt editiert von
            #5

            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 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              rewenode
              schrieb am zuletzt editiert von
              #6

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

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

              1 Antwort Letzte Antwort
              0
              • R Offline
                R Offline
                rewenode
                schrieb am zuletzt editiert von
                #7

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

                1 Antwort Letzte Antwort
                0
                • SchlippiS Offline
                  SchlippiS Offline
                  Schlippi
                  schrieb am zuletzt editiert von
                  #8

                  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 Antwort Letzte Antwort
                  0
                  • R Offline
                    R Offline
                    rewenode
                    schrieb am zuletzt editiert von
                    #9

                    Alles klar wart mal kurz.

                    1 Antwort Letzte Antwort
                    0
                    • R Offline
                      R Offline
                      rewenode
                      schrieb am zuletzt editiert von
                      #10

                      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 Antwort Letzte Antwort
                      0
                      • R Offline
                        R Offline
                        rewenode
                        schrieb am zuletzt editiert von
                        #11

                        Ü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 Antwort Letzte Antwort
                        0
                        • SchlippiS Offline
                          SchlippiS Offline
                          Schlippi
                          schrieb am zuletzt editiert von
                          #12

                          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 Antwort Letzte Antwort
                          0
                          • R Offline
                            R Offline
                            rewenode
                            schrieb am zuletzt editiert von
                            #13

                            @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 Antwort Letzte Antwort
                            0
                            • SchlippiS Offline
                              SchlippiS Offline
                              Schlippi
                              schrieb am zuletzt editiert von
                              #14

                              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 Antwort Letzte Antwort
                              0
                              • R Offline
                                R Offline
                                rewenode
                                schrieb am zuletzt editiert von
                                #15

                                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 Antwort Letzte Antwort
                                0
                                Antworten
                                • In einem neuen Thema antworten
                                Anmelden zum Antworten
                                • Älteste zuerst
                                • Neuste zuerst
                                • Meiste Stimmen


                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                649

                                Online

                                32.5k

                                Benutzer

                                81.7k

                                Themen

                                1.3m

                                Beiträge
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                ioBroker Community 2014-2025
                                logo
                                • Anmelden

                                • Du hast noch kein Konto? Registrieren

                                • Anmelden oder registrieren, um zu suchen
                                • Erster Beitrag
                                  Letzter Beitrag
                                0
                                • Home
                                • Aktuell
                                • Tags
                                • Ungelesen 0
                                • Kategorien
                                • Unreplied
                                • Beliebt
                                • GitHub
                                • Docu
                                • Hilfe