Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Blockly: JSON mit Regex aus Variable auslesen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Blockly: JSON mit Regex aus Variable auslesen

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

      Moin

      wegen erwogenem Umstieg von Zigbee2mqtt auf Tasmota-Zigbee möchte ich gerne den von Tasmota übermittelten JSON Record auslesen.
      Beispiel:

      {"ZbReceived":{"0x4A9F":{"Device":"0x4A9F","Name":"0x4A9F","0006!01":"","Power":1,"Endpoint":1,"LinkQuality":118}}}
      ## Umwandlung in nachfolgendes klappt ja
      {"0x4A9F":{"Device":"0x4A9F","Name":"0x4A9F","0006!01":"","Power":1,"Endpoint":1,"LinkQuality":118}}
      

      Nun stehe ich aber vor dem Problem, dass ich nirgends eine passende Beschreibung zur Verwendung von RegEx/Wildcard bei Verwendung von VARIABLEN finde, denn ich benötige ja das Device (im Beispiel "0x4A9F"), welches sich gemeldet hat.

      Wichtige Anmerkung (um Diskussionen dahingehend zu vermeiden - danke)
      a) es soll auch eine Variable bleiben und kein DP werden.
      b) ich möchte keine Tasmota Rules dafür verwenden.

      Ich habe zwar ein Workaround, jedoch empfinde ich dieses als sehr holperig, unschön und es fehlt auch eine "undefined" Behandlung (Gerät aus Liste bekannte Geräte ist kein Treffer), welche sich per se ja gut für eine Fallunterscheidung nutzen liesse.

      Bildschirmfoto vom 2024-01-03 14-11-18.png

      Gruss von der Ostsee
      Chris

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

        @chris-1 dann nutz halt JSONATA - da brauchst auch kein RegEx

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

          @mickym @mickym Dazu müsste ich wohl Java lernen, sehe ich das richtig?

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

            @chris-1 nein. JSONATA ist ein Bibliothek und es gibt im <Blockly einen Baustein. Du willst als einfach nur den Device- Namen aus obigem Objekt? JSONATA sollte man lernen, ist nicht einfach aber genial.

            Chris 1 1 Reply Last reply Reply Quote 1
            • Chris 1
              Chris 1 @mickym last edited by Chris 1

              @mickym Jupp, ich möchte einfach nur den Namen des Devices, welcher mir an dieser Stelle erstmalö unbekannt ist (deswegen die Krücke beim Blockly mit der Auflistung bekannter Devices).

              Also im Prinzip so etwas wie "Attribut von....", nur, dass ich nicht den Wert, sondern den Namen/Bezeichner haben möchte.

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

                @chris-1

                2f8cabd3-b996-4693-8802-5ee32690de64-image.png

                <xml xmlns="https://developers.google.com/blockly/xml">
                 <variables>
                   <variable id=";po#/$v(8.UbHdHNkx[6">Objekt</variable>
                 </variables>
                 <block type="variables_set" id=":=#[V+q{~-1q78b_H^FF" x="-1137" y="-687">
                   <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                   <value name="VALUE">
                     <block type="convert_json2object" id="?vV.vvxZ^NQN^_lWU1f}">
                       <value name="VALUE">
                         <block type="text" id="+fF--6Ew-2u1R;P~2mBq">
                           <field name="TEXT">{"ZbReceived":{"0x4A9F":{"Device":"0x4A9F","Name":"0x4A9F","0006!01":"","Power":1,"Endpoint":1,"LinkQuality":118}}}</field>
                         </block>
                       </value>
                     </block>
                   </value>
                   <next>
                     <block type="debug" id="Di9b3@!X-|w!(OH[MyQR">
                       <field name="Severity">log</field>
                       <value name="TEXT">
                         <shadow type="text" id="Qc!nM@ch{Sc_{l1rPEtk">
                           <field name="TEXT">test</field>
                         </shadow>
                         <block type="variables_get" id="BRJ*7NTHanJ(0mYxIgZP">
                           <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                         </block>
                       </value>
                       <next>
                         <block type="debug" id="CSzbUrdljdY[mU6V(Y9H">
                           <field name="Severity">log</field>
                           <value name="TEXT">
                             <shadow type="text" id="3TF}V:USjkEO{0|$k.HC">
                               <field name="TEXT">test</field>
                             </shadow>
                             <block type="convert_jsonata" id="=ZN{fKMn7@2JC^*jQ1/8">
                               <value name="EXPRESSION">
                                 <shadow type="text" id="8OI}[4dY`zbl|(X*@@%@">
                                   <field name="TEXT">**.Device</field>
                                 </shadow>
                               </value>
                               <value name="TARGET">
                                 <block type="variables_get" id="8pAGf+2-KQ#4,J~^P=S~">
                                   <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                                 </block>
                               </value>
                             </block>
                           </value>
                         </block>
                       </next>
                     </block>
                   </next>
                 </block>
                </xml>
                

                Chris 1 2 Replies Last reply Reply Quote 1
                • Chris 1
                  Chris 1 @mickym last edited by

                  @mickym Spitze! Danke!
                  Dann muss ich jetzt wohl mal das Update des Adapters machen.

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

                    @chris-1 Was für ein Update? Lernt einfach JSONATA - es ist eine so tolle Bibliothek und zum Lernen gibt es dieses tolle Fenster.
                    Der Baustein ist einfach bei den Konvertierungspuzzlestücken.

                    e97f636e-071e-4e3f-b359-eb163086af1a-image.png

                    c0f05ede-7f7f-424b-aecb-c7f1acfc1c10-image.png

                    https://try.jsonata.org/saH3BvGAO

                    und wenn es Fragen zu JSONATA gibt - gerne. Ich musste auch lernen und viel probieren.

                    In diesem Fall - kann man mit den 2 sternchen einfach alle Ebenen drüber überspringen und ignorieren:

                    e7004f00-04a5-4108-b104-7bf904c695b0-image.png

                    Chris 1 1 Reply Last reply Reply Quote 1
                    • Chris 1
                      Chris 1 @mickym last edited by Chris 1

                      @mickym Das Update des Java Adapters war noch fällig, war 6.irgendwas

                      Hab ich gemacht und Deinen Hinweis, der wirklich Gold wert ist, umgehend ausfehührt und strahle jetzt 🙂
                      Unter Konvertern hatte ich nach soetwas nie gesucht - nun weiss ich es.

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

                        @mickym Kurze Nach-Frage:

                        Ich las an anderer Stelle von Dir, dass man, um mögliche Trigger aus zu lösen, man den "Datenpunkt als Text" besser extern schreibt.
                        Ist nachfolgendes Vorgehen von mir von Hinten durch's Knie geschossen, oder wäre das in Ordnung:

                        Bildschirmfoto vom 2024-01-03 16-11-35.png

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

                          @chris-1 Also ich verstehe nicht ganz was Du meinst. Jedenfalls musst Du - wenn ein String aus dem JSONATA rauskommt und dieser kein Array ist, da eindeutig - keine Textumwandlung machen. Das ist bereits Text. (s. Screenshot).

                          Ich verstehe es ehrlich gesagt gar nicht und wenn Du ales topic für Deinen mqtt Aufruf nur devices davor hängen möchtest, dann kannst du das auch gleich im JSONATA Ausdruck mit machen. Du musst halt den Trigger wieder auf deinen Datenpunkt umstellen, aber elegantesten und kürzesten wäre dann. Ach ja und Deine mqtt-Instanz halt eintragen oder wieder auf alle Instanzen stellen.

                          1aea1601-2196-4c8a-90be-30d1be0ca080-image.png

                          a1026163-d13a-45b4-a831-2976345e852d-image.png

                          <xml xmlns="https://developers.google.com/blockly/xml">
                           <variables>
                             <variable id=";po#/$v(8.UbHdHNkx[6">Objekt</variable>
                           </variables>
                           <block type="on_ext" id="7qoHFnear)/bPVn}^`36" x="-1252" y="-733">
                             <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
                             <field name="CONDITION">ne</field>
                             <field name="ACK_CONDITION"></field>
                             <value name="OID0">
                               <shadow type="field_oid" id="s+JP[dx)kqRLANP7,,Bh">
                                 <field name="oid">default</field>
                               </shadow>
                               <block type="text" id="P!1F$,ZDFBeL]yqfuEJP">
                                 <field name="TEXT">0_userdata.0.Test.JSON</field>
                               </block>
                             </value>
                             <statement name="STATEMENT">
                               <block type="variables_set" id="P_jj/*%D7qyI8YnQu]sr">
                                 <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                                 <value name="VALUE">
                                   <block type="convert_json2object" id="2SP(Q`Cec~nd9Z#Z+.D#">
                                     <value name="VALUE">
                                       <block type="on_source" id="HCJhj!hnn!UQ#!esJXD~">
                                         <field name="ATTR">state.val</field>
                                       </block>
                                     </value>
                                   </block>
                                 </value>
                                 <next>
                                   <block type="mqtt_sendmessage" id="^xVmHTBYrIiPJs7,^;`B">
                                     <field name="INSTANCE">.1</field>
                                     <field name="RETAIN">FALSE</field>
                                     <value name="TOPIC">
                                       <shadow type="text" id="jxDsePT7Ey8Y`A`EQYo;">
                                         <field name="TEXT">your/topic/here</field>
                                       </shadow>
                                       <block type="convert_jsonata" id="=ZN{fKMn7@2JC^*jQ1/8">
                                         <value name="EXPRESSION">
                                           <shadow type="text" id="8OI}[4dY`zbl|(X*@@%@">
                                             <field name="TEXT">"devices/" &amp; **.Device</field>
                                           </shadow>
                                         </value>
                                         <value name="TARGET">
                                           <block type="variables_get" id="8pAGf+2-KQ#4,J~^P=S~">
                                             <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                     <value name="MESSAGE">
                                       <shadow type="text" id="Or;eOc8zoGL3p`KpxbCS">
                                         <field name="TEXT">your message</field>
                                       </shadow>
                                       <block type="convert_object2json" id="UU,DBy)Y3m~HLr#vDvq+">
                                         <field name="PRETTIFY">TRUE</field>
                                         <value name="VALUE">
                                           <block type="get_attr" id="[D{*XU=t9/d]{94-Rm|.">
                                             <value name="PATH">
                                               <shadow type="text" id="RjZG4]k(0@z!dnFOus39">
                                                 <field name="TEXT">ZbReceived</field>
                                               </shadow>
                                             </value>
                                             <value name="OBJECT">
                                               <block type="variables_get" id="|x.o}#1ruGU_OVR.:)s%">
                                                 <field name="VAR" id=";po#/$v(8.UbHdHNkx[6">Objekt</field>
                                               </block>
                                             </value>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                   </block>
                                 </next>
                               </block>
                             </statement>
                           </block>
                          </xml>
                          

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

                            @mickym Oh, das sieht natürlich deutlich smarter aus, danke!

                            Das Script ist für mich der erste Verteiler, welcher vom Tasmota-Zigbee-Gateway rein kommenden Sachen verteilen soll.
                            Eine Weiter-Behandlung soll dann in separat getriggerten (devices.*) Scripten erfolgen, da die Geräte ja sehr unterschiedliche Daten verarbeiten.
                            Im Beispiel war es der erste Test mit Button, nun habe ich den eben per Post eingetroffenen AirQuality-Sensor mit dran gehängt.

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

                              @chris-1 sagte in [gelöst] Blockly: JSON mit Regex aus Variable auslesen:

                              Das Script ist für mich der erste Verteiler, welcher vom Tasmota-Zigbee-Gateway rein kommenden Sachen verteilen soll.

                              Tja Du siehst, wenn man gleich das Ziel ausformuliert, dann bekommt man auch gleich einen Vorschlag.

                              Chris 1 2 Replies Last reply Reply Quote 0
                              • Chris 1
                                Chris 1 @mickym last edited by

                                @mickym said in Blockly: JSON mit Regex aus Variable auslesen:

                                Tja Du siehst, wenn man gleich das Ziel ausformuliert, dann bekommt man auch gleich einen Vorschlag.

                                @chris-1 said in Blockly: JSON mit Regex aus Variable auslesen:

                                wegen erwogenem Umstieg von Zigbee2mqtt auf Tasmota-Zigbee möchte ich gerne den von Tasmota übermittelten JSON Record auslesen.

                                War das so mißverständlich ausgedrückt?

                                Nochmals ganz herzlichen Dank für die grandiose & schnelle Hilfestellung!

                                Gruss von der Ostsee
                                Chris

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

                                  @mickym Nochmal eine Nachfrage zu JsonATA

                                  Wie greife ich auf das x-te (hier 2tes) Elemente-Paar im JSON String zu?
                                  Habe schon alle möglichen Tutorials hoch und runter gesucht, aber hierzu nichts gefunden.

                                  Beispiel für empfangene Daten:

                                  {"Device":"0x0D73","EF00/0214":83,"Endpoint":1,"LinkQuality":136}
                                  {"Device":"0x0D73","EF00/0215":469,"Endpoint":1,"LinkQuality":136}
                                  {"Device":"0x0D73","EF00/0216":749,"Endpoint":1,"LinkQuality":136}
                                  {"Device":"0x0D73","EF00/0202":295,"Endpoint":1,"LinkQuality":136}
                                  

                                  Müsste ich das ggf über sowas wie "$spread()" lösen?

                                  Schon mal vorab herzlichen Dank
                                  Chris

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

                                    @chris-1 Das steht ddoch niemals so alleine da? - Entweder ist das ein Array mit Objekten (also das ganze in eckigen Klammern und mit Kommas?) oder möchtest Du auf den Wert EF00/0214 zugreifen?

                                    So steht es aber mit Sicherheit nirgends.

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

                                      @mickym Ja, ich möchte diese (AirQuality) Werte unter "EF00/02xx" selektiv zugreifen.

                                      Und nein, das ist so kein Array, sonsern beispielhaft aus dem Log heraus geschnippelt. Es kommt immer nur ein JSON an.

                                      mickym 2 Replies Last reply Reply Quote 0
                                      • mickym
                                        mickym Most Active @Chris 1 last edited by

                                        @chris-1 Und diese Objekte sind in einem Array oder willst Du jetzt nur aus einem solchen Wert EF00/02xx zugreifen?

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

                                          @chris-1 sagte in [gelöst] Blockly: JSON mit Regex aus Variable auslesen:

                                          @mickym Ja, ich möchte diese (AirQuality) Werte unter "EF00/02xx" selektiv zugreifen.

                                          Und nein, das ist so kein Array, sonsern beispielhaft aus dem Log heraus geschnippelt. Es kommt immer nur ein JSON an.

                                          Dann verstehe ich Dein Problem glaube ich nicht???

                                          a48483f3-e848-47b3-bb2f-f71dd93a664b-image.png

                                          Oder willst Du das Attribut mit JSONATA extrahieren?

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

                                            @mickym Der Sensor liefert 6? unterschiedliche Werte.
                                            Diese stehen an 2ter Stelle des JSON in der Form "EF00/02<xx>" : Value

                                            Ich möchte also a) wissen welcher Wert (zB "EF00/0212") übermittelt wird,
                                            b) Value ergibt sich danach leichter.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.0k
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            26
                                            1625
                                            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