﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ComSimXmppIoT"
           targetNamespace="http://lab.tagroot.io/Schema/ComSim/XMPPIoT.xsd"
           elementFormDefault="qualified"
           xmlns="http://lab.tagroot.io/Schema/ComSim/XMPPIoT.xsd"
           xmlns:mstns="http://lab.tagroot.io/Schema/ComSim/XMPPIoT.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:cs="http://lab.tagroot.io/Schema/ComSim.xsd"
           xmlns:xmpp="http://lab.tagroot.io/Schema/ComSim/XMPP.xsd">

	<xs:import namespace="http://lab.tagroot.io/Schema/ComSim.xsd"/>
	<xs:import namespace="http://lab.tagroot.io/Schema/ComSim/XMPP.xsd"/>

	<xs:element name="ProvisioningClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension">
					<xs:attribute name="componentAddress" type="xs:string" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ThingRegistryClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension">
					<xs:attribute name="componentAddress" type="xs:string" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="SensorClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="SensorServerExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ControlClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ControlServerExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ConcentratorClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ConcentratorServerExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="SynchronizationClientExtension">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="xmpp:XmppExtension"/>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ReportFields">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="cs:ActivityNode">
					<xs:group ref="FieldTypes" minOccurs="0" maxOccurs="unbounded"/>
					<xs:attribute name="eventArgs" type="xs:string" use="optional" default="e"/>
					<xs:attribute name="more" type="xs:boolean" use="optional" default="false"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="NewMomentaryValues">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="cs:ActivityNode">
					<xs:group ref="FieldTypes" minOccurs="0" maxOccurs="unbounded"/>
					<xs:attribute name="sensor" type="xs:string" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:group name="FieldTypes">
		<xs:choice>
			<xs:element name="BooleanField" type="BooleanField"/>
			<xs:element name="DateField" type="DateField"/>
			<xs:element name="DateTimeField" type="DateTimeField"/>
			<xs:element name="DurationField" type="DurationField"/>
			<xs:element name="EnumField" type="EnumField"/>
			<xs:element name="Int32Field" type="Int32Field"/>
			<xs:element name="Int64Field" type="Int64Field"/>
			<xs:element name="QuantityField" type="QuantityField"/>
			<xs:element name="StringField" type="StringField"/>
			<xs:element name="TimeField" type="TimeField"/>
		</xs:choice>
	</xs:group>

	<xs:complexType name="NodeReference">
		<xs:attribute name="source" type="xs:string" use="optional"/>
		<xs:attribute name="partition" type="xs:string" use="optional"/>
		<xs:attribute name="node" type="xs:string" use="optional"/>
	</xs:complexType>

	<xs:complexType name="Field" abstract="true">
		<xs:complexContent>
			<xs:extension base="NodeReference">
				<xs:choice minOccurs="1" maxOccurs="1">
					<xs:group ref="cs:Value"/>
				</xs:choice>
				<xs:attribute name="name" type="xs:string" use="required"/>
				<xs:attribute name="type" type="FieldType" use="optional" default="Momentary"/>
				<xs:attribute name="qos" type="FieldQoS" use="optional" default="AutomaticReadout"/>
				<xs:attribute name="writable" type="xs:boolean" use="optional" default="false"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:simpleType name="FieldType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Momentary"/>
			<xs:enumeration value="Identity"/>
			<xs:enumeration value="Status"/>
			<xs:enumeration value="Computed"/>
			<xs:enumeration value="Peak"/>
			<xs:enumeration value="Historical"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="FieldQoS">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Missing"/>
			<xs:enumeration value="InProgress"/>
			<xs:enumeration value="AutomaticEstimate"/>
			<xs:enumeration value="ManualEstimate"/>
			<xs:enumeration value="ManualReadout"/>
			<xs:enumeration value="AutomaticReadout"/>
			<xs:enumeration value="TimeOffset"/>
			<xs:enumeration value="Warning"/>
			<xs:enumeration value="Error"/>
			<xs:enumeration value="Signed"/>
			<xs:enumeration value="Invoiced"/>
			<xs:enumeration value="EndOfSeries"/>
			<xs:enumeration value="PowerFailure"/>
			<xs:enumeration value="InvoiceConfirmed"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="BooleanField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="DateField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="DateTimeField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="DurationField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="EnumField">
		<xs:complexContent>
			<xs:extension base="Field">
				<xs:attribute name="enumType" type="xs:string" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="Int32Field">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="Int64Field">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="QuantityField">
		<xs:complexContent>
			<xs:extension base="Field">
				<xs:attribute name="unit" type="xs:string" use="required"/>
				<xs:attribute name="nrDecimals" type="NrDecimals" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:simpleType name="NrDecimals">
		<xs:restriction base="xs:nonNegativeInteger">
			<xs:maxInclusive value="15"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="StringField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="TimeField">
		<xs:complexContent>
			<xs:extension base="Field">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:element name="ReadSensor">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="cs:ActivityNode">
					<xs:sequence>
						<xs:element name="FieldType" type="FieldType" minOccurs="1" maxOccurs="unbounded"/>
						<xs:element name="NodeReference" type="NodeReference" minOccurs="0" maxOccurs="unbounded"/>
						<xs:element name="FieldReference" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
					</xs:sequence>
					<xs:attribute name="actor" type="xs:string" use="required"/>
					<xs:attribute name="to" type="xs:string" use="required"/>
					<xs:attribute name="responseVariable" type="xs:string" use="required"/>
					<xs:attribute name="responseType" type="SensorDataResponseType" use="optional" default="Object"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:simpleType name="SensorDataResponseType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Array"/>
			<xs:enumeration value="Object"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:group name="ControlParameterTypes">
		<xs:choice>
			<xs:element ref="BooleanControlParameter"/>
			<xs:element ref="ColorControlParameter"/>
			<xs:element ref="DateControlParameter"/>
			<xs:element ref="DateTimeControlParameter"/>
			<xs:element ref="DoubleControlParameter"/>
			<xs:element ref="DurationControlParameter"/>
			<xs:element ref="EnumControlParameter"/>
			<xs:element ref="Int32ControlParameter"/>
			<xs:element ref="Int64ControlParameter"/>
			<xs:element ref="MultiLineTextControlParameter"/>
			<xs:element ref="StringControlParameter"/>
			<xs:element ref="TimeControlParameter"/>
		</xs:choice>
	</xs:group>

	<xs:complexType name="ControlParameter" abstract="true">
		<xs:complexContent>
			<xs:extension base="NodeReference">
				<xs:choice minOccurs="1" maxOccurs="1">
					<xs:group ref="cs:Value"/>
				</xs:choice>
				<xs:attribute name="name" type="xs:string" use="required"/>
				<xs:attribute name="page" type="xs:string" use="optional"/>
				<xs:attribute name="label" type="xs:string" use="required"/>
				<xs:attribute name="description" type="xs:string" use="optional"/>
				<xs:attribute name="setEvent" type="xs:string" use="required"/>
				<xs:attribute name="variable" type="xs:string" use="required"/>
				<xs:attribute name="actor" type="xs:string" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:element name="BooleanControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ColorControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="DateControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:date" use="optional"/>
					<xs:attribute name="max" type="xs:date" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="DateTimeControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:dateTime" use="optional"/>
					<xs:attribute name="max" type="xs:dateTime" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="DoubleControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:double" use="optional"/>
					<xs:attribute name="max" type="xs:double" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="DurationControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:duration" use="optional"/>
					<xs:attribute name="max" type="xs:duration" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="EnumControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:sequence>
						<xs:element name="Label" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
					</xs:sequence>
					<xs:attribute name="enumType" type="xs:string" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="Int32ControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:int" use="optional"/>
					<xs:attribute name="max" type="xs:int" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="Int64ControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:long" use="optional"/>
					<xs:attribute name="max" type="xs:long" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="MultiLineTextControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="regularExpression" type="xs:string" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="StringControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:sequence>
						<xs:element name="Option" minOccurs="0" maxOccurs="unbounded">
							<xs:complexType>
								<xs:simpleContent>
									<xs:extension base="xs:string">
										<xs:attribute name="label" type="xs:string" use="optional"/>
									</xs:extension>
								</xs:simpleContent>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
					<xs:attribute name="regularExpression" type="xs:string" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="TimeControlParameter">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="ControlParameter">
					<xs:attribute name="min" type="xs:time" use="optional"/>
					<xs:attribute name="max" type="xs:time" use="optional"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

	<xs:element name="ControlActuator">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="cs:ActivityNode">
					<xs:sequence>
						<xs:group ref="cs:Value" minOccurs="1" maxOccurs="1"/>
						<xs:element name="NodeReference" type="NodeReference" minOccurs="0" maxOccurs="unbounded"/>
					</xs:sequence>
					<xs:attribute name="to" type="xs:string" use="required"/>
					<xs:attribute name="parameter" type="xs:string" use="required"/>
					<xs:attribute name="controller" type="xs:string" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>

</xs:schema>
