Module XML

Define the object model

Each WinGuard-compatible module has an associated XML file describing its functionality to the user; we commonly refer to this as the Module XML.

The default name of this file is derived from the name of the module. For example, a module with the name “MyMod” uses the XML file MyMod.module.xml, etc. This can be customized using the <ModuleDef> definition in the Manifest XML. The Module XML file is loaded from the WinGuard project directory. If it is not already present there when starting an Extension or if it has been modified, the XML is copied from the module’s binary directory. When setting up an Extension in WinGuard, an XML file can alternatively be specified explicitly or by using the custom folder setting.

For most of the strings contained in the XML, implicit LNG IDs are used which can be translated in the language (LNG) files. In addition, the XML file may also contain explicit LNG references. The default names of the LNG files with the translations (including those for the XML strings) are also derived from the name of the module. If the module has the name “MyMod”, the corresponding LNG files are called MyMod_de.lng, MyMod_en.lng, etc. This can be customized using the <LngFileBase> definition in the Manifest XML.

The Module XML file and the LNG files are not only used by the Extension itself but are also intended for the user of the Extension (in this case WinGuard) and can be thought of as containing a “manual” with “instructions” for handling the Extension.

The default names of the help files for the module are also derived from the name of the module. If the module has the name “MyMod”, the corresponding help files are called MyMod_de.html, MyMod_en.html, etc. This can be customized using the <HelpFileBase> definition in the Manifest XML.

The root node <ModuleDef> contains four sections for defining supported Nodes, Objects, Activities and forms. The various XML nodes and attributes are described in detail below.

<ModuleDef>

Root node of the Module XML file with up to six sections.

Description
<Settings>… Container with <Setting> definitions of the Extension, referencable.
<Module>… Definitions for the module itself. Only available with the adapter trait.
<Nodes>… Container with <Node> definitions of the usable Nodes. Only available with the adapter trait.
<Objects>… Container for <Object> definitions of the Objects including the mapping. Only available with the adapter trait.
<Activities>… Container for <Activity> definitions (see Activities). Only available with the adapter trait.
<Incident>… Definition of an Incident. Only available with the adapter trait.
<Forms>… Container for <Form> definitions of the forms.

<Settings>

Container with a list of <Setting> definitions. These can be referenced in the settings form.

Fixed Settings of the Extension that cannot be changed in the settings form are also entered here.

The value attribute specifies the value or start value.

<Setting>

Defines a configurable or fixed Setting of the Extension or sets the default value of an application-specific Setting. An application-specific Setting also has to be explicitly listed here, if the Extension needs the value of this Setting for its own handling.

Description Remarks
id (mandatory) Symbol Path. Declares the ID of the Setting. Default: “[set.<id>]”
type Value type e.g., “string”
kind Explanation of the type indication. e.g., “file”
minval Minimum value for number types.
maxval Maximum value for number types.
maxlen Maximum number of characters for string types.
value (Default) value
available The Property is only available under the described condition. The syntax is defined in Expressions.
mandatory ≥ext.common 0.2.0 Flag indicating whether a non-empty value must be set. 0/1; default: 0
ref ≥ext.common 0.2.1 Defines a reference collection type. e.g., “profile.id”
filter ≥ext.common 0.2.1 Defines a filter used by a reference collection type. The syntax is defined in Expressions. e.g., “type!=2”
contexts Defines whether a station or user specific Settings are needed. “user” and/or “station” are currently supported. e.g., “user,station”
desc Semantic description of the Setting.
<Option>… Defines a possible value of an Enum Setting.
<Setting>… Defines a nested Setting, that consists of multiple Setting entries.
<Param>… Additional parameters as key value pairs to specify attributes, e.g., to describe a “kind”.

<Module>

Defines the Object that represents the interface itself. Used to define special States and Operations, etc.

It has the same definitions such as <Object> except the “id” attribute.

<Nodes>

Container with a list of <Node> definitions.

Description Remarks
multiple Default value for the multiple attribute (see Node definition below) 0/1; default: 0
discoverable “1” means, Nodes are provided by the XML definition or the Extension.
“0” means that the Nodes of the Extension must be created manually so that the Automatic Data Supply works.
0/1; default: 0

<Node>

Reference to an Object usable as a Node.

Description Remarks
id Symbol. Only serves for creation of the LNG ID for the Node name. → “[node.<id>]”
name Alternatively, the name can be indicated explicitly here.
browsable “1” marks a Node as “browsable”, i.e., it is possible to query the Node’s children and their descendants individually. This allows to reduce the number of records queried during automatic data supply, since it is possible to select a subset of the total data available for this Node. 0/1; default: 0
multiple “1” means the Extension supports several instances of the Node at the same time. In this case, the Node component of the URL is addressed (with []).
If the Object type of the Node has no addressable Property, then WinGuard will automatically add one.
0/1; default: 0
object Symbol Path. References the Object usable as a Node. References are always made to the type of the Object.

<Objects>

Container with a list of <Object> definitions.

The Objects can be defined flat here with specification of their full type, however, a hierarchical definition with use of automatic type generation (→ <Object>) is recommended.

The Objects on the upper level are visible if they are entered as Nodes in the <Nodes> element, referenced by other Objects or if there are no Nodes available.

No matter how Objects are defined, the result of the evaluation always has to be a list of Objects with a unique type.

When nesting <Object> definitions it is important to use distinctly named addressing Properties for the descendant <Object> definitions. Otherwise they cannot be uniquely addressed. For example:

<Object id="VideoRecorder">
	<Property id="Id" type="int" address="1" />
	<Object id="Camera">
		<Property id="CamId" type="int" address="1" />
	</Object>
</Object>

If the addressing Property of the Object “Camera” was also called “Id”, it wouldn’t be uniquely addressable because “Id” is already used for addressing the “VideoRecorder” Object.

<Object>

Defines an Object type. The type is either specified explicitly or derived from the ID (see below).

Description Remarks
id Symbol. Defines the URL entry for this Object.

Indirectly defines the type together with the parent Object IDs, separated by a point (.) (Automatic type generation).
“activity”, “incident” and “operation” are not allowed as ID for Node Objects
type (optional) Symbol Path. Defines the type directly. If not set, the ID as well as the IDs of the parent Objects are used to generate the type.
If type="" is set, this Object cannot be instantiated by WinGuard.
name Display name Default [obj.<id>]
ref Symbol Path. Defines the type directly. The definition is made elsewhere and is only referenced here. No deviating definitions can be made for the Object.
extends Symbol Path. Takes the definitions of the referenced Object as a base for Extension (similar to inheritance in programming languages).

Properties, States and Events with the same ID as in the base Object cannot be defined in the derived Object.
exclude If exclude=“1” is set, this Object cannot be instantiated by WinGuard. Can be used to hide Objects that are intended as a base for other Objects, or to hide Objects that were inherited. 0/1; default: 0
nostatesync ≥ext.adapter 0.1.6 Indicates whether Objects of this type do not synchronize their States with WinGuard.
If this option is enabled (value = 1), the associated App State is not implicitly set to “unknown”.
0/1; default: 0
desc Semantic description of the Object.
<App>… Definitions for the application (WinGuard) with regard to how to handle this Object.

💡Direct integration of the definitions here is possible as an alternative to the definition in the separate App XML.
<Property>… Any Properties
<State>… Any States
<Event>… Any Events
<Operation>… Any Operations
<Activity>… Any Activity assignments
<Object>… Any subordinate Objects
<ObjectType>… Any alternative Object types at this address Node

For “extends” and “ref” the referenced Object must be addressed with its full id:

<Object id="Parent">
	<Object id="Base">
		<Property id="Address" type="int" address="1" />
	</Object>
	<Object id="Extension" extends="Parent.Base">
		<Property id="MyProp" />
	</Object>
</Object>

<ObjectType>

Defines an alternative type for the address Node of the enclosing Object. All Properties, mapping and the addressing are used from the enclosing Object. Properties, States, Events, Operations and other elements with the same ID as in the base Object cannot be defined in the derived Object.

Description
id (optional) Symbol. If set, is used for type generation like in <Object>.
type (optional) Symbol Path. Like <Object>, but it is mandatory to either specify “id” or “type”.
… Everything else is identical with an <Object> definition, except “ref” and “extends”, which can not be used in ObjectTypes.

<Property>

Defines a Property for the Object.

Description Remarks
id (mandatory) Symbol. Identifies the Property uniquely within the parent element. Must not use the same ID as a State or Event of the same Object type. “event” is not allowed as ID
name Display name Default: “[prop.<id>]”
type (mandatory) Value type. If address=“1” is set, must be one of “int”, “string” or “guid”.
address (Object only) The Property is used for addressing the Object. When this is set the Property becomes mandatory. 0/1; default: 0
kind Explanation for type indication, for Objects e.g., their type.
minval Minimum value for number types.
maxval Maximum value for number types.
maxlen Maximum length for string types.
optional The Property becomes visible only upon explicit user request, such as clicking a designated button in the UI. If the Property is nested directly inside an Operation, this flag should not be used. 0/1; default: 0
readonly The Property cannot be written directly via the API. 0/1; default: 0
available The Property is only available under the described condition. The syntax is defined in Expressions.
exclude If exclude=“1” is set, this Property is considered as not defined. Can be used to hide Properties that were inherited. 0/1; default: 0
default (Default) Value of the Properties, mainly used for Setting Properties.
ref Symbol Path. References a fully-qualified Object type. This is used to be able to assign another Object’s URL to this Property, e.g., to assign a sensor to an area. Must use “string” as Property type as it only works with URLs.
desc Semantic description of the Property. Default: “[prop.<id>.desc]”
<Option>… Defines a possible value of an enum Property.
<Param>… Additional parameters as key-value pairs to specify attributes, e.g., to describe a “hint”.
<Property>… Defines a nested Property, that consists of multiple Property entries.

<State>

Defines a State for the Object.

Description Remarks
id (mandatory) Symbol. Identifies the State uniquely within the Object. Must not use the same ID as a Property or Event of the same Object type. “event” is not allowed as ID
name Display name Default: “[state.<id>]”
type (mandatory) Value type
minval Minimum value for number types.
maxval Maximum value for number types.
unit Displayed unit of the value for number types. e.g., “°C”, “bar”, “kg”, etc.
exclude If exclude=“1” is set, this Property is considered as not defined. Can be used to hide States that were inherited. 0/1; default: 0
desc Semantic description of the State. Default: “[state.<id>.desc]”
<Option>… Defines a possible value of an enum Property.

<Option>

Defines a possible value of an enum Property/State.

Description Remarks
id (mandatory) Symbol. Identifies the option uniquely within the parent element.
name Display Name Default: “[<parenttype>.<parentid>.<optionid>]”
value A value indication
desc Semantic description of the option. Default: “[<parenttype>.<parentid>.<optionid>.desc]”

<Event>

Defines an Event for the Object.

Description Remarks
id (mandatory) Symbol. Declares the Event type. Unique within the parent element. Must not use the same ID as a Property or State of the same Object type.
name Display name Default: “[event.<id>]”
reset Short form for definition of the “Reset” Event Operation. Alternatively, the “Reset” Operation can be explicitly listed in the Event. 0/1; default: 0
ack Short form for definition of the “Ack” Event Operation. Alternatively, the “Ack” Operation can be explicitly listed in the Event. 0/1; default: 0
soundoff Short form for definition of the “SoundOff” Event Operation. Alternatively, the “SoundOff” Operation can be explicitly listed in the Event. 0/1; default: 0
notification Marks the Event as a notification, i.e., an one-time Event. 0/1; default: 0
extends Symbol. The definitions of the referenced Event are completely taken as basis for the definition of this Event and can be extended on this basis.
exclude If exclude=“1” is set, this Event is considered as not defined. Can be used to hide Events that are intended as a base for other Events, or to hide Events that were inherited. 0/1; default: 0
desc Semantic description of the Event. Default: “[event.<id>.desc]”
<Property>… Optional Properties of the Event.
<Operation>… Optional Operations executed in context of the Event.

<Property>

Description Remarks
id (mandatory) Symbol. Identifies the Property uniquely within the parent element.
type (mandatory) Value type
kind Specification regarding the type, mostly a mime type e.g., “image/jpeg”. Mandatory for type “data”.

Can also be used to specify the formatting for Properties of type “time” (see Kind).
resource The Property is a resource. 0/1; default: 0
desc Semantic description of the Property. Default: “[desc.<id>]”
<Option>… Defines a possible value of an enum Property.

<Operation>

Defines an Operation for the Object.

Description Remarks
id (mandatory) Symbol Path. Identifies the Operation uniquely within the Object.
name Display Name Default: “[op.<id>]”
exclude If exclude=“1” is set, this Operation is considered as not defined. Can be used to hide Operations that were inherited.
available The Operation is only available under the described condition. The syntax is defined in Expressions.
desc Semantic description of the Operation. Default: “[op.<id>.desc]”
local This Setting is only relevant for Extensions that can also run locally on multiple stations (“multistation” trait). If local=“1” is set, Operations that were triggered on a client station will be executed locally on the station. Otherwise the Operation will always be executed remotely on the designated server station. 0/1; default: 0
<Property>… Optional Properties of the Operation.
<Result>… ≥ext.adapter 0.1.12 Optional Result of the Operation

<Result> ≥ext.adapter 0.1.12

Defines a Result for the operation which is then displayed in a specific content view as HTML. The title of the content view is the name of the operation. The Properties define how the Result is displayed. Only one level of nesting Object Properties is allowed.

The values for the Properties are provided as an object in the Operation result. The object structure must match the structure defined in the Result Property definition.

Description
<Property>… A Property

Example:

Definition:
<Result>
	<Property id="LastTransactions" type="object[]" name="Last Transactions">
		<Property id="TransactionId" type="int" />
		<Property id="Time" type="time" kind="date" />
		<Property id="Fee" type="int" />
	</Property>
    <Property id="CurrentTicket" type="object">
		<Property id="TicketId" type="int" />
		<Property id="TicketOwner" type="string" />
	</Property>
	<Property id="ParkingTime" type="int" kind="timespan" />
</Result>
Values:
{
  "result": {
    "Props": {
      "ParkingTime": 443,
      "CurrentTicket": {
        "TicketId": 123,
        "TicketOwner": "Whoever"
      },
      "LastTransactions": [
        {
          "TransactionId": 2,
          "Time": "2025-08-28T13:41:18.713Z",
          "Fee": 100
        },
        {
          "TransactionId": 5,
          "Time": "2025-08-29T13:41:18.713Z",
          "Fee": 102
        },
        {
          "TransactionId": 8,
          "Time": "2025-08-30T13:41:18.713Z",
          "Fee": 104
        }
      ]
    }
  }
}

<Property>

Defines a Property for the Result Object.

Description
id (mandatory) Symbol. Identifies the Property uniquely within the parent element.
name Optional display name
type (mandatory) Value type
kind Optional explanation for type indication, for Objects, e.g., their type
<Property>… Defines a nested Property, that consists of multiple Property entries.

<Activity>

Defines an Activity possibility for the Object.

Description
id Symbol. Uniquely identifies the Activity. The Activity has to be defined in the section <Activities>.
role Symbol. Marks the roles that the Object can assume with regard to the Activity.
available The Activity is only available under the described condition. The syntax is defined in Expressions.
exclude If exclude=“1” is set, this Activity is considered as not defined. Can be used to hide Activities that were inherited.

<Activities>

Container with a list of <Activity> Definitions.

<Activity>

Defines an Activity. The indicated ID is the type of Activity. The LNG ID of the type is [activity.<id>].

Description Remarks
id Symbol. ID of an Activity
type Symbol Path. One of the 4 pre-defined WG Activity types (showvideo, showvideoexternal, call, playaudio).
extends Symbol. The definitions of the indicated Activity are taken completely as basis for the definition of this Activity and can be extended on this basis.
exclude If exclude=“1” is set, this definition of an Activity can only be used as a basis for other Activities. 0/1; default: 0
name Display name
desc Semantic description of the Activity
<App>… Definitions for the application with regard to how to handle this Activity.

💡Direct integration of the definitions here is possible as an alternative to the definition in the separate App XML.
<ObjectRole>… Any role
<Property>… Any Property
<Operation>… Any Operation

<ObjectRole>

Defines a role with which an Object can be a participant of the Activity.

For <ObjectRole>, Property and State definitions are interchangeable (the API uses the same collection to transmit both Properties and States). The only difference is that you can only declare App XML mappings for State definitions.

Description Remarks
id Symbol. ID of the role
extends Symbol. The definitions of the specified role are taken entirely as the basis of the definition of this role and can be extended based on that.
exclude If exclude=“1” is set, this definition of a role can only be used as a basis for other roles. 0/1; default: 0
multiple Specifies that there can be multiple participants with this role in this Activity. By default, only one Object is allowed per role. 0/1; default: 0
name Display name Default: “[objrole.<id>]”
desc Semantic description of the role. Default: “[objrole.<id>.desc]”
<App>… Definitions for the application with regard to how to handle Objects with this role.

💡Direct inclusion of the definitions here is possible as an alternative to the definition in the separate App XML.
<Property>… Any Property
<State>… Any State

<Property>

Defines a Property for the Activity.

Description Remarks
id (mandatory) Symbol. Identifies the Property uniquely within the Activity.
name Display name Default: “[prop.<id>]”
type (mandatory) Value type
minval Minimum value for number types.
maxval Maximum value for number types.
maxlen Maximum length for string types.
exclude If exclude=“1” is set, this Property is considered as not defined. Can be used to hide Properties that were inherited. 0/1; default: 0
desc Semantic description of the Property. Default: “[prop.<id>.desc]”
<Option>… Defines a possible value of an enum Property.

<Operation>

Defines an Operation for the Activity.

Description Remarks
id (mandatory) Symbol Path. Identifies the Operation uniquely within the Activity.
name Display name Default: “[op.<id>]”
exclude If exclude=“1” is set, this Operation is considered as not defined. Can be used to hide Operations that were inherited. 0/1; default: 0
available The Operation is only available under the described condition. The syntax is defined in Expressions. Only supported for call Activities
desc Semantic description of the Operation. Default: “[op.<id>.desc]”
<Property>… Optional Properties of the Operation.

<Incident>

Defines an Incident.

Description
<App>… Definitions for the application with regard to how to handle this Incident.

💡Direct integration of the definitions here is possible as an alternative to the definition in the separate App XML.
<Property>… Symbol. Any Property
<Create>… Container with a list of Properties that are sent to the adapter when calling incident.Create
<Operation>… Optional Operations executed in context of the Incident.

<Property>

Defines a Property for the Incident.

Description
id (mandatory) Symbol. Identifies the Property uniquely within the Incident.
type (mandatory) Value type

<Create>

Description
<Property>… A Property that is sent to the adapter when calling incident.Create

<Property>

Description
id (mandatory) Symbol. Identifies the Property that is sent to the adapter when calling incident.Create
type (mandatory) Value type

<Operation>

Defines an Operation for the Incident.

Description Remarks
id (mandatory) Symbol Path. Identifies the Operation uniquely within the Incident.
name Display name Default: “[op.<id>]”
available The Operation is only available under the described condition. The syntax is defined in Expressions.
desc Semantic description of the Operation. Default: “[op.<id>.desc]”
<Property>… Optional Properties of the Operation.

<Forms>

Container with a list of <Form> definitions.

<Form>

Description Remarks
id Symbol. Identifies the kind of the form. “Settings”: Defines which Properties are available in the Extension Settings.
“DataSupply”: Defines additional Properties which can be provided for automatic data supply.
“Log”: Defines Properties to filter log entries.
<PropertyGroup>… Property groups of the form.
<Property>… Properties of the form. Defining a Property here is equivalent as defining it with id “default” in <PropertyGroup>.

In case the id is set to “Settings”, it is suggested to only reference to Settings from <Settings> instead of defining them here. In case the id is set to “Log”, it is suggested to only reference to Properties from <Event> instead of defining them here.

<PropertyGroup>

Description Remarks
id Symbol. Identifies the group uniquely within the form. “group_…”
name Display name Default: “[group_<id>]”
orderby Arrangement of the Properties in the group. “id” / “name” / “sequence”
available Expression string
desc Semantic description of the group. Default: “[group_<id>.desc]”
<Property>… Properties of the group.

A PropertyGroup is represented via the API as Property with the type group.

<Property>

Description Remarks
id (mandatory) Symbol. Uniquely identifies the Property.
name Display name Default: “[prop.<id>]”
type Value type, optional when referencing an already defined property.
kind Explanation for type value, for Objects for example their type.
ref Explanation for type value (mostly GUID). This is a reference to a data type.
minval Minimum value for number types.
maxval Maximum value for number types.
maxlen Maximum length for string types.
runtime Property is non-persistent. 0/1; default: 0
readonly Property cannot be written directly via the API. 0/1; default: 0
optional The Property is only displayed upon request for entry. 0/1; default: 0
available The Property is only available under the described conditions. See Expressions.
desc Semantic description of the Property. Default: “[prop.<id>.desc]”
<Options>… Container for <Option>s. Defines the selection for entry and at the same time also the value display. Only one option can be selected.
<Flags>… Container for <Flag>s. Defines the selection of flags for entry of integer types. Several flags can be selected at the same time.
<Properties>… Container for <Property>s. For implicit definition of Object types.

Samples

Module XML Outline

<ModuleDef>
	<Settings>
		<Setting id="" type="" value="" >
			<Option id="" value="" />
		</Setting>
	</Settings>

	<Nodes>
		<Node id="" object="" />
	</Nodes>

	<Objects>
		<Object>
			<App domain="" device="" name="" >
				<Functionality id="" />
				<Mapping>
					<State id="" appstate="" appevent="" prio="" />
					<Event id="" appstate="" appevent="" prio="" />
				</Mapping>
			</App>
			<Property id="" type="" />
			<State id="" type="" />
			<Event id="" reset="" ack="">
				<Property id="" type="" />
			</Event>
			<Operation id="">
				<Property id="" type="" />
			</Operation>
			<Object>
				<!-- ... -->
			</Object>
			<Activity id="" role="" />
		</Object>
	</Objects>

	<Activities>
		<Activity id="" type="">
			<App domain="" type="" />
			<Property id="" type="" />
			<Operation id="" />
			<ObjectRole id="" />
		</Activity>
	</Activities>

	<Incident>
		<Property id="" type="" />
		<Create>
			<Property id="" type="" />
		</Create>
		<Operation id="" />
		<Operation id="">
			<Property id="" autofill="" />
		</Operation>
	</Incident>

	<Forms>
		<Form id="">
			<PropertyGroup id="" name="">
				<Property id="" type="">
					<Option id="" value="" />
				</Property>
			</PropertyGroup>
		</Form>
	</Forms>
</ModuleDef>

DemoPanel Module XML (excerpt)

<ModuleDef>

	<Settings>
		<Setting id="Host" type="string" maxlen="256" value="localhost" />
		<Setting id="Port" type="int" value="1235" />
		<Setting id="PushResources" type="bool" value="0" />
		<Setting id="App.CanArchive" type="bool" value="1" />
		<Setting id="App.CanExportImages" type="bool" value="1" />
		<Setting id="App.CanExportVideos" type="bool" value="1" />
		<Setting id="App.CanExportVideosDirect" type="bool" value="1" />
		<Setting id="App.ExportImageExtensions" type="string[]" value="[&quot;jpg&quot;]">
			<Option id="jpg" />
		</Setting>
		<Setting id="App.ExportVideoExtensions" type="string[]" value="[&quot;mp4&quot;]">
			<Option id="mp4" />
		</Setting>
		<Setting id="App.CreateEventsForUnlinkedObjects" type="bool" value="true" />

		<Setting id="GISStartLatitude" type="double" value="54.41893" />
		<Setting id="GISEndLatitude" type="double" value="47.842658" />
		<Setting id="GISStartLongitude" type="double" value="7.250977" />
		<Setting id="GISEndLongitude" type="double" value="14.282227" />
	</Settings>

	<Nodes discoverable="1">
		<Node id="DemoPanel" object="DemoPanel" />
	</Nodes>

	<Objects>

		<!-- Global Object Types  -->

		<!-- DigitalIn -->
		<Object id="DigitalIn">
			<Property id="Number" type="int" address="1" />
			<State id="Active" type="bool" />
		</Object>

		<!-- DigitalOut -->
		<Object id="DigitalOut">
			<Property id="Number" type="int" address="1" />
			<State id="Active" type="bool" />
			<Operation id="Activate" available="state.Active!=true" />
			<Operation id="Deactivate" available="state.Active==true" />
		</Object>

		<!-- AnalogIn -->
		<Object id="AnalogIn">
			<Property id="Number" type="int" address="1" />
			<State id="Value" type="int" minval="0" maxval="65535" />
		</Object>

		<!-- AnalogOut -->
		<Object id="AnalogOut">
			<Property id="Number" type="int" address="1" />
			<State id="Value" type="int" minval="0" maxval="65535" />
			<Operation id="SetValue">
				<Property id="Value" type="double" />
			</Operation>
		</Object>

		<!-- Intercom.Station -->
		<Object id="Intercom.Station">
			<Property id="Number" type="int" address="1" />
		</Object>

		<!-- Ext Objects -->

		<!-- DemoPanel -->
		<Object id="DemoPanel">

			<Operation id="ResetAll" />

			<!-- DemoPanel.Fire -->
			<Object id="Fire" exclude="1">
				<!-- DemoPanel.Fire.Panel -->
				<Object id="Panel" >
					<Operation id="Reset" />
				</Object>

				<!-- DemoPanel.Fire.Zone -->
				<Object id="Zone" >
					<!-- Object Fire.Zone -->
					<Property id="ZoneNumber" type="int" address="1" minval="1" />

					<!-- Functionality.Off -->
					<State id="Off" type="bool" />
					<Operation id="On" available="state.Off==true" />
					<Operation id="Off" available="state.Off!=true" />

					<!-- Functionality.Revision -->
					<State id="Revision" type="bool" />
					<!-- Alle Melder sind in Revision -->
					<Operation id="EnableRevision" available="state.Revision!=true" />
					<Operation id="DisableRevision" available="state.Revision==true" />

					<!-- Functionality.Reset -->
					<Operation id="Reset" />

					<!-- DemoPanel.Fire.Zone.Sensor -->
					<Object id="Sensor" name="[obj.firesensor]">
						<!-- Object Fire.Sensor -->
						<Property id="SensorNumber" type="int" address="1" minval="1" />

						<Property id="Type" type="string" maxlen="50" />

						<Event id="Alarm" reset="1" />
						<Event id="PreAlarm" reset="1" ack="1" />
						<Event id="Warning" reset="1" />
						<Event id="RevAlarm" reset="1" />
						<Event id="Fault" />
						<Event id="RevFault" />

						<!-- Functionality.Off -->
						<State id="Off" type="bool" />
						<Operation id="On" available="state.Off==true" />
						<Operation id="Off" available="state.Off!=true" />

						<!-- Functionality.Revision -->
						<State id="Revision" type="bool" />
						<Operation id="EnableRevision" available="state.Revision!=true" />
						<Operation id="DisableRevision" available="state.Revision==true" />

						<!-- Functionality.Reset -->
						<Operation id="Reset" available="event.Alarm OR event.PreAlarm OR event.Warning OR event.RevAlarm" />
					</Object>
				</Object>

				<!-- DemoPanel.Fire.Control -->
				<Object id="Control">
					<Property id="Number" type="int" address="1" minval="1" />
					<State id="Fault" type="bool" />

					<!-- Functionality.Off -->
					<State id="Off" type="bool" />
					<Operation id="On" available="state.Off==true" />
					<Operation id="Off" available="state.Off!=true" />

					<!-- Functionality.Activate -->
					<State id="Active" type="bool" />
					<Operation id="Activate" available="state.Active!=true AND state.Fault!=true" />
					<Operation id="Deactivate" available="state.Active==true AND state.Fault!=true" />
				</Object>

				<!-- DemoPanel.Fire.Intervention -->
				<Object id="Intervention">
					<State id="Stage" type="string">
						<Option value="Reaction" />
						<Option value="Investigation" />
						<Option value="Elapsed" />
					</State>
					<Operation id="StartInvestigation" />
					<Operation id="StopInvestigation" />

					<!-- Functionality.Activate -->
					<State id="Active" type="bool" />
					<Operation id="Activate" available="state.Active!=true" />
					<Operation id="Deactivate" available="state.Active==true" />
				</Object>
			</Object>

			<!-- DemoPanel.Intrusion -->
			<Object id="Intrusion" exclude="1">

				<!-- DemoPanel.Intrusion.Panel -->
				<Object id="Panel">
					<Operation id="Reset" />
				</Object>

				<!-- DemoPanel.Intrusion.Area -->
				<Object id="Area">
					<Property id="AreaNumber" type="int" address="1" minval="1" />

					<!-- Functionality.Arm -->
					<State id="Armed" type="bool" />
					<Operation id="Arm" />
					<Operation id="Disarm" />
				</Object>

				<!-- DemoPanel.Intrusion.Sensor -->
				<Object id="Sensor" name="[obj.intrusionsensor]">
					<Property id="SensorNumber" type="int" address="1" minval="1" />
					<Property id="Area" type="string" ref="Intrusion.Area" />
					<State id="Active" type="bool" />
					<State id="Fault" type="bool" />
					<Event id="Alarm" reset="1" />

					<!-- Functionality Off -->
					<State id="Off" type="bool" />
					<Operation id="On" available="state.Off==true" />
					<Operation id="Off" available="state.Off!=true" />

					<!-- DemoPanel.Intrusion.Sensor.Panic -->
					<ObjectType id="Panic" name="[obj.panicsensor]">
						<!-- this Property does not exist for Sensor.Panic -->
						<Property id="Area" exclude="1" />
					</ObjectType>

				</Object>

			</Object>

			<!-- DemoPanel.Video -->
			<Object id="Video" exclude="1">

				<!-- DemoPanel.Video.Recorder -->
				<Object id="Recorder">
					<Property id="RecorderNumber" type="int" address="1" minval="1" />
					<State id="Fault" type="bool" />

					<!-- DemoPanel.Video.Recorder.Camera -->
					<Object id="Camera" >
						<Property id="CameraNumber" alias="KamNum" type="int" address="1" minval="1" />

						<Property id="Source" type="string" kind="file"/>
						<Property id="ImageSectionWidth" type="int"/>
						<Property id="ImageSectionHeight" type="int" />
						<Property id="ViewingAngle" type="int" minval="0" maxval="360" />

						<State id="Fault" type="bool" />
						<Event id="MotionAlarm" reset="1" />

						<!-- Functionality.Reset -->
						<Operation id="Reset" available="event.MotionAlarm"/>

						<Activity id="myshowvideo" role="Source" available="state.Fault==false" />

						<!-- DemoPanel.Video.Recorder.Camera.PTZ -->
						<ObjectType id="PTZ">
							<Property id="Presets" type="object[]" kind="cam_preset" readonly="1"/>
							<Operation id="preset" />
						</ObjectType>
					</Object>
				</Object>
			</Object>

			<!-- DemoPanel.Access -->
			<Object id="Access" exclude="1">

				<!-- DemoPanel.Access.Door -->
				<Object id="Door">
					<Property id="Number" type="int" address="1" minval="1" />
					<State id="Open" type="bool" />
					<State id="Mode" type="string">
						<Option value="Normal" />
						<!-- Temporary unlock -->
						<Option value="AllowAccess" />
						<Option value="Unlock" />
						<Option value="Block" />
					</State>

					<Event id="OpenedTooLong" />
					<Event id="ForcedOpen" />

					<!-- "Base class" for access events. Will not be used itself, therefore exclude="1" is set. -->
					<Event id="AccessEventBase" exclude="1">
						<Property id="BadgeId" type="string" />
						<Property id="FirstName" type="string" />
						<Property id="LastName" type="string" />
						<Property id="Company" type="string" />
						<Property id="EventImage" type="data" kind="image/jpeg" resource="1" />
						<Property id="StaffNumber" type="string" resource="1" />
					</Event>
					<Event id="AuthorizedAccess" extends="AccessEventBase" notification="1" />
					<Event id="AttemptForUnauthorizedAccess" extends="AccessEventBase" notification="1" />
					<Event id="DoorNotOpenedAfterAuthorization" extends="AccessEventBase" notification="1" />

					<Operation id="Normal" available="state.Mode!='Normal'" />
					<Operation id="AllowAccess" available="state.Mode=='Normal'" />
					<Operation id="Unlock" available="state.Mode!='Unlock'" />
					<Operation id="Block" available="state.Mode!='Block'"/>
				</Object>
			</Object>

			<!-- DemoPanel.Intercom -->
			<Object id="Intercom" exclude="1">

				<!-- DemoPanel.Intercom.Device -->
				<Object id="Device" name="[obj.intercom]">
					<Property id="Number" type="int" address="1" minval="1" />
					<Operation id="OpenDoor" />

					<Activity id="mycall" role="Source, Destination" />
				</Object>

				<!-- DemoPanel.Intercom.Barrier -->
				<Object id="Barrier" extends="DigitalOut" />

				<!-- DemoPanel.Intercom.Elevator -->
				<Object id="Elevator" extends="AnalogOut" />
			</Object>

			<!-- DemoPanel.PA -->
			<Object id="PA" exclude="1">

				<!-- DemoPanel.PA.AudioIn -->
				<Object id="AudioIn">
					<Property id="Number" type="int" address="1" minval="1" />

					<Activity id="myplayaudio" role="Input" />
				</Object>

				<!-- DemoPanel.PA.AudioOut -->
				<Object id="AudioOut">
					<Property id="Number" type="int" address="1" minval="1" />

					<Activity id="myplayaudio" role="Output" />
				</Object>
			</Object>

			<!-- DemoPanel.IO -->
			<Object id="IO" exclude="1">

				<!-- DemoPanel.IO.Light -->
				<Object id="Light" type="DemoPanel.DigitalOut.Light" >
					<Property id="Number" type="int" address="1" minval="1" />

					<!-- Functionality.Activate -->
					<State id="Active" type="bool" />
					<Operation id="Activate" available="state.Active==false" />
					<Operation id="Deactivate" available="state.Active==true" />
				</Object>

				<!-- DemoPanel.IO.DigitalIn -->
				<Object id="DigitalIn" extends="DigitalIn" />

				<!-- DemoPanel.IO.DigitalOut -->
				<Object id="DigitalOut" extends="DigitalOut" />
			</Object>

			<!-- DemoPanel.Values -->
			<Object id="Values" exclude="1">

				<!-- DemoPanel.Values.AnalogIn -->
				<Object id="AnalogIn" extends="AnalogIn">
					<Property id="info" type="string" />
				</Object>

				<!-- DemoPanel.Values.AnalogOut-->
				<Object id="AnalogOut">
					<Property id="Number" type="int" address="1"/>
					<Operation id="SetValue">
						<Property id="Value" type="double" />
					</Operation>
					<State id="Value" type="double" minval="0" maxval="65535" />
				</Object>

				<!-- DemoPanel.Values.MultiValueObject -->
				<Object id="MultiValueObject">
					<Property id="Number" type="int" address="1"/>
					<State id="Temperature" type="double" minval="0" maxval="100" unit="°C" />
					<State id="Pressure" type="double" minval="0" maxval="8" unit="bar" />
					<State id="WindDirection" type="double" minval="0" maxval="360" unit="°" />
				</Object>
			</Object>
		</Object>
	</Objects>

	<Activities>
		<!-- Play audio -->
		<Activity id="myplayaudio" type="playaudio">
			<Property id="Id" type="string" />
			<Property id="StartTime" type="time" />
			<Property id="Prio" type="int" />
			<Property id="Delay" type="int" />
			<Property id="AllowPartial" type="bool" />
			<Property id="Cyclic" type="bool" />
			<Property id="GenericParam" type="string" />
			<Property id="State" type="int">
				<Option id="Invalid" value="0" />
				<Option id="Suspended" value="1" />
				<Option id="Partial" value="2" />
				<Option id="Full" value="3" />
				<Option id="Ended" value="4" />
			</Property>

			<ObjectRole id="Input" multiple="1" />
			<ObjectRole id="Output" multiple="1" />
		</Activity>
	</Activities>

	<Incident>
		<Property id="prop1" type="string" />
		<Property id="prop2" type="int" />
		<Create>
			<Property id="eventid" type="string" />
			<Property id="url" type="string" />
		</Create>
		<Operation id="close" />
		<Operation id="custom">
			<Property id="myProp" />
		</Operation>
	</Incident>

	<Forms>
		<Form id="Settings">
			<PropertyGroup id="Connection">
				<Property id="Host" />
				<Property id="Port" />
			</PropertyGroup>
			<PropertyGroup id="Locating">
				<Property id="GISStartLatitude" />
				<Property id="GISEndLatitude" />
				<Property id="GISStartLongitude" />
				<Property id="GISEndLongitude" />
			</PropertyGroup>
			<PropertyGroup id="Other" orderby="sequence" >
				<Property id="PushResources" />
			</PropertyGroup>
		</Form>

		<Form id="Log">
			<Property id="BadgeId" name="Badge Id" type="string" maxlen="3" />
			<Property id="FirstName" name="[dict.misc.Firstname]" type="string" maxlen="256" />
			<Property id="LastName" name="[dict.misc.Lastname]" type="string" maxlen="256" />
			<Property id="Company" name="[dict.com.Company]" type="string" maxlen="256" />
		</Form>
	</Forms>
</ModuleDef>

Nested Properties

A nested Property is a Property that defines additional Properties inside. The UI will combine them as an editable unit.

For example, when defining a single Object that contains nested Properties:

...
    <Property id="Coordinate" type="object">
        <Property id="x" type="double" />
        <Property id="y" type="double" />
        <Property id="z" type="double" />
        <Property id="relative" type="bool" />
    </Property>
...

Or, when defining a map of Objects that contain nested Properties:

...
    <Property id="Coordinate" type="object{}">
        <Property id="x" type="double" />
        <Property id="y" type="double" />
        <Property id="z" type="double" />
        <Property id="relative" type="bool" />
    </Property>
...

UI Result

When defining a single Object: Nested Property sample

When defining a map of Objects: Nested Property map sample

Last modified September 25, 2026