Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie sind die "Dynamic" blöcke in den XML Deskriptoren zu lesen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Wie sind die "Dynamic" blöcke in den XML Deskriptoren zu lesen?

    Hallo,

    ich bin momentan dabei die Informationen in den KNX XML Deskriptoren zu lesen und zu verarbeiten und frage mich gerade, wie genau die Informationen im "Dynamic" block zu interpretieren sind. Vor allem interessiert mich, wie die ComObjects in Abhängigkeit der Konfiguration zu interpretieren sind.

    Wenn ich sie von oben nach unten interpretiere, dann sehe ich da einige choose Blöcke mit nur einem "when" ... das würde ich als "if" in einer normalen Programmiersprache interpretieren. Dann sehe ich choose Blöcke mit nur einem default when (Diese verstehe ich ehrlicherweise gar nicht ... ist das wie wenn ich z.B. in Java einfach einen code-block in geschweifte Klammern setze?

    Was ich nun nicht so ganz verstehe, ist dass es hier nun mehrere logische Pfade zu einem ComObject gibt. Teilweise gäbe es sogar Bedingungen in denen ein ComObject als Byte und als Bit zu interpretieren ist. Es muss also eine weitere Regel bei der Auswertung geben, die mir noch nicht klar ist.

    Ich würde mich also sehr über nähere Infos darüber freuen, wie diese Dynamic Blöcke zu lesen sind.

    Gruß,
    Chris

    #2
    Hallo Chris,

    choose Blöcke mit nur einem default when
    Die werden immer aktiv, wenn nur das choose selbst und der kontrollierende Parameter aktiv sind. Dein Vergleich mit dem Code-Block trifft es ziemlich gut.

    Zitat von cdutz Beitrag anzeigen
    Teilweise gäbe es sogar Bedingungen in denen ein ComObject als Byte und als Bit zu interpretieren ist.
    Dann dürfen diese ComObjectRefs aber nicht gleichzeitig aktiv sein. Irgendwas in der choose/when-Hierarchie muss diese beiden Zweige gegeneinander "verriegeln".

    Gruß, Klaus

    Kommentar


      #3
      Aaaaahh ... ok ... glaube jetzt ist der Groschen gefallen ... Hatte mich schon gefragt warum die Default-Blöcke überhaupt parameter haben.

      Also ein Parameter ist "aktiv" wenn ich vorher in meinem Pfad ein ParameterRefRef für diesen Parameter habe und er somit "benutzt" wird oder "aktiv" wird. In dem Fall ist es also egal welchen Wert er hat, sowie er aktiv ist, wird der when-default block verwendet ... glaube dann baue ich nochmal meine logik komplett um und hoffe dass am ende die Ergebnisse mehr sinn machen (Die Chancen sind aber gut) :-)

      Vielen Dank für die zügige und kompetente Hilfe.

      Chris

      Kommentar


        #4
        Nur eine kleine Frage noch ... wie sind "ParameterBlock" Elemente zu interpretieren?

        Kommentar


          #5
          Ein ParameterBlock ist das Grüne.
          Ein Channel ist das Rote und beinhaltet ParameterBlöcke
          Unbenannt.png
          OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

          Kommentar


            #6
            Verstehe ich das dann richtig, dass Channels und ParameterBlöcke eher für die optische Gruppierung im ETS verantwortlich sind?

            Wenn ich mir hier so einige XMLs anschaue, dann wird die Id im Channel eigentlich nirgends verwendet ... ich würde daher vermuten, dass dies ein "totes" element ist.
            Bei den "ParmeterBlock" Elementen wird zusätzlich ein ParameterRefRef verwendet. Dieses wird allerdings nicht vorher deklariert/aktiviert. Da ich aber sehe, dass es später in "choose" Elementen referenziert wird, scheint es wohl den parameter zu aktivieren, richtig? Es wäre in diesem Fall also fast identisch zu einem ParameterRefRef, nur dass es zusätzlich für's UI die Elemente noch zu einer gruppe zusammenfasst? Wäre das eine valide Interpretation?

            Viele Grüße,
            Chris

            Kommentar


              #7
              Hi,

              ich kennen nur ParameterBlock mit TextParamterRefRef, meinst Du die? Die sagen nur, welcher Text für den ParameterBlock im UI erscheinen soll, abhängig von der Auswahl im Parameter.

              Mal aus Interesse: Was machst Du damit? Ich erzeuge die ja in meinem Hobby-Projekt, die Auswertung hab ich immer der der ETS überlassen

              Gruß, Waldemar
              OpenKNX www.openknx.de

              Kommentar


                #8
                Ja,

                diese habe ich zwar auch gesehen. Das würde ich auch sagen hätte für mich 100% Sinn gemacht. Leider war es in dem ersten XML, dass ich mir geschnappt habe, allersings so:

                Code:
                 <Channel Name="Generic" Text="" Number="0" Id="M-0008_A-10D1-11-28FB-O000A_CH-0">
                <ParameterBlock Id="M-0008_A-10D1-11-28FB-O000A_PB-3" Name="Allgemein" ParamRefId="M-0008_A-10D1-11-28FB-O000A_P-3_R-3">
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-16_R-16" />
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-17_R-17" />
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-1_R-1" />
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-2_R-2" />
                <choose ParamRefId="M-0008_A-10D1-11-28FB-O000A_P-2_R-2">
                <when test="1">
                <ComObjectRefRef RefId="M-0008_A-10D1-11-28FB-O000A_O-0_R-1085" />
                <ComObjectRefRef RefId="M-0008_A-10D1-11-28FB-O000A_O-1_R-1086" />
                ...snip ...
                <choose ParamRefId="M-0008_A-10D1-11-28FB-O000A_P-3_R-3">
                <when default="true">
                <choose ParamRefId="M-0008_A-10D1-11-28FB-O000A_P-6_R-6">
                <when test="170">
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-7_R-7" />
                <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-8_R-8" />
                Man sieht, dass der ParmeterBlock eine ParamRefId hat. Und diese wird in einem der choose blöcke als parameter werwendet.

                Könnte man es so sehen, das:
                Code:
                <ParameterBlock Id="M-0008_A-10D1-11-28FB-O000A_PB-3" Name="Allgemein" ParamRefId="M-0008_A-10D1-11-28FB-O000A_P-3_R-3">
                      ... snip ....
                </ParameterBlock
                Die Kurzform ist von:
                Code:
                <ParameterBlock Id="M-0008_A-10D1-11-28FB-O000A_PB-3" Name="Allgemein">
                      <ParameterRefRef RefId="M-0008_A-10D1-11-28FB-O000A_P-3_R-3"/>
                      ... snip ....
                </ParameterBlock
                Gruß,
                Chris

                Kommentar


                  #9

                  Zitat von cdutz Beitrag anzeigen
                  eher für die optische Gruppierung
                  Ja.

                  Es sind keine "toten" Elemente, da sie ja für die Anzeige eine wichtige Rolle Spielen. Über die ID kann man den Text auch in verschiedenen Sprachen bereitstellen (was aber auch über ParamRefId funktioniert)

                  Es gibt auch IndependentChannels. Diese werden denn nicht als Ausklappbares Element angezeigt, sondern zeigen dauerhaft nur die untergeordneten Parameterblöcke.
                  Gleiches gilt glaub auch für einen Channel, der keinen/leeren Text hat.

                  Gruß Mike
                  OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                  Kommentar


                    #10
                    Zitat von cdutz Beitrag anzeigen
                    Die Kurzform ist von:
                    Nein. Der ParamRefId wird nur für den Text oder so benutzt.
                    Wenn du dir den ParameterType von dem Parameter anschaust, wird der vermutlich TypeNone sein.
                    OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                    Kommentar


                      #11
                      Ok ... ich habe das mal zurück verfolgt und in der tat ... typ enthält "dummy". Aber ich dachte die ParameterBlock Id wäre für die internationalisierung zuständig ... warum dann ein zweites, welches ein dummy ist? Und for allem scheint dieses ja in einem "choose" verwendet zu werden (klar: mit default=true) ... aber da es für diese ParameterRef sonst keine "ParameterRefRef" elemente gibt und dieses in dem choose verwendet wird, muss der ParameterBlock auch den Parameter aktivieren, sonst würde das ja nicht gehen, oder sehe ich das falsch?

                      Ich glaube ich muss mir mal meine XSLT so bauen, dass sie die IDs überall durch klartext-namen und klartext datentypen ersetzt ... ich denke dann wird sich mehr erschließen.

                      Kommentar


                        #12
                        IDs müssen Channel und ParameterBlock immer haben. Ich denke danach führen beide Wege nach Rom, man muss sich halt für einen Entscheiden.

                        Meine Vermutung ist auch, dass solche Konstellationen durch eine Konvertierung von vdx zu knxprod erstellt werden. In neueren Produktdatenbanken habe ich das zumindest noch nicht gesehen.

                        Zitat von cdutz Beitrag anzeigen
                        oder sehe ich das falsch
                        Das siehst du richtig. Man könnte das choose in dem Fall auch weg lassen, aber wie gesagt denke ich, dass das durch das konvertieren kommt.


                        Gruß Mike
                        OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                        Kommentar


                          #13
                          Ah ok ... das mit dem Konvertieren könnte natürlich ein Grund sein. Da wird ja gerne mal etwas gemacht, was man bei manueller Arbeit als sinnlos ansehen würde. Ich glaube, wenn sich jemand den Code anschaut, den mein PLC4X Code Generator so generiert, würde man sich das sicher auch gelegentlich fragen. Macht aber den generator simpler.

                          Ich glaube vorerst ist mein Wissensdurts gestillt ... jetzt muss ich nur noch umsetzen was ich jetzt weiß.

                          Vielen Dank nochmal an alle,

                          Chris

                          Kommentar


                            #14
                            Du musst auch bedenken, dass die Ausdrucksfähigkeit der XML durch das zugrundeliegende Schema bestimmt wird. Ich bin erst ab Schema 1.1 xmlns="http://knx.org/xml/project/11" eingestiegen, da gab es noch keine TextParameterRefId (so heißt es, nicht TextParameterRefRef, sorry). Hab mich dann durch Schema 1.4 gekämpft und schaue mir gelegentlich an, was in 2.0 jetzt geht.

                            Die Konstellation, die Du hattest, hatte ich noch nicht. Eine gute Idee ist, die knxprod in die ETS zu importieren und zu schauen, was das jeweilige Konstrukt bewirkt. Wenn es keine (sichtbaren) Auswirkungen hat, dann muss man eben raten .

                            Gruß, Waldemar
                            OpenKNX www.openknx.de

                            Kommentar


                              #15
                              Jetzt hab ich mal geschaut und festgestellt, dass ich "default" im "when" gar nicht nutze. Deswegen mal eine Frage nach dem genauen Verhalten... Nehmen wir mal folgendes an:
                              • ein Enum-Typ T mit den Werten 1-5
                              • ein Parameter P vom Typ T mit value="3"
                              • ein passender ParameterRef PR, der auf P zeigt.
                              Im dynamic-Teil habe ich dann irgendwo ein
                              • ParameterRefRef, der auf PR zeigt
                              • Später dann ein choose
                                • when test="default"
                                  • X
                                • when test=">0"
                                  • Y
                                • when test="3"
                                  • Z
                                • when test="4"
                                  • W
                              Ich würde folgendes erwarten bzw. erfragen, korrigiert mich bitte, wenn was falsch ist:
                              1. Wenn der ParamRefRef nicht aktiviert ist (also nirgendwo im UI auftaucht), dann wird das ganze "when" ignoriert.
                              2. Wenn der ParamRefRef aktiviert wird und der User noch nichts gemacht hat, dann steht da ja eine 3 drin (default), dann sollte X, Y und Z aktiv sein (also interpretiert werden).
                              3. Wenn der User den ParamRefRef auf 4 stellt, dann sind nur noch Y und W aktiv.
                              4. Wenn der User wieder auf 3 geht, was hab ich dann: Y und Z oder X, Y und Z? Die Frage ist hier, ob "default" meint, dass der Parameter noch nicht vom User verstellt wurde oder ob es besagt, dass der Wert des Parameters gleich dem Wert des Defaultwertes (value) ist.
                              5. Und falls Y und Z in 4 rauskommen: Was passiert, wenn der ParamRefRef zwischendurch inaktiv (z.B. durch einen anderen choose) und dann wieder aktiv wird, mit der drin stehenden 3: Hab ich dann wieder Y, Z oder doch ein X, Y und Z?
                              Edit:
                              Jetzt habe ich mal genau das hier gelesen:

                              Zitat von Klaus Gütter Beitrag anzeigen
                              Die werden immer aktiv, wenn nur das choose selbst und der kontrollierende Parameter aktiv sind.
                              Und wahrscheinlich jetzt erst verstanden. when="default" hat nichts mit dem Wert des Parameters zu tun, stimmt's? Also zu kompliziert gedacht?

                              Aber dann sind die beiden
                              • when test="default"
                              • when test=">0"
                              gleichbedeutend, oder?

                              Gruß, Waldemar

                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X