Formatvorschlag
Ich habe jetzt mal einen Kompromiss versucht, mit dem hoffentlich jetzt jeder leben kann.
Ziel war weniger, die knxprod mehr oder weniger wörtlich zu übernehmen, sondern einigermaßen die Struktur zu imitieren, ohne dabei die Lesbarkeit ganz aus den Augen zu verlieren. Wenn das so klappt, lässt sich in Zukunft die komplette knxprod wie von Alex vorgeschlagen mit einem Importfilter relativ einfach anbauen, ohne die Objektstruktur über den Haufen zu werfen.
Kommentare (am liebsten "ja, so machen wir das und lassen nur den Table-Verweis weg"
) willkommen.
Hat jemand eine Dokumentation, wie der Standard die Flags ablegt? Dann würde ich das noch imitieren. Die "Property 0"-Variante ist auch nicht der Traum in Tüten.
Max
Ich habe jetzt mal einen Kompromiss versucht, mit dem hoffentlich jetzt jeder leben kann.
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <device-description version="1.0"> <manufacturer-id>0xFADE</manufacturer-id> <!-- Lesbarer Name des Herstellers, Optional --> <manufacturer>root1.de</manufacturer> <!-- Liste kompatibler Devices, Order code: 10 byte hex, mask version: 2 byte hex, app version: 5 byte hex --> <devices> <device order-info="0xCAFE4711AB1234567890" mask-version="0x0701" app-version="0x0102030405"> <device order-info="0xCAFE4711AB1234567890" mask-version="0x0701" app-version="0x0211ABFA1C"> <device order-info="0x123456789ADEAFBEAD00" mask-version="0x0201" app-version="0x0176234EAF"> </devices> <!-- Lesbarer Gerätename, Optional --> <name>6CH KNX PWM LED Controller</name> <!-- Beschreibt die KOs (informell für den Anwender) und legt den Speicherort der zugehörigen GAs fest --> <commobjects> <commobject id="10"> <description>Schalten Ein/Aus Kanal A</description> <!-- In Anlehnung an die "Kommunikationsobjecte" Spalte unter "Geräte" in der ETS --> <dpt>1</dpt> <!-- DPT 1 ist Schalten --> <pdt>UNSIGNED_CHAR</pdt> <!-- DPT1 kann IIRC auf UNSIGNED_CHAR und auf GENERIC01 abgebildet werden. --> <condition object="5" property="1" min_value="1" max-value="5"/> <!-- Optional. Communication Object steht nur zur Verfügung, wenn Object 5, Property 1 >= 1 und <= 5 ist. --> </commobject> <commobject id="11"> <description>Dimmkontrolle Kanal A</description> <dpt>3</dpt> <pdt>UNSIGNED_CHAR</pdt> <condition depends-on="use-channel-a" value="1"/> </commobject> <commobject id="12"> <description>Absolutwert Kanal A</description> <dpt>5</dpt> <pdt>UNSIGNED_CHAR</pdt> <condition depends-on="use-channel-a" value="1"/> </commobject> </commobjects> <!-- Parameter des Geräts, ggf. gruppiert. Legt deren Speicherort fest und zeigt Default-Werte --> <parameters> <parameter id="device_object_type" location="properties" object-id="0x00" property-id="0x01" offset="0x01" access="Read"> <pdt>UNSIGNED_INT</pdt> <default>0x00</default> </parameter> <parameter id="device_control" location="properties" object-id="0x00" property-id="0x0E" offset="0x01" access="ReadWrite"> <pdt>GENERIC01</pdt> <default>0x00</default> </parameter> <parameter id="service_control" location="properties" object-id="0x00" property-id="0x08" offset="0x01" access="ReadWrite"> <pdt>UNSIGNED_INT</pdt> <default>0x00</default> </parameter> <!-- Mit Memory Location statt Property --> <parameter id="application_run_state_control" location="memory" address="0x60" access="ReadWrite"> <pdt>CONTROL</pdt> </parameter> <!-- usw. --> <!-- Parameter mit Long Name und Auswahlmöglichkeit --> <parameter id="after-busvoltage-failure" location="properties" object-id="11" property-id="1" access="ReadWrite"> <description>Verhalten nach Busspannungsausfall</description> <pdt>UNSIGNED_CHAR</pdt> <dpt>5</dpt> <parameter-type>pt-bus-voltage-failure</parameter-type> <default>2</default> </parameter> <parameter id="brightness-after-busvoltage-failure" location="properties" object-id="11" property-id="2" access="ReadWrite"> <description>Helligkeitswert nach Busspannungsausfall in %</description> <pdt>UNSIGNED_CHAR</pdt> <dpt>5</dpt> <default>50</default> <parameter-type>pt-brightness</parameter-type> </parameter> <parameter id="brightness-after-busvoltage-return" location="properties" object-id="11" property-id="3" access="ReadWrite"> <description>Helligkeitswert nach Busspannungswiederkehr</description> <pdt>UNSIGNED_CHAR</pdt> <dpt>5</dpt> <default>50</default> <parameter-type>pt-brightness</parameter-type> </parameter> <parameter id="use-channel-a" location="properties" object-id="12" property-id="1" access="ReadWrite"> <description>Kanal A verwenden</description> <pdt>UNSIGNED_CHAR</pdt> <dpt>1</dpt> <default>0</default> </parameter> <parameter id="dimspeed-a" location="properties" object-id="20" property-id="1" access="ReadWrite"> <description>Dimmgeschwindigkeit</description> <pdt>KNX_FLOAT</pdt> <dpt>9</dpt> <parameter-type>pt-dimspeed</parameter-type> <default>100.0</default> <disabled-default>10.0</disabled-default> <condition depends-on="use-channel-a" value="1"/> </parameter> </parameters> <parameter-types> <parameter-type name="pt-bus-voltage-failure"> <enum text="Aus" display-order="0" value="0"/> <enum text="An" display-order="1" value="1"/> <enum text="Letzter Wert" display-order="2" value="2"/> <enum text="Helligkeitswert" display-order="3" value="3"/> </parameter-type> <parameter-type name="pt-brightness"> <min-value>0</min-value> <max-value>100</max-value> </parameter-type> <parameter-type name="pt-dimspeed"> <min-value>10.0</min-value> <max-value>100.0</max-value> </parameter-type> </parameter-types> <resources> <resource name="GroupAddressTable" location="memory" address="0xC000" size="8" access="ReadWrite"/> <resource name="GroupObjectTable" location="properties" object-id="0xF0" property-id="0x01" offset="1" size="4" access="ReadWrite"/> <resource name="GroupAssociationTablePtr" location="properties" object-id="0xF0" property-id="0x02" offset="1" size="1" access="Read" access="read"/> <resource name="GroupAssociationTable" location="memory" reference="GroupAssociationTablePtr" size="4" access="ReadWrite"/> <resource name="AccessKey" location="value">DE AD BE EF</resource> </resources> <!-- Alternativ für die "Property 0"-Variante --> <resources> <resource name="GroupAddressAssociations" location="properties" access="ReadWrite"/> <resource name="GroupObjectTable" location="properties" object-id="0xF0" property-id="0x01" offset="1" size="4" access="ReadWrite"/> <resource name="AccessKey" location="value">DE AD BE EF</resource> </resources> </device-description>
- Der <devices>-tag ist dringeblieben. Meinetwegen machen wir ihn optional.
- Bei den Communication Objects sind PDT und DPT verpflichtend. Im Moment haben sie aber keine praktische Bedeutung hier, sie könnten Stand heute auch entfallen oder optional werden.
- PDT ist auf den Property-Werten geblieben. Mir wird das sonst zu kompliziert, wenn ich noch zwischen uInt8 und UNSIGNED_CHAR unterscheiden muss.
- Für die verschachtelten Anzeigen bin ich beim <condition>-Tag geblieben. Der knxprod-Ansatz ist um Größenordnungen aufwändiger.
- Die Parameter-Beschreibung selbst orientiert sich in der Struktur grob an der knxprod, allerdings habe ich ein bisschen mehr in Child Nodes geschoben.
- Was per Memory gelesen/geschrieben wird, hat "location=memory address=xxxx" als Tags.
- Bei Property-Zugriff gilt "location=properties object-id=xx property-id=yy offset=zz"
- Access ist durchgehend entweder "Read" oder "ReadWrite"
- Für Wertebeschränkungen oder Dropdowns bin ich bei "parameter-type" geblieben. Diese sind an einer eigenen Stelle, auch wenn Alex davon nicht begeistert sein wird.
- Die Parameter-Types haben entweder eine enum-Liste oder min-value und max-value. Komplexere Bedingungen würde ich nicht zulassen. Grund: so kann ich per Tooltip eine verständliche Hilfe einblenden ("Zulässig: 0...100"). Mit einer Regex wird das schwieriger.
- Bei den Tabellen habe ich wieder bei der knxprod stibitzt. Dort heißen sie "resources", was ja nicht falsch ist. Hier gibt es einen ganzen Strauß an Möglichkeiten:
- <resource name="GroupAddressTable" location="memory" address="0xC000" size="8" access="ReadWrite"/> - der GroupAddresstable hat 8 Einträge an Speicheradresse 0xC000
- <resource name="GroupObjectTable" location="properties" object-id="0xF0" property-id="0x01" offset="1" size="4" access="ReadWrite"/> - der gesamte GroupObjectTable ist als Property abgelegt (Object F0, ID 1, Einträge 1...4).
- <resource name="GroupAssociationTablePtr" location="properties" object-id="0xF0" property-id="0x02" offset="1" size="1" access="Read" access="read"/> - die Adresse des Association Tables ist in Object F0, Property 02 an Index 1 abgelegt. Mit dieser Adresse wiederum kann der Table dann ausgelesen und geschrieben werden.
Ob man diese Verweismöglichkeit braucht, lässt sich diskutieren. Ich könnte auch ganz gut ohne, aber für knxprod-Unterstützung wäre es sowieso nötig. - <resource name="GroupAssociationTable" location="memory" reference="GroupAssociationTablePtr" size="4" access="ReadWrite"/> - der eigentliche Association Table ist im Speicher an der Adresse, die durch GroupAssociationTablePtr (vorheriger Eintrag) festgelegt wird.
- <resource name="AccessKey" location="value">DE AD BE EF</resource> - den Key (fixer Wert, dafür steht "location=value") habe ich gleich hier mit abgebildet.
- <resource name="GroupAddressAssociations" location="properties" access="ReadWrite"/> - das ist der Verweis auf die Property 0.
Kommentare (am liebsten "ja, so machen wir das und lassen nur den Table-Verweis weg"

Hat jemand eine Dokumentation, wie der Standard die Flags ablegt? Dann würde ich das noch imitieren. Die "Property 0"-Variante ist auch nicht der Traum in Tüten.
Max
Kommentar